[gcc r14-8142] gccrs: Use a loop label in break expression

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:17:16 GMT 2024


https://gcc.gnu.org/g:ea59190d54612f9f0e09c77a0601023ef43f861d

commit r14-8142-gea59190d54612f9f0e09c77a0601023ef43f861d
Author: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date:   Wed Nov 8 16:34:19 2023 +0100

    gccrs: Use a loop label in break expression
    
    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>

Diff:
---
 gcc/rust/ast/rust-expr.h                  | 6 +++---
 gcc/rust/hir/rust-ast-lower-expr.cc       | 3 ++-
 gcc/rust/resolve/rust-ast-resolve-expr.cc | 4 ++--
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h
index f0d663bf6ca..4dc240c4aa7 100644
--- a/gcc/rust/ast/rust-expr.h
+++ b/gcc/rust/ast/rust-expr.h
@@ -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
diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc
index c1ba87ec195..35deb57abe6 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.cc
+++ b/gcc/rust/hir/rust-ast-lower-expr.cc
@@ -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 ())
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.cc b/gcc/rust/resolve/rust-ast-resolve-expr.cc
index 0b6f1b13788..741d900460c 100644
--- a/gcc/rust/resolve/rust-ast-resolve-expr.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-expr.cc
@@ -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;


More information about the Gcc-cvs mailing list