add tests for ICE: 'broken MIR: bad assignment: NoSolution' on trait with default method and no impls

Fixes #109869
This commit is contained in:
Matthias Krüger 2024-03-24 10:57:20 +01:00
parent e800b99347
commit e4d816e66c
6 changed files with 103 additions and 0 deletions

View File

@ -0,0 +1,21 @@
// ICE 'broken MIR: bad assignment: NoSolution'
// on trait with default method and no impls
// issue: rust-lang/rust#109869
type Spanned<T> = (T, ());
trait Span<T> {}
impl<T> Span<T> for (T, ()) {}
impl<F, T: From<F>> From<Spanned<F>> for dyn Span<T>
where
Self: Sized
{
fn from((from, ()): Spanned<F>) -> Self {
(T::from(from), ())
//~^ ERROR mismatched types
}
}
pub fn main() {}

View File

@ -0,0 +1,19 @@
error[E0308]: mismatched types
--> $DIR/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.rs:16:9
|
LL | fn from((from, ()): Spanned<F>) -> Self {
| ---- expected `(dyn Span<T> + 'static)` because of return type
LL | (T::from(from), ())
| ^^^^^^^^^^^^^^^^^^^ expected `dyn Span`, found `(T, ())`
|
= note: expected trait object `(dyn Span<T> + 'static)`
found tuple `(T, ())`
= help: `(T, ())` implements `Span` so you could box the found value and coerce it to the trait object `Box<dyn Span>`, you will have to change the expected type as well
help: call `Into::into` on this expression to convert `(T, ())` into `(dyn Span<T> + 'static)`
|
LL | (T::from(from), ()).into()
| +++++++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.

View File

@ -0,0 +1,17 @@
// ICE 'broken MIR: bad assignment: NoSolution'
// on trait with default method and no impls
// issue: rust-lang/rust#109869
trait Empty<T> {}
impl<T> Default for dyn Empty<T>
where
Self: Sized,
{
fn default() -> Self {
()
//~^ ERROR mismatched types
}
}
pub fn main() {}

View File

@ -0,0 +1,14 @@
error[E0308]: mismatched types
--> $DIR/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.rs:12:9
|
LL | fn default() -> Self {
| ---- expected `(dyn Empty<T> + 'static)` because of return type
LL | ()
| ^^ expected `dyn Empty`, found `()`
|
= note: expected trait object `(dyn Empty<T> + 'static)`
found unit type `()`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.

View File

@ -0,0 +1,18 @@
// ICE 'broken MIR: bad assignment: NoSolution'
// on trait with default method and no impls
// issue: rust-lang/rust#109869
#![feature(trivial_bounds)]
trait Empty {}
impl Default for dyn Empty
where
Self: Sized,
{
fn default() -> Self {
()
//~^ ERROR mismatched types
}
}
pub fn main() {}

View File

@ -0,0 +1,14 @@
error[E0308]: mismatched types
--> $DIR/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.rs:13:9
|
LL | fn default() -> Self {
| ---- expected `(dyn Empty + 'static)` because of return type
LL | ()
| ^^ expected `dyn Empty`, found `()`
|
= note: expected trait object `(dyn Empty + 'static)`
found unit type `()`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.