aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-03-10 13:26:06 +0000
committerPhilip Herron <philip.herron@embecosm.com>2022-03-10 16:42:36 +0000
commit31413ebacfec0f8d7b8c01b1903b76563b965177 (patch)
treecc5cec3321611bf31cdab3422a9c28eefb0f1916 /gcc
parent77a49507446b67a6c207b4e4fec3639f536b9eca (diff)
downloadgcc-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.cc39
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.h4
-rw-r--r--gcc/testsuite/rust/compile/issue-1005.rs4
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) {}
+}