diff options
author | Mahmoud Mohamed <mahadelr19@gmail.com> | 2023-03-13 17:18:11 +0300 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-15 11:14:06 +0000 |
commit | bed6308e5e5201f409b041ca5e712d1ed8839195 (patch) | |
tree | 6942925354d10bc41582450b190be07b57a8e2bb /gcc/rust/resolve/rust-ast-resolve-expr.cc | |
parent | fc0addd1ffae33478cfc838f93e6685c0cbfa08c (diff) | |
download | gcc-bed6308e5e5201f409b041ca5e712d1ed8839195.zip gcc-bed6308e5e5201f409b041ca5e712d1ed8839195.tar.gz gcc-bed6308e5e5201f409b041ca5e712d1ed8839195.tar.bz2 |
resolve: Handle multiple bindings to the same identifier
https://github.com/rust-lang/rust/blob/master/compiler/rustc_resolve/src/late.rs#L3168
This commit follows rustc's implementation of handling multiple bindings
to the same identifier in parameters.
gcc/rust/ChangeLog:
* resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit) :declare and
pass bindings to PatternDeclaration::go.
(ResolveExpr::resolve_closure_param): Likewise.
* resolve/rust-ast-resolve-expr.h: Likewise.
* resolve/rust-ast-resolve-item.cc (ResolveTraitItems::visit): Likewise.
(ResolveItem::visit): Likewise.
* resolve/rust-ast-resolve-pattern.cc (PatternDeclaration::go): Likewise.
(PatternDeclaration::visit): check for previous identifier bindings
before inserting the new one.
* resolve/rust-ast-resolve-pattern.h (enum PatternBoundCtx): New enum.
* resolve/rust-ast-resolve-stmt.h: pass bindings to PatterDeclaration::go.
gcc/testsuite/ChangeLog:
* rust/compile/multiple_bindings1.rs: New test.
Signed-off-by: Mahmoud Mohamed <mahadelr19@gmail.com>
Diffstat (limited to 'gcc/rust/resolve/rust-ast-resolve-expr.cc')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-expr.cc | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.cc b/gcc/rust/resolve/rust-ast-resolve-expr.cc index 4dfc083..ff9f7ef 100644 --- a/gcc/rust/resolve/rust-ast-resolve-expr.cc +++ b/gcc/rust/resolve/rust-ast-resolve-expr.cc @@ -207,9 +207,14 @@ ResolveExpr::visit (AST::IfLetExpr &expr) resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); + // FIXME: this declaration should be removed after refactoring + // parse_match_arm_patterns output into an AltPattern + std::vector<PatternBinding> bindings + = {PatternBinding (PatternBoundCtx::Or, std::set<Identifier> ())}; + for (auto &pattern : expr.get_patterns ()) { - PatternDeclaration::go (pattern.get (), Rib::ItemType::Var); + PatternDeclaration::go (pattern.get (), Rib::ItemType::Var, bindings); } ResolveExpr::go (expr.get_if_block ().get (), prefix, canonical_prefix); @@ -517,10 +522,15 @@ ResolveExpr::visit (AST::MatchExpr &expr) ResolveExpr::go (arm.get_guard_expr ().get (), prefix, canonical_prefix); + // FIXME: this declaration should be removed after refactoring + // parse_match_arms_patterns output into a single AltPattern + std::vector<PatternBinding> bindings + = {PatternBinding (PatternBoundCtx::Or, std::set<Identifier> ())}; + // insert any possible new patterns for (auto &pattern : arm.get_patterns ()) { - PatternDeclaration::go (pattern.get (), Rib::ItemType::Var); + PatternDeclaration::go (pattern.get (), Rib::ItemType::Var, bindings); } // resolve the body @@ -576,9 +586,12 @@ ResolveExpr::visit (AST::ClosureExprInner &expr) resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); + std::vector<PatternBinding> bindings + = {PatternBinding (PatternBoundCtx::Product, std::set<Identifier> ())}; + for (auto &p : expr.get_params ()) { - resolve_closure_param (p); + resolve_closure_param (p, bindings); } resolver->push_closure_context (expr.get_node_id ()); @@ -604,9 +617,12 @@ ResolveExpr::visit (AST::ClosureExprInnerTyped &expr) resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); + std::vector<PatternBinding> bindings + = {PatternBinding (PatternBoundCtx::Product, std::set<Identifier> ())}; + for (auto &p : expr.get_params ()) { - resolve_closure_param (p); + resolve_closure_param (p, bindings); } ResolveType::go (expr.get_return_type ().get ()); @@ -624,9 +640,11 @@ ResolveExpr::visit (AST::ClosureExprInnerTyped &expr) } void -ResolveExpr::resolve_closure_param (AST::ClosureParam ¶m) +ResolveExpr::resolve_closure_param (AST::ClosureParam ¶m, + std::vector<PatternBinding> &bindings) { - PatternDeclaration::go (param.get_pattern ().get (), Rib::ItemType::Param); + PatternDeclaration::go (param.get_pattern ().get (), Rib::ItemType::Param, + bindings); if (param.has_type_given ()) ResolveType::go (param.get_type ().get ()); |