diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-03-29 14:24:12 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-30 16:52:24 +0000 |
commit | 3cc5c9360c9454f7aa20717b6cfcc7085836233b (patch) | |
tree | 2399888e30b72e0065f94c514bcfc8ac825a3a18 /gcc | |
parent | efc3154162fff62d71859ef7d30a5a1ff1a4ba53 (diff) | |
download | gcc-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>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-item.cc | 62 |
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> ())}; |