aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2023-03-29 14:24:12 +0100
committerPhilip Herron <philip.herron@embecosm.com>2023-03-30 16:52:24 +0000
commit3cc5c9360c9454f7aa20717b6cfcc7085836233b (patch)
tree2399888e30b72e0065f94c514bcfc8ac825a3a18
parentefc3154162fff62d71859ef7d30a5a1ff1a4ba53 (diff)
downloadgcc-3cc5c9360c9454f7aa20717b6cfcc7085836233b.zip
gcc-3cc5c9360c9454f7aa20717b6cfcc7085836233b.tar.gz
gcc-3cc5c9360c9454f7aa20717b6cfcc7085836233b.tar.bz2
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 <herron.philip@googlemail.com>
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.cc62
1 files changed, 46 insertions, 16 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc
index de863a0..0605acc 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<AST::Pattern> (nullptr));
-
- std::vector<std::unique_ptr<AST::TypePathSegment>> segments;
- segments.push_back (std::unique_ptr<AST::TypePathSegment> (
- 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<std::unique_ptr<AST::TypePathSegment>> segments;
+ segments.push_back (std::unique_ptr<AST::TypePathSegment> (
+ 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<PatternBinding> bindings
= {PatternBinding (PatternBoundCtx::Product, std::set<Identifier> ())};
@@ -636,16 +651,31 @@ ResolveItem::visit (AST::Method &method)
self_param.get_has_ref (),
self_param.get_is_mut (),
std::unique_ptr<AST::Pattern> (nullptr));
-
- std::vector<std::unique_ptr<AST::TypePathSegment>> segments;
- segments.push_back (std::unique_ptr<AST::TypePathSegment> (
- 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<std::unique_ptr<AST::TypePathSegment>> segments;
+ segments.push_back (std::unique_ptr<AST::TypePathSegment> (
+ 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<PatternBinding> bindings
= {PatternBinding (PatternBoundCtx::Product, std::set<Identifier> ())};