aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2023-03-24 22:17:36 +0000
committerPhilip Herron <philip.herron@embecosm.com>2023-03-24 23:23:18 +0000
commit03bce1d0847bff5870e8ed18799a8b2c6ab4728d (patch)
tree42e7b59d60d990d90fc2bb10e242bfbf1e45627b
parentc6c02b9135e54e181ea6bdd8892a243c50cb6c7a (diff)
downloadgcc-03bce1d0847bff5870e8ed18799a8b2c6ab4728d.zip
gcc-03bce1d0847bff5870e8ed18799a8b2c6ab4728d.tar.gz
gcc-03bce1d0847bff5870e8ed18799a8b2c6ab4728d.tar.bz2
gccrs: Fix ICE on parsing trait object missing dyn keyword
Trait objects are not required to use the 'dyn' keyword though it is depreciated in later editions/version of Rustc. This patch handles the case when we query the type for an HIR::Item which happens to be an HIR::Trait and return a trait object or error. Fixes #2037 gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): return a TraitObject gcc/testsuite/ChangeLog: * rust/compile/issue-2037.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-item.cc12
-rw-r--r--gcc/testsuite/rust/compile/issue-2037.rs13
2 files changed, 24 insertions, 1 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc b/gcc/rust/typecheck/rust-hir-type-check-item.cc
index ab7292f..c826536 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc
@@ -456,7 +456,17 @@ TypeCheckItem::visit (HIR::Module &module)
void
TypeCheckItem::visit (HIR::Trait &trait)
{
- TraitResolver::Resolve (trait);
+ TraitReference *trait_ref = TraitResolver::Resolve (trait);
+ if (trait_ref->is_error ())
+ {
+ infered = new TyTy::ErrorType (trait.get_mappings ().get_hirid ());
+ return;
+ }
+
+ RustIdent ident{CanonicalPath::create_empty (), trait.get_locus ()};
+ infered = new TyTy::DynamicObjectType (
+ trait.get_mappings ().get_hirid (), ident,
+ {TyTy::TypeBoundPredicate (*trait_ref, trait.get_locus ())});
}
void
diff --git a/gcc/testsuite/rust/compile/issue-2037.rs b/gcc/testsuite/rust/compile/issue-2037.rs
new file mode 100644
index 0000000..ec27a0d
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2037.rs
@@ -0,0 +1,13 @@
+trait Foo {
+ fn bar(&mut self, other: &mut Foo);
+}
+
+struct Baz;
+
+impl Foo for Baz {
+ fn bar(&mut self, other: &Foo) {}
+ // { dg-error "expected" "" { target *-*-* } .-1 }
+ // { dg-error "method .bar. has an incompatible type for trait .Foo." "" { target *-*-* } .-2 }
+}
+
+fn main() {}