https://gcc.gnu.org/g:1f1eeb5ac040a6a83e608fdfcac81a9e96d11b11

commit r15-8429-g1f1eeb5ac040a6a83e608fdfcac81a9e96d11b11
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Mon Oct 14 22:07:54 2024 -0400

    gccrs: Allow identifiers and paths to reference types during nr2.0
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-late-name-resolver-2.0.cc
            (Late::visit): Allow IdentifierExpr and PathInExpression to
            reference types as well as values, remove ability for
            IdentifierExpr to reference labels.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/nr2/exclude: Remove entries.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 35 +++++++++++++++++--------
 gcc/testsuite/rust/compile/nr2/exclude          |  4 ---
 2 files changed, 24 insertions(+), 15 deletions(-)

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 c58cd967c97b..daf0c871a62c 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -164,16 +164,14 @@ Late::visit (AST::IdentifierExpr &expr)
   // TODO: same thing as visit(PathInExpression) here?
 
   tl::optional<Rib::Definition> resolved = tl::nullopt;
-  auto label = ctx.labels.get (expr.get_ident ());
-  auto value = ctx.values.get (expr.get_ident ());
 
-  if (label)
+  if (auto value = ctx.values.get (expr.get_ident ()))
     {
-      resolved = label;
+      resolved = value;
     }
-  else if (value)
+  else if (auto type = ctx.types.get (expr.get_ident ()))
     {
-      resolved = value;
+      resolved = type;
     }
   else
     {
@@ -202,18 +200,33 @@ Late::visit (AST::PathInExpression &expr)
   // do we emit it in `get<Namespace::Labels>`?
 
   rust_debug ("[ARTHUR]: %s", expr.as_simple_path ().as_string ().c_str ());
-  auto value = ctx.values.resolve_path (expr.get_segments ());
-  if (!value.has_value ())
-    rust_unreachable (); // Should have been resolved earlier
 
-  if (value->is_ambiguous ())
+  tl::optional<Rib::Definition> resolved = tl::nullopt;
+
+  if (auto value = ctx.values.resolve_path (expr.get_segments ()))
+    {
+      resolved = value;
+    }
+  else if (auto type = ctx.types.resolve_path (expr.get_segments ()))
+    {
+      resolved = type;
+    }
+  else
+    {
+      rust_error_at (expr.get_locus (),
+                    "could not resolve path expression: %qs",
+                    expr.as_simple_path ().as_string ().c_str ());
+      return;
+    }
+
+  if (resolved->is_ambiguous ())
     {
       rust_error_at (expr.get_locus (), ErrorCode::E0659, "%qs is ambiguous",
                     expr.as_string ().c_str ());
       return;
     }
   ctx.map_usage (Usage (expr.get_node_id ()),
-                Definition (value->get_node_id ()));
+                Definition (resolved->get_node_id ()));
 }
 
 void
diff --git a/gcc/testsuite/rust/compile/nr2/exclude 
b/gcc/testsuite/rust/compile/nr2/exclude
index 6c7d50412913..f91cf3132c79 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -45,7 +45,6 @@ feature_rust_attri0.rs
 feature_rust_attri1.rs
 for_lifetimes.rs
 format_args_basic_expansion.rs
-found_struct.rs
 generic-default1.rs
 generics1.rs
 generics10.rs
@@ -145,10 +144,8 @@ match2.rs
 match3.rs
 match4.rs
 match5.rs
-match8.rs
 match9.rs
 method2.rs
-missing_constructor_fields.rs
 multi_reference_type.rs
 multiple_bindings1.rs
 multiple_bindings2.rs
@@ -203,7 +200,6 @@ traits6.rs
 traits7.rs
 traits8.rs
 traits9.rs
-tuple_struct1.rs
 type-bindings1.rs
 unconstrained_type_param.rs
 undeclared_label.rs

Reply via email to