]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Use a loop label in break expression
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Wed, 8 Nov 2023 15:34:19 +0000 (16:34 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:13:13 +0000 (19:13 +0100)
Break expression were using a raw lifetime value instead of a loop label
this behavior would have lead to some errors in ast validation.

gcc/rust/ChangeLog:

* ast/rust-expr.h (class BreakExpr): Change Lifetime to LoopLabel.
* hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Lower lifetime
inside the label instead.
* resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): Resolve the
inner lifetime.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/ast/rust-expr.h
gcc/rust/hir/rust-ast-lower-expr.cc
gcc/rust/resolve/rust-ast-resolve-expr.cc

index f0d663bf6caa17f5c56ec1dfa1a3793f4e8bb515..4dc240c4aa7560188107bd89fd7cbc86eac8210e 100644 (file)
@@ -2727,7 +2727,7 @@ protected:
 class BreakExpr : public ExprWithoutBlock
 {
   std::vector<Attribute> outer_attrs;
-  Lifetime label;
+  LoopLabel label;
   std::unique_ptr<Expr> break_expr;
   location_t locus;
 
@@ -2745,7 +2745,7 @@ public:
   bool has_break_expr () const { return break_expr != nullptr; }
 
   // Constructor for a break expression
-  BreakExpr (Lifetime break_label, std::unique_ptr<Expr> expr_in_break,
+  BreakExpr (LoopLabel break_label, std::unique_ptr<Expr> expr_in_break,
             std::vector<Attribute> outer_attribs, location_t locus)
     : outer_attrs (std::move (outer_attribs)), label (std::move (break_label)),
       break_expr (std::move (expr_in_break)), locus (locus)
@@ -2807,7 +2807,7 @@ public:
     outer_attrs = std::move (new_attrs);
   }
 
-  Lifetime &get_label () { return label; }
+  LoopLabel &get_label () { return label; }
 
 protected:
   /* Use covariance to implement clone function as returning this object rather
index c1ba87ec19517cdb5362944b7e335b186cb1d037..35deb57abe6d8558842ad5402d47469509128160 100644 (file)
@@ -589,7 +589,8 @@ ASTLoweringExpr::visit (AST::ForLoopExpr &expr)
 void
 ASTLoweringExpr::visit (AST::BreakExpr &expr)
 {
-  HIR::Lifetime break_label = lower_lifetime (expr.get_label ());
+  HIR::Lifetime break_label
+    = lower_lifetime (expr.get_label ().get_lifetime ());
   HIR::Expr *break_expr
     = expr.has_break_expr ()
        ? ASTLoweringExpr::translate (expr.get_break_expr ().get ())
index 0b6f1b137885ac35962a5a6f0f6bbe4cb8f29292..741d900460cb58ba1bbb50e03101498514a08d30 100644 (file)
@@ -452,7 +452,7 @@ ResolveExpr::visit (AST::BreakExpr &expr)
 {
   if (expr.has_label ())
     {
-      auto label = expr.get_label ();
+      auto label = expr.get_label ().get_lifetime ();
       if (label.get_lifetime_type () != AST::Lifetime::LifetimeType::NAMED)
        {
          rust_error_at (label.get_locus (),
@@ -466,7 +466,7 @@ ResolveExpr::visit (AST::BreakExpr &expr)
                                    label.get_lifetime_name ()),
            &resolved_node))
        {
-         rust_error_at (expr.get_label ().get_locus (), ErrorCode::E0426,
+         rust_error_at (label.get_locus (), ErrorCode::E0426,
                         "use of undeclared label %qs in %<break%>",
                         label.get_lifetime_name ().c_str ());
          return;