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.
This commit is contained in:
Philip Herron
2022-10-05 17:24:42 +01:00
committed by Arthur Cohen
parent 31b77593ed
commit a5d3586a9b
2 changed files with 67 additions and 0 deletions

View File

@@ -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 ();
}

View File

@@ -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);
}