aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2025-04-02 17:41:54 +0200
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2025-04-07 08:18:19 +0000
commit429897c851b460b9256d96e3e504dfe15342d125 (patch)
tree33ecfede25846c17e1ca627a91f59b9677bfb00e /gcc/rust/resolve
parent5562e72c96ef45a561c7ec0e9bf6f1ebb87b982c (diff)
downloadgcc-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.cc36
-rw-r--r--gcc/rust/resolve/rust-late-name-resolver-2.0.h3
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 &param)
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 ();