From: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@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.pa...@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

Reply via email to