[COMMITTED 17/32] gccrs: Resolve labels

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Tue Apr 8 08:17:26 GMT 2025


From: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>

gcc/rust/ChangeLog:

	* hir/rust-ast-lower.cc (ASTLoweringBlock::visit): Lower label only if
	it exists.
	* hir/tree/rust-hir-expr.cc (BlockExpr::BlockExpr): Make loop label
	optional.
	(BaseLoopExpr::BaseLoopExpr): Likewise.
	(LoopExpr::LoopExpr): Likewise.
	(WhileLoopExpr::WhileLoopExpr): Likewise.
	* hir/tree/rust-hir-expr.h: Use optional for lifetime and labels.
	* hir/tree/rust-hir.cc (WhileLoopExpr::as_string): Use getter.
	(WhileLetLoopExpr::as_string): Likewise.
	(LoopExpr::as_string): Likewise.
	* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Resolve labels.
	* resolve/rust-late-name-resolver-2.0.h: Add visit function prototype
	for loop labels.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
---
 gcc/rust/hir/rust-ast-lower.cc                |  6 ++++-
 gcc/rust/hir/tree/rust-hir-expr.cc            | 14 +++++++----
 gcc/rust/hir/tree/rust-hir-expr.h             | 25 +++++++++++--------
 gcc/rust/hir/tree/rust-hir.cc                 |  6 ++---
 .../resolve/rust-late-name-resolver-2.0.cc    | 19 ++++++++++++++
 .../resolve/rust-late-name-resolver-2.0.h     |  1 +
 6 files changed, 51 insertions(+), 20 deletions(-)

diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index ebdf9810b34..c14fccde081 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -97,7 +97,11 @@ ASTLowering::go ()
 void
 ASTLoweringBlock::visit (AST::BlockExpr &expr)
 {
-  auto label = lower_loop_label (expr.get_label ());
+  tl::optional<HIR::LoopLabel> label;
+  if (expr.has_label ())
+    label = lower_loop_label (expr.get_label ());
+  else
+    label = tl::nullopt;
 
   std::vector<std::unique_ptr<HIR::Stmt>> block_stmts;
   bool block_did_terminate = false;
diff --git a/gcc/rust/hir/tree/rust-hir-expr.cc b/gcc/rust/hir/tree/rust-hir-expr.cc
index bb7ebfbc617..82a09e93588 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.cc
+++ b/gcc/rust/hir/tree/rust-hir-expr.cc
@@ -749,7 +749,7 @@ BlockExpr::BlockExpr (Analysis::NodeMapping mappings,
 		      std::vector<std::unique_ptr<Stmt>> block_statements,
 		      std::unique_ptr<Expr> block_expr, bool tail_reachable,
 		      AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
-		      LoopLabel label, location_t start_locus,
+		      tl::optional<LoopLabel> label, location_t start_locus,
 		      location_t end_locus)
   : ExprWithBlock (std::move (mappings), std::move (outer_attribs)),
     WithInnerAttrs (std::move (inner_attribs)),
@@ -985,7 +985,8 @@ UnsafeBlockExpr::operator= (UnsafeBlockExpr const &other)
 
 BaseLoopExpr::BaseLoopExpr (Analysis::NodeMapping mappings,
 			    std::unique_ptr<BlockExpr> loop_block,
-			    location_t locus, LoopLabel loop_label,
+			    location_t locus,
+			    tl::optional<LoopLabel> loop_label,
 			    AST::AttrVec outer_attribs)
   : ExprWithBlock (std::move (mappings), std::move (outer_attribs)),
     loop_label (std::move (loop_label)), loop_block (std::move (loop_block)),
@@ -1011,7 +1012,8 @@ BaseLoopExpr::operator= (BaseLoopExpr const &other)
 
 LoopExpr::LoopExpr (Analysis::NodeMapping mappings,
 		    std::unique_ptr<BlockExpr> loop_block, location_t locus,
-		    LoopLabel loop_label, AST::AttrVec outer_attribs)
+		    tl::optional<LoopLabel> loop_label,
+		    AST::AttrVec outer_attribs)
   : BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
 		  std::move (loop_label), std::move (outer_attribs))
 {}
@@ -1019,7 +1021,8 @@ LoopExpr::LoopExpr (Analysis::NodeMapping mappings,
 WhileLoopExpr::WhileLoopExpr (Analysis::NodeMapping mappings,
 			      std::unique_ptr<Expr> loop_condition,
 			      std::unique_ptr<BlockExpr> loop_block,
-			      location_t locus, LoopLabel loop_label,
+			      location_t locus,
+			      tl::optional<LoopLabel> loop_label,
 			      AST::AttrVec outer_attribs)
   : BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
 		  std::move (loop_label), std::move (outer_attribs)),
@@ -1046,7 +1049,8 @@ WhileLetLoopExpr::WhileLetLoopExpr (
   Analysis::NodeMapping mappings,
   std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
   std::unique_ptr<Expr> condition, std::unique_ptr<BlockExpr> loop_block,
-  location_t locus, LoopLabel loop_label, AST::AttrVec outer_attribs)
+  location_t locus, tl::optional<LoopLabel> loop_label,
+  AST::AttrVec outer_attribs)
   : BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
 		  std::move (loop_label), std::move (outer_attribs)),
     match_arm_patterns (std::move (match_arm_patterns)),
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h
index 3ff38b34065..2d1059ab8cc 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.h
+++ b/gcc/rust/hir/tree/rust-hir-expr.h
@@ -1717,7 +1717,7 @@ public:
   std::vector<std::unique_ptr<Stmt>> statements;
   std::unique_ptr<Expr> expr;
   bool tail_reachable;
-  LoopLabel label;
+  tl::optional<LoopLabel> label;
   location_t start_locus;
   location_t end_locus;
 
@@ -1737,7 +1737,8 @@ public:
 	     std::vector<std::unique_ptr<Stmt>> block_statements,
 	     std::unique_ptr<Expr> block_expr, bool tail_reachable,
 	     AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
-	     LoopLabel label, location_t start_locus, location_t end_locus);
+	     tl::optional<LoopLabel> label, location_t start_locus,
+	     location_t end_locus);
 
   // Copy constructor with clone
   BlockExpr (BlockExpr const &other);
@@ -1776,8 +1777,8 @@ public:
     return ExprType::Block;
   }
 
-  bool has_label () const { return !label.is_error (); }
-  LoopLabel &get_label () { return label; }
+  bool has_label () const { return label.has_value (); }
+  LoopLabel &get_label () { return label.value (); }
 
 protected:
   /* Use covariance to implement clone function as returning this object rather
@@ -2295,7 +2296,7 @@ protected:
 class BaseLoopExpr : public ExprWithBlock
 {
 protected:
-  LoopLabel loop_label;
+  tl::optional<LoopLabel> loop_label;
   std::unique_ptr<BlockExpr> loop_block;
 
 private:
@@ -2305,7 +2306,7 @@ protected:
   // Constructor for BaseLoopExpr
   BaseLoopExpr (Analysis::NodeMapping mappings,
 		std::unique_ptr<BlockExpr> loop_block, location_t locus,
-		LoopLabel loop_label,
+		tl::optional<LoopLabel> loop_label,
 		AST::AttrVec outer_attribs = AST::AttrVec ());
 
   // Copy constructor for BaseLoopExpr with clone
@@ -2324,13 +2325,14 @@ protected:
   }
 
 public:
-  bool has_loop_label () const { return !loop_label.is_error (); }
+  bool has_loop_label () const { return loop_label.has_value (); }
 
   location_t get_locus () const override final { return locus; }
 
   HIR::BlockExpr &get_loop_block () { return *loop_block; };
 
-  LoopLabel &get_loop_label () { return loop_label; }
+  LoopLabel &get_loop_label () { return loop_label.value (); }
+  const LoopLabel &get_loop_label () const { return loop_label.value (); }
 };
 
 // 'Loop' expression (i.e. the infinite loop) HIR node
@@ -2342,7 +2344,8 @@ public:
   // Constructor for LoopExpr
   LoopExpr (Analysis::NodeMapping mappings,
 	    std::unique_ptr<BlockExpr> loop_block, location_t locus,
-	    LoopLabel loop_label, AST::AttrVec outer_attribs = AST::AttrVec ());
+	    tl::optional<LoopLabel> loop_label,
+	    AST::AttrVec outer_attribs = AST::AttrVec ());
 
   void accept_vis (HIRFullVisitor &vis) override;
   void accept_vis (HIRExpressionVisitor &vis) override;
@@ -2372,7 +2375,7 @@ public:
   WhileLoopExpr (Analysis::NodeMapping mappings,
 		 std::unique_ptr<Expr> loop_condition,
 		 std::unique_ptr<BlockExpr> loop_block, location_t locus,
-		 LoopLabel loop_label,
+		 tl::optional<LoopLabel> loop_label,
 		 AST::AttrVec outer_attribs = AST::AttrVec ());
 
   // Copy constructor with clone
@@ -2421,7 +2424,7 @@ public:
 		    std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
 		    std::unique_ptr<Expr> condition,
 		    std::unique_ptr<BlockExpr> loop_block, location_t locus,
-		    LoopLabel loop_label,
+		    tl::optional<LoopLabel> loop_label,
 		    AST::AttrVec outer_attribs = AST::AttrVec ());
 
   // Copy constructor with clone
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
index 822eaffcb7c..771ae9c7962 100644
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -1704,7 +1704,7 @@ WhileLoopExpr::as_string () const
     }
   else
     {
-      str += loop_label.as_string ();
+      str += get_loop_label ().as_string ();
     }
 
   str += "\n Conditional expr: " + condition->as_string ();
@@ -1726,7 +1726,7 @@ WhileLetLoopExpr::as_string () const
     }
   else
     {
-      str += loop_label.as_string ();
+      str += get_loop_label ().as_string ();
     }
 
   str += "\n Match arm patterns: ";
@@ -1761,7 +1761,7 @@ LoopExpr::as_string () const
     }
   else
     {
-      str += loop_label.as_string ();
+      str += get_loop_label ().as_string ();
     }
 
   str += "\n Loop block: " + loop_block->as_string ();
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 d18e7e2a324..e0006fdea27 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -212,6 +212,25 @@ Late::visit (AST::BreakExpr &expr)
   funny_error = false;
 }
 
+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 ();
+  if (auto resolved = ctx.labels.get (lifetime.as_string ()))
+    {
+      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 ());
+    }
+}
+
 void
 Late::visit (AST::IdentifierExpr &expr)
 {
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 ac376b5cb6f..e40141c9238 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::LoopLabel &) override;
   void visit (AST::PathInExpression &) override;
   void visit (AST::TypePath &) override;
   void visit (AST::Trait &) override;
-- 
2.49.0



More information about the Gcc-rust mailing list