From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id B3CBD380F3DC; Wed, 8 Jun 2022 12:17:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B3CBD380F3DC Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] Add missing canonicalization of slices and raw pointer types X-Act-Checkin: gcc X-Git-Author: Philip Herron X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: 77a49507446b67a6c207b4e4fec3639f536b9eca X-Git-Newrev: 31413ebacfec0f8d7b8c01b1903b76563b965177 Message-Id: <20220608121718.B3CBD380F3DC@sourceware.org> Date: Wed, 8 Jun 2022 12:17:18 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Jun 2022 12:17:18 -0000 https://gcc.gnu.org/g:31413ebacfec0f8d7b8c01b1903b76563b965177 commit 31413ebacfec0f8d7b8c01b1903b76563b965177 Author: Philip Herron Date: Thu Mar 10 13:26:06 2022 +0000 Add missing canonicalization of slices and raw pointer types When we intercept impl blocks for slices or raw pointers we must generate the canonical path for this for name resolution this adds in the missing visitors which will generate the path. Previously this was defaulting to empty path segments and then hitting an assertion when we append the empty segment. Fixes #1005 Diff: --- gcc/rust/resolve/rust-ast-resolve-type.cc | 39 +++++++++++++++++++++++++++++++ gcc/rust/resolve/rust-ast-resolve-type.h | 4 ++++ gcc/testsuite/rust/compile/issue-1005.rs | 4 ++++ 3 files changed, 47 insertions(+) diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc index 252d1cae8aa..c27501e1a29 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.cc +++ b/gcc/rust/resolve/rust-ast-resolve-type.cc @@ -167,6 +167,45 @@ ResolveTypeToCanonicalPath::visit (AST::ReferenceType &ref) result = result.append (ident_seg); } +void +ResolveTypeToCanonicalPath::visit (AST::RawPointerType &ref) +{ + auto inner_type + = ResolveTypeToCanonicalPath::resolve (*ref.get_type_pointed_to ().get (), + include_generic_args_flag, + type_resolve_generic_args_flag); + + std::string segment_string ("*"); + switch (ref.get_pointer_type ()) + { + case AST::RawPointerType::PointerType::MUT: + segment_string += "mut "; + break; + + case AST::RawPointerType::PointerType::CONST: + segment_string += "const "; + break; + } + + segment_string += inner_type.get (); + + auto ident_seg = CanonicalPath::new_seg (ref.get_node_id (), segment_string); + result = result.append (ident_seg); +} + +void +ResolveTypeToCanonicalPath::visit (AST::SliceType &slice) +{ + auto inner_type + = ResolveTypeToCanonicalPath::resolve (*slice.get_elem_type ().get (), + include_generic_args_flag, + type_resolve_generic_args_flag); + std::string segment_string = "[" + inner_type.get () + "]"; + auto ident_seg + = CanonicalPath::new_seg (slice.get_node_id (), segment_string); + result = result.append (ident_seg); +} + void ResolveType::visit (AST::ReferenceType &type) { diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h index d835e00c77c..6dcfb4495fc 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.h +++ b/gcc/rust/resolve/rust-ast-resolve-type.h @@ -122,6 +122,10 @@ public: } } + void visit (AST::SliceType &slice) override; + + void visit (AST::RawPointerType &ptr) override; + void visit (AST::ReferenceType &ref) override; void visit (AST::TypePathSegmentGeneric &seg) override; diff --git a/gcc/testsuite/rust/compile/issue-1005.rs b/gcc/testsuite/rust/compile/issue-1005.rs new file mode 100644 index 00000000000..46c85eea91e --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1005.rs @@ -0,0 +1,4 @@ +// { dg-additional-options "-w" } +impl *const T { + fn test(self) {} +}