From: Philip Herron Date: Wed, 29 Mar 2023 13:24:12 +0000 (+0100) Subject: gccrs: add missing name resolution to self params with specified types X-Git-Tag: basepoints/gcc-15~2704 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=299a2459663eeee17adebb4de9aba44e7014d775;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc index c1590ca3a2fd..a73c9ee3ecee 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 ())};