From eb863f60b61c1d62250a6a1c4d9a95e8a1ac3d39 Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Mon, 14 Oct 2024 22:07:54 -0400 Subject: 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 --- gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 35 +++++++++++++++++-------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'gcc/rust') 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 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`? 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 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 -- cgit v1.1