]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
resolve: Resolve labelled block
authorJakub Dupak <dev@jakubdupak.com>
Mon, 16 Oct 2023 13:25:29 +0000 (15:25 +0200)
committerP-E-P <32375388+P-E-P@users.noreply.github.com>
Fri, 20 Oct 2023 08:35:27 +0000 (08:35 +0000)
gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): Resolve using loop logic.

Signed-off-by: Jakub Dupak <dev@jakubdupak.com>
gcc/rust/resolve/rust-ast-resolve-expr.cc

index 92466ed353380aaf975569b26a22dc48c5c25517..65abf1906682062605a7a5197c97e709e6916d91 100644 (file)
@@ -303,6 +303,28 @@ ResolveExpr::visit (AST::BlockExpr &expr)
   resolver->push_new_type_rib (resolver->get_type_scope ().peek ());
   resolver->push_new_label_rib (resolver->get_type_scope ().peek ());
 
+  if (expr.has_label ())
+    {
+      auto label = expr.get_label ();
+      if (label.get_lifetime ().get_lifetime_type ()
+         != AST::Lifetime::LifetimeType::NAMED)
+       {
+         rust_error_at (label.get_locus (),
+                        "Labels must be a named lifetime value");
+         return;
+       }
+
+      auto label_name = label.get_lifetime ().get_lifetime_name ();
+      auto label_lifetime_node_id = label.get_lifetime ().get_node_id ();
+      resolver->get_label_scope ().insert (
+       CanonicalPath::new_seg (label.get_node_id (), label_name),
+       label_lifetime_node_id, label.get_locus (), false, Rib::ItemType::Label,
+       [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
+         rust_error_at (label.get_locus (), "label redefined multiple times");
+         rust_error_at (locus, "was defined here");
+       });
+    }
+
   for (auto &s : expr.get_statements ())
     {
       if (s->is_item ())