aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-10-05 17:24:42 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2023-02-21 12:36:32 +0100
commita5d3586a9b159dd7c93992875b89605bedd0a60a (patch)
treeb019a09ec6c7ad201fa8e02afd0086722c8e9d9e
parent31b77593edbf623fb8f84e35baeb927fdd7c55b6 (diff)
downloadgcc-a5d3586a9b159dd7c93992875b89605bedd0a60a.zip
gcc-a5d3586a9b159dd7c93992875b89605bedd0a60a.tar.gz
gcc-a5d3586a9b159dd7c93992875b89605bedd0a60a.tar.bz2
gccrs: Support looking up super traits for trait items
When supporting calls to super traits we need to allow lookups based on the super traits as specified on the TraitReferences. Fixes #1555 gcc/rust/ChangeLog: * typecheck/rust-hir-trait-ref.h (lookup_trait_item): Add lookup in super_trait. gcc/testsuite/ChangeLog: * rust/compile/torture/issue-1555.rs: New test.
-rw-r--r--gcc/rust/typecheck/rust-hir-trait-ref.h19
-rw-r--r--gcc/testsuite/rust/compile/torture/issue-1555.rs48
2 files changed, 67 insertions, 0 deletions
diff --git a/gcc/rust/typecheck/rust-hir-trait-ref.h b/gcc/rust/typecheck/rust-hir-trait-ref.h
index f6a3328..7eeb330 100644
--- a/gcc/rust/typecheck/rust-hir-trait-ref.h
+++ b/gcc/rust/typecheck/rust-hir-trait-ref.h
@@ -336,6 +336,15 @@ public:
return true;
}
}
+
+ // lookup super traits
+ for (const auto &super_trait : super_traits)
+ {
+ bool found = super_trait->lookup_trait_item (ident, ref);
+ if (found)
+ return true;
+ }
+
return false;
}
@@ -351,6 +360,16 @@ public:
if (ident.compare (item.get_identifier ()) == 0)
return &item;
}
+
+ // lookup super traits
+ for (const auto &super_trait : super_traits)
+ {
+ const TraitItemReference *res
+ = super_trait->lookup_trait_item (ident, type);
+ if (!res->is_error ())
+ return res;
+ }
+
return &TraitItemReference::error_node ();
}
diff --git a/gcc/testsuite/rust/compile/torture/issue-1555.rs b/gcc/testsuite/rust/compile/torture/issue-1555.rs
new file mode 100644
index 0000000..adb4891
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/issue-1555.rs
@@ -0,0 +1,48 @@
+extern "C" {
+ fn printf(s: *const i8, ...);
+}
+
+struct Foo(i32);
+trait Bar {
+ fn baz(&self);
+}
+
+trait Baz: Bar {
+ fn qux(&self);
+}
+
+impl Bar for Foo {
+ fn baz(&self) {
+ unsafe {
+ let a = "baz %i\n\0";
+ let b = a as *const str;
+ let c = b as *const i8;
+
+ printf(c, self.0);
+ }
+ }
+}
+
+impl Baz for Foo {
+ fn qux(&self) {
+ unsafe {
+ let a = "qux %i\n\0";
+ let b = a as *const str;
+ let c = b as *const i8;
+
+ printf(c, self.0);
+ }
+ }
+}
+
+fn static_dispatch<T: Baz>(t: &T) {
+ t.baz();
+ t.qux();
+}
+
+pub fn main() {
+ let a;
+ a = &Foo(123);
+
+ static_dispatch(a);
+}