diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2024-10-14 22:07:54 -0400 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2024-10-16 08:45:35 +0000 |
commit | eb863f60b61c1d62250a6a1c4d9a95e8a1ac3d39 (patch) | |
tree | f8dd0b2e311cb3f0b4461a523cfbb09282d0eba6 /gcc | |
parent | ab15db39080e4a094b7cca078895f0bf5803303d (diff) | |
download | gcc-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>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 35 | ||||
-rw-r--r-- | 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 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 |