aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve/rust-ast-resolve-expr.cc
diff options
context:
space:
mode:
authorMahmoud Mohamed <mahadelr19@gmail.com>2023-03-13 17:18:11 +0300
committerPhilip Herron <philip.herron@embecosm.com>2023-03-15 11:14:06 +0000
commitbed6308e5e5201f409b041ca5e712d1ed8839195 (patch)
tree6942925354d10bc41582450b190be07b57a8e2bb /gcc/rust/resolve/rust-ast-resolve-expr.cc
parentfc0addd1ffae33478cfc838f93e6685c0cbfa08c (diff)
downloadgcc-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.cc30
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 &param)
+ResolveExpr::resolve_closure_param (AST::ClosureParam &param,
+ 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 ());