diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2025-04-06 18:49:11 +0200 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2025-04-24 16:53:44 +0000 |
commit | 7acf75a3af9b367a3afdc8d465f1e34b6fb83e19 (patch) | |
tree | 6b87b09e7c9709f5cebee171540c5f106c3beefc /gcc/rust/resolve/rust-late-name-resolver-2.0.cc | |
parent | 5d6320ceb3b00a7ea6b988ec55c772f563dfd675 (diff) | |
download | gcc-7acf75a3af9b367a3afdc8d465f1e34b6fb83e19.zip gcc-7acf75a3af9b367a3afdc8d465f1e34b6fb83e19.tar.gz gcc-7acf75a3af9b367a3afdc8d465f1e34b6fb83e19.tar.bz2 |
Use stacked context for nested bindings.
Binding context may be stacked when a new binding group is introduced
within a const expression.
gcc/rust/ChangeLog:
* resolve/rust-name-resolution-context.h: Use BindingLayer instead.
* resolve/rust-name-resolution-context.cc (BindingLayer::BindingLayer):
Add new constructor for binding layer.
(BindingLayer::bind_test): Add a function to test a binding constraint.
(BindingLayer::push): Push a new binding group.
(BindingLayer::and_binded): Add function to test and-binding
constraint.
(BindingLayer::or_binded): Add function to test or-binding constraints.
(BindingLayer::insert_ident): Insert a new identifier in the current
binding group.
(BindingLayer::merge): Merge current binding group with it's parent.
(BindingLayer::get_source): Get the source of the current binding
group.
* resolve/rust-late-name-resolver-2.0.cc: Use stacked context for
binding group.
* util/rust-stacked-contexts.h: Add mutable peek function.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc/rust/resolve/rust-late-name-resolver-2.0.cc')
-rw-r--r-- | gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc index a452d44..5ee3fa2 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -133,11 +133,11 @@ Late::visit (AST::ForLoopExpr &expr) { visit_outer_attrs (expr); - ctx.bindings.new_binding (BindingSource::For); + ctx.bindings.enter (BindingSource::For); visit (expr.get_pattern ()); - ctx.bindings.clear (); + ctx.bindings.exit (); visit (expr.get_iterator_expr ()); visit (expr.get_loop_label ()); @@ -149,12 +149,12 @@ Late::visit (AST::IfLetExpr &expr) { visit_outer_attrs (expr); - ctx.bindings.new_binding (BindingSource::Let); + ctx.bindings.enter (BindingSource::Let); for (auto &pattern : expr.get_patterns ()) visit (pattern); - ctx.bindings.clear (); + ctx.bindings.exit (); visit (expr.get_value_expr ()); visit (expr.get_if_block ()); @@ -165,12 +165,12 @@ Late::visit (AST::MatchArm &arm) { visit_outer_attrs (arm); - ctx.bindings.new_binding (BindingSource::Match); + ctx.bindings.enter (BindingSource::Match); for (auto &pattern : arm.get_patterns ()) visit (pattern); - ctx.bindings.clear (); + ctx.bindings.exit (); if (arm.has_match_arm_guard ()) visit (arm.get_guard_expr ()); @@ -187,11 +187,11 @@ Late::visit (AST::LetStmt &let) if (let.has_init_expr ()) visit (let.get_init_expr ()); - ctx.bindings.new_binding (BindingSource::Let); + ctx.bindings.enter (BindingSource::Let); visit (let.get_pattern ()); - ctx.bindings.clear (); + ctx.bindings.exit (); if (let.has_else_expr ()) visit (let.get_init_expr ()); @@ -220,9 +220,9 @@ Late::visit (AST::IdentifierPattern &identifier) // but values does not allow shadowing... since functions cannot shadow // do we insert functions in labels as well? - if (ctx.bindings.and_binded (identifier.get_ident ())) + if (ctx.bindings.peek ().is_and_bound (identifier.get_ident ())) { - if (ctx.bindings.get_source () == BindingSource::Param) + if (ctx.bindings.peek ().get_source () == BindingSource::Param) rust_error_at ( identifier.get_locus (), ErrorCode::E0415, "identifier %qs is bound more than once in the same parameter list", @@ -235,9 +235,9 @@ Late::visit (AST::IdentifierPattern &identifier) return; } - ctx.bindings.insert_ident (identifier.get_ident ()); + ctx.bindings.peek ().insert_ident (identifier.get_ident ()); - if (ctx.bindings.or_binded (identifier.get_ident ())) + if (ctx.bindings.peek ().is_or_bound (identifier.get_ident ())) { // FIXME: map usage instead std::ignore = ctx.values.insert_shadowable (identifier.get_ident (), @@ -255,14 +255,14 @@ Late::visit (AST::IdentifierPattern &identifier) void Late::visit (AST::AltPattern &pattern) { - ctx.bindings.push (Binding::Kind::Or); + ctx.bindings.peek ().push (Binding::Kind::Or); for (auto &alt : pattern.get_alts ()) { - ctx.bindings.push (Binding::Kind::Product); + ctx.bindings.peek ().push (Binding::Kind::Product); visit (alt); - ctx.bindings.merge (); + ctx.bindings.peek ().merge (); } - ctx.bindings.merge (); + ctx.bindings.peek ().merge (); } void @@ -276,12 +276,12 @@ Late::visit (AST::Function &function) visit (generic); // We only care about params - ctx.bindings.new_binding (BindingSource::Param); + ctx.bindings.enter (BindingSource::Param); for (auto ¶m : function.get_function_params ()) visit (param); - ctx.bindings.clear (); + ctx.bindings.exit (); // Back to regular visit @@ -652,12 +652,12 @@ Late::visit (AST::ClosureExprInner &closure) visit_outer_attrs (closure); - ctx.bindings.new_binding (BindingSource::Param); + ctx.bindings.enter (BindingSource::Param); for (auto ¶m : closure.get_params ()) visit (param); - ctx.bindings.clear (); + ctx.bindings.exit (); visit (closure.get_definition_expr ()); } @@ -669,12 +669,12 @@ Late::visit (AST::ClosureExprInnerTyped &closure) visit_outer_attrs (closure); - ctx.bindings.new_binding (BindingSource::Param); + ctx.bindings.enter (BindingSource::Param); for (auto ¶m : closure.get_params ()) visit (param); - ctx.bindings.clear (); + ctx.bindings.exit (); visit (closure.get_return_type ()); visit (closure.get_definition_block ()); |