From 9e369c3577eaf0e755a2d6da0597a352a4c21a54 Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Fri, 3 Mar 2023 18:01:01 +0000 Subject: 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 ::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: <::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 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 --- gcc/rust/resolve/rust-ast-resolve-type.cc | 12 +++--------- .../rust/compile/parse_associated_type_as_generic_arg3.rs | 6 ++---- 2 files changed, 5 insertions(+), 13 deletions(-) (limited to 'gcc') diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc index fb5e567..62fbf7f 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 { Nothing, } -fn foo() -> Maybe<<<<::A as Bar>::B as Toto>::C as Tata>::D> { +pub fn foo() -> Maybe<<<<::A as Bar>::B as Toto>::C as Tata>::D> { Maybe::Something(15) } -- cgit v1.1