From 31413ebacfec0f8d7b8c01b1903b76563b965177 Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Thu, 10 Mar 2022 13:26:06 +0000 Subject: [PATCH] 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 --- 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(+) create mode 100644 gcc/testsuite/rust/compile/issue-1005.rs diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc index 252d1cae8aa9..c27501e1a29b 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 d835e00c77c3..6dcfb4495fc6 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.h +++ b/gcc/rust/resolve/rust-ast-resolve-type.h @@ -122,6 +122,10 @@ class ResolveTypeToCanonicalPath : public ResolverBase } } + 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 000000000000..46c85eea91e8 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1005.rs @@ -0,0 +1,4 @@ +// { dg-additional-options "-w" } +impl *const T { + fn test(self) {} +}