aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2024-10-14 22:07:54 -0400
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2024-10-16 08:45:35 +0000
commiteb863f60b61c1d62250a6a1c4d9a95e8a1ac3d39 (patch)
treef8dd0b2e311cb3f0b4461a523cfbb09282d0eba6
parentab15db39080e4a094b7cca078895f0bf5803303d (diff)
downloadgcc-eb863f60b61c1d62250a6a1c4d9a95e8a1ac3d39.zip
gcc-eb863f60b61c1d62250a6a1c4d9a95e8a1ac3d39.tar.gz
gcc-eb863f60b61c1d62250a6a1c4d9a95e8a1ac3d39.tar.bz2
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.gamer@gmail.com>
-rw-r--r--gcc/rust/resolve/rust-late-name-resolver-2.0.cc35
-rw-r--r--gcc/testsuite/rust/compile/nr2/exclude4
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 5cb9767..369451b 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 6c7d504..f91cf31 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