diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-03-03 18:01:01 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-03 19:27:24 +0000 |
commit | 06e1d43c2f8a05af9fd862e6497c21741fce85c7 (patch) | |
tree | 9953daf4e7b40619eeb2a8fbdad2c593dbcff7da | |
parent | f71f25af741238e911d38874da18a5654fc836f7 (diff) | |
download | gcc-06e1d43c2f8a05af9fd862e6497c21741fce85c7.zip gcc-06e1d43c2f8a05af9fd862e6497c21741fce85c7.tar.gz gcc-06e1d43c2f8a05af9fd862e6497c21741fce85c7.tar.bz2 |
gccrs: Fix name-resolution to be permissive and carry on
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
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-type.cc | 12 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs | 6 |
2 files changed, 5 insertions, 13 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc index 28ab069..f315985 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.cc +++ b/gcc/rust/resolve/rust-ast-resolve-type.cc @@ -321,16 +321,10 @@ ResolveRelativeQualTypePath::resolve_qual_seg (AST::QualifiedPathType &seg) } 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; } diff --git a/gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs b/gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs index f1cc9e7..72c1b95 100644 --- a/gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs +++ b/gcc/testsuite/rust/compile/parse_associated_type_as_generic_arg3.rs @@ -1,5 +1,3 @@ -// { dg-additional-options "-fsyntax-only" } - trait Bar { type B; @@ -35,7 +33,7 @@ impl Tata for f32 { fn tata() {} } -struct S; +struct S; // { dg-warning "struct is never constructed" } impl Bar for i32 { type B = u32; @@ -54,6 +52,6 @@ enum Maybe<T> { 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) } |