There are a few edge cases when resolving TypePaths that we cannot fully
resolve to an explicit node_id and this is expected. So for example
<A as B>::foo
A and B are simple Type paths and thats 100% but the segment foo cannot be
100% resolved to an explicit node id as this requires type-resolution to
find the correct path. So when we have complex paths such as:
<<A as B>::foo as C>
The ::foo part will return UNKNOWN_NODEId and we return early and think its
a failure case but its not necessarily a failure but we need to make sure
to name resolve C so when we do type-resolution we can resolve C properly.
Addresses #1524
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/ChangeLog:
* resolve/rust-ast-resolve-type.cc (ResolveRelativeQualTypePath::resolve_qual_seg): fix
gcc/testsuite/ChangeLog:
* rust/compile/parse_associated_type_as_generic_arg3.rs: remove -fsyntax-only
}
auto type = seg.get_type ().get ();
- NodeId type_resolved_node = ResolveType::go (type);
- if (type_resolved_node == UNKNOWN_NODEID)
- return false;
-
- if (!seg.has_as_clause ())
- return true;
+ ResolveType::go (type);
- NodeId trait_resolved_node = ResolveType::go (&seg.get_as_type_path ());
- if (trait_resolved_node == UNKNOWN_NODEID)
- return false;
+ if (seg.has_as_clause ())
+ ResolveType::go (&seg.get_as_type_path ());
return true;
}
-// { dg-additional-options "-fsyntax-only" }
-
trait Bar {
type B;
fn tata() {}
}
-struct S;
+struct S; // { dg-warning "struct is never constructed" }
impl Bar for i32 {
type B = u32;
Nothing,
}
-fn foo() -> Maybe<<<<<S as Foo>::A as Bar>::B as Toto>::C as Tata>::D> {
+pub fn foo() -> Maybe<<<<<S as Foo>::A as Bar>::B as Toto>::C as Tata>::D> {
Maybe::Something(15)
}