diff options
author | Philip Herron <philip.herron@embecosm.com> | 2022-03-10 13:26:06 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2022-03-10 16:42:36 +0000 |
commit | 31413ebacfec0f8d7b8c01b1903b76563b965177 (patch) | |
tree | cc5cec3321611bf31cdab3422a9c28eefb0f1916 /gcc | |
parent | 77a49507446b67a6c207b4e4fec3639f536b9eca (diff) | |
download | gcc-31413ebacfec0f8d7b8c01b1903b76563b965177.zip gcc-31413ebacfec0f8d7b8c01b1903b76563b965177.tar.gz gcc-31413ebacfec0f8d7b8c01b1903b76563b965177.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-type.cc | 39 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-type.h | 4 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-1005.rs | 4 |
3 files changed, 47 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc index 252d1ca..c27501e 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.cc +++ b/gcc/rust/resolve/rust-ast-resolve-type.cc @@ -168,6 +168,45 @@ ResolveTypeToCanonicalPath::visit (AST::ReferenceType &ref) } 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) { type.get_type_referenced ()->accept_vis (*this); diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h index d835e00..6dcfb44 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 0000000..46c85ee --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1005.rs @@ -0,0 +1,4 @@ +// { dg-additional-options "-w" } +impl<T> *const T { + fn test(self) {} +} |