From 299a2459663eeee17adebb4de9aba44e7014d775 Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Wed, 29 Mar 2023 14:24:12 +0100 Subject: gccrs: add missing name resolution to self params with specified types In rust it is possible to write method where you explicitly specify the type of a self param. It does not however allow for you to use reference destructuring in this senario. gcc/rust/ChangeLog: * resolve/rust-ast-resolve-item.cc (ResolveTraitItems::visit): add name resolution self param (ResolveItem::visit): likewise Signed-off-by: Philip Herron --- gcc/rust/resolve/rust-ast-resolve-item.cc | 62 +++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 16 deletions(-) (limited to 'gcc') diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc index c1590ca..a73c9ee 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.cc +++ b/gcc/rust/resolve/rust-ast-resolve-item.cc @@ -138,16 +138,31 @@ ResolveTraitItems::visit (AST::TraitItemMethod &func) self_param.get_has_ref (), self_param.get_is_mut (), std::unique_ptr (nullptr)); - - std::vector> segments; - segments.push_back (std::unique_ptr ( - new AST::TypePathSegment ("Self", false, self_param.get_locus ()))); - - AST::TypePath self_type_path (std::move (segments), self_param.get_locus ()); - - ResolveType::go (&self_type_path); PatternDeclaration::go (&self_pattern, Rib::ItemType::Param); + if (self_param.has_type ()) + { + if (self_param.get_has_ref ()) + { + // FIXME is this true? + rust_error_at ( + self_param.get_locus (), + "it is not possible to mark self as reference and specify type"); + } + ResolveType::go (self_param.get_type ().get ()); + } + else + { + // here we implicitly make self have a type path of Self + std::vector> segments; + segments.push_back (std::unique_ptr ( + new AST::TypePathSegment ("Self", false, self_param.get_locus ()))); + + AST::TypePath self_type_path (std::move (segments), + self_param.get_locus ()); + ResolveType::go (&self_type_path); + } + std::vector bindings = {PatternBinding (PatternBoundCtx::Product, std::set ())}; @@ -636,16 +651,31 @@ ResolveItem::visit (AST::Method &method) self_param.get_has_ref (), self_param.get_is_mut (), std::unique_ptr (nullptr)); - - std::vector> segments; - segments.push_back (std::unique_ptr ( - new AST::TypePathSegment ("Self", false, self_param.get_locus ()))); - - AST::TypePath self_type_path (std::move (segments), self_param.get_locus ()); - - ResolveType::go (&self_type_path); PatternDeclaration::go (&self_pattern, Rib::ItemType::Param); + if (self_param.has_type ()) + { + if (self_param.get_has_ref ()) + { + // FIXME is this true? + rust_error_at ( + self_param.get_locus (), + "it is not possible to mark self as reference and specify type"); + } + ResolveType::go (self_param.get_type ().get ()); + } + else + { + // here we implicitly make self have a type path of Self + std::vector> segments; + segments.push_back (std::unique_ptr ( + new AST::TypePathSegment ("Self", false, self_param.get_locus ()))); + + AST::TypePath self_type_path (std::move (segments), + self_param.get_locus ()); + ResolveType::go (&self_type_path); + } + std::vector bindings = {PatternBinding (PatternBoundCtx::Product, std::set ())}; -- cgit v1.1