diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2025-04-02 17:41:54 +0200 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2025-04-07 08:18:19 +0000 |
commit | 429897c851b460b9256d96e3e504dfe15342d125 (patch) | |
tree | 33ecfede25846c17e1ca627a91f59b9677bfb00e /gcc/rust/resolve | |
parent | 5562e72c96ef45a561c7ec0e9bf6f1ebb87b982c (diff) | |
download | gcc-429897c851b460b9256d96e3e504dfe15342d125.zip gcc-429897c851b460b9256d96e3e504dfe15342d125.tar.gz gcc-429897c851b460b9256d96e3e504dfe15342d125.tar.bz2 |
Resolve labels within break or continue expressions
gcc/rust/ChangeLog:
* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Add call
to label resolution if there is one label.
(Late::resolve_label): Look for labels and emit an error message on
failure.
* resolve/rust-late-name-resolver-2.0.h: Add function prototypes.
gcc/testsuite/ChangeLog:
* rust/compile/nr2/exclude: Remove test.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r-- | gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 36 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-late-name-resolver-2.0.h | 3 |
2 files changed, 29 insertions, 10 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 886a9fc..717bf5c 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -187,6 +187,9 @@ Late::visit (AST::SelfParam ¶m) void Late::visit (AST::BreakExpr &expr) { + if (expr.has_label ()) + resolve_label (expr.get_label ().get_lifetime ()); + if (expr.has_break_expr ()) { auto &break_expr = expr.get_break_expr (); @@ -215,20 +218,33 @@ Late::visit (AST::BreakExpr &expr) void Late::visit (AST::LoopLabel &label) { - // Shall we move this to visit(AST::Lifetime) or do we need to - // keep the context ? - auto lifetime = label.get_lifetime (); + auto &lifetime = label.get_lifetime (); + ctx.labels.insert (Identifier (lifetime.as_string (), lifetime.get_locus ()), + lifetime.get_node_id ()); +} + +void +Late::resolve_label (AST::Lifetime &lifetime) +{ if (auto resolved = ctx.labels.get (lifetime.as_string ())) { - ctx.map_usage (Usage (lifetime.get_node_id ()), - Definition (resolved->get_node_id ())); + if (resolved->get_node_id () != lifetime.get_node_id ()) + ctx.map_usage (Usage (lifetime.get_node_id ()), + Definition (resolved->get_node_id ())); } else - { - ctx.labels.insert (Identifier (lifetime.as_string (), - lifetime.get_locus ()), - lifetime.get_node_id ()); - } + rust_error_at (lifetime.get_locus (), ErrorCode::E0426, + "use of undeclared label %qs", + lifetime.as_string ().c_str ()); +} + +void +Late::visit (AST::ContinueExpr &expr) +{ + if (expr.has_label ()) + resolve_label (expr.get_label ()); + + DefaultResolver::visit (expr); } void diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.h b/gcc/rust/resolve/rust-late-name-resolver-2.0.h index 3f5097f..52079cc 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h @@ -48,6 +48,7 @@ public: void visit (AST::IdentifierExpr &) override; void visit (AST::StructExprFieldIdentifier &) override; void visit (AST::BreakExpr &) override; + void visit (AST::ContinueExpr &) override; void visit (AST::LoopLabel &) override; void visit (AST::PathInExpression &) override; void visit (AST::TypePath &) override; @@ -62,6 +63,8 @@ public: void visit (AST::ClosureExprInnerTyped &) override; private: + void resolve_label (AST::Lifetime &lifetime); + /* Setup Rust's builtin types (u8, i32, !...) in the resolver */ void setup_builtin_types (); |