aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/resolve/rust-forever-stack.hxx60
-rw-r--r--gcc/rust/resolve/rust-late-name-resolver-2.0.cc25
-rw-r--r--gcc/testsuite/rust/compile/nr2/exclude35
3 files changed, 56 insertions, 64 deletions
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx b/gcc/rust/resolve/rust-forever-stack.hxx
index b51da51..d202055 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -381,13 +381,6 @@ ForeverStack<N>::find_starting_point (
{
auto iterator = segments.begin ();
- // If we need to do path segment resolution, then we start
- // at the closest module. In order to resolve something like `foo::bar!()`, we
- // need to get back to the surrounding module, and look for a child module
- // named `foo`.
- if (segments.size () > 1)
- starting_point = find_closest_module (starting_point);
-
for (; !is_last (iterator, segments); iterator++)
{
auto &outer_seg = *iterator;
@@ -416,12 +409,14 @@ ForeverStack<N>::find_starting_point (
if (seg.is_lower_self_seg ())
{
// insert segment resolution and exit
+ starting_point = find_closest_module (starting_point);
insert_segment_resolution (outer_seg, starting_point.get ().id);
iterator++;
break;
}
if (seg.is_super_path_seg ())
{
+ starting_point = find_closest_module (starting_point);
if (starting_point.get ().is_root ())
{
rust_error_at (seg.get_locus (), ErrorCode::E0433,
@@ -469,27 +464,48 @@ ForeverStack<N>::resolve_segments (
tl::optional<typename ForeverStack<N>::Node &> child = tl::nullopt;
- for (auto &kv : current_node->children)
+ while (true)
{
- auto &link = kv.first;
+ for (auto &kv : current_node->children)
+ {
+ auto &link = kv.first;
+
+ if (link.path.map_or (
+ [&str] (Identifier path) {
+ auto &path_str = path.as_string ();
+ return str == path_str;
+ },
+ false))
+ {
+ child = kv.second;
+ break;
+ }
+ }
- if (link.path.map_or (
- [&str] (Identifier path) {
- auto &path_str = path.as_string ();
- return str == path_str;
- },
- false))
+ if (child.has_value ())
{
- child = kv.second;
break;
}
- }
- if (!child.has_value ())
- {
- rust_error_at (seg.get_locus (), ErrorCode::E0433,
- "failed to resolve path segment %qs", str.c_str ());
- return tl::nullopt;
+ if (N == Namespace::Types)
+ {
+ auto rib_lookup = current_node->rib.get (seg.as_string ());
+ if (rib_lookup && !rib_lookup->is_ambiguous ())
+ {
+ insert_segment_resolution (outer_seg,
+ rib_lookup->get_node_id ());
+ return tl::nullopt;
+ }
+ }
+
+ if (!is_start (iterator, segments)
+ || current_node->rib.kind == Rib::Kind::Module
+ || current_node->is_root ())
+ {
+ return tl::nullopt;
+ }
+
+ current_node = &current_node->parent.value ();
}
current_node = &child.value ();
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 c134ca0..7253deb 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -294,6 +294,8 @@ Late::visit (AST::TypePath &type)
// maybe we can overload `resolve_path<Namespace::Types>` to only do
// typepath-like path resolution? that sounds good
+ DefaultResolver::visit (type);
+
// take care of only simple cases
// TODO: remove this?
rust_assert (!type.has_opening_scope_resolution_op ());
@@ -302,14 +304,23 @@ Late::visit (AST::TypePath &type)
// TODO: make sure typepath-like path resolution (?) is working
auto resolved = ctx.resolve_path (type.get_segments (), Namespace::Types);
- if (resolved.has_value ())
- ctx.map_usage (Usage (type.get_node_id ()),
- Definition (resolved->get_node_id ()));
- else
- rust_error_at (type.get_locus (), "could not resolve type path %qs",
- type.as_string ().c_str ());
+ if (!resolved.has_value ())
+ {
+ if (!ctx.lookup (type.get_segments ().front ()->get_node_id ()))
+ rust_error_at (type.get_locus (), "could not resolve type path %qs",
+ type.as_string ().c_str ());
+ return;
+ }
- DefaultResolver::visit (type);
+ if (resolved->is_ambiguous ())
+ {
+ rust_error_at (type.get_locus (), ErrorCode::E0659, "%qs is ambiguous",
+ type.as_string ().c_str ());
+ return;
+ }
+
+ ctx.map_usage (Usage (type.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 6f6280d..a400378 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -1,8 +1,6 @@
-bounds1.rs
break-rust2.rs
canonical_paths1.rs
cfg1.rs
-closure_no_type_anno.rs
complex-path1.rs
const-issue1440.rs
const_generics_3.rs
@@ -11,29 +9,19 @@ const_generics_7.rs
derive_macro1.rs
expected_type_args2.rs
feature_rust_attri0.rs
-format_args_basic_expansion.rs
generic-default1.rs
generics3.rs
generics4.rs
generics5.rs
-generics6.rs
generics9.rs
issue-1130.rs
issue-1173.rs
-issue-1272.rs
-issue-1447.rs
issue-1483.rs
-issue-1725-1.rs
-issue-1725-2.rs
issue-1786.rs
-issue-1893.rs
issue-1901.rs
issue-1981.rs
-issue-2036.rs
issue-2043.rs
-issue-2142.rs
issue-2330.rs
-issue-2479.rs
issue-2723-1.rs
issue-2723-2.rs
issue-2775.rs
@@ -43,11 +31,9 @@ issue-850.rs
issue-855.rs
iterators1.rs
lookup_err1.rs
-macros/mbe/macro20.rs
macros/mbe/macro40.rs
macros/mbe/macro43.rs
macros/mbe/macro44.rs
-macros/mbe/macro54.rs
macros/mbe/macro6.rs
macros/mbe/macro_use1.rs
method2.rs
@@ -57,7 +43,6 @@ nested_macro_use1.rs
nested_macro_use2.rs
nested_macro_use3.rs
not_find_value_in_scope.rs
-pattern-struct.rs
privacy4.rs
privacy5.rs
privacy8.rs
@@ -83,15 +68,10 @@ v0-mangle2.rs
while_break_expr.rs
exhaustiveness2.rs
issue-3139-2.rs
-issue-3032-1.rs
-issue-3032-2.rs
-iflet.rs
issue-3033.rs
issue-3009.rs
issue-2953-2.rs
-issue-1773.rs
issue-2905-2.rs
-issue-2907.rs
issue-2423.rs
issue-266.rs
additional-trait-bounds2.rs
@@ -103,22 +83,7 @@ derive_macro6.rs
issue-2987.rs
issue-3139-1.rs
issue-3139-3.rs
-issue-1019.rs
-issue-1034.rs
-issue-2019-1.rs
-issue-2019-2.rs
-issue-2019-3.rs
-issue-2105.rs
-issue-2190-1.rs
-issue-2190-2.rs
-issue-2304.rs
-issue-2747.rs
-issue-2953-1.rs
-issue-3030.rs
-traits12.rs
-try-trait.rs
derive-debug1.rs
-issue-3382.rs
derive-default1.rs
issue-3402-1.rs
for-loop1.rs