Skip to content

Commit

Permalink
add tests for ICE: 'broken MIR: bad assignment: NoSolution' on trait …
Browse files Browse the repository at this point in the history
…with default method and no impls

Fixes rust-lang#109869
  • Loading branch information
matthiaskrgr committed Mar 24, 2024
1 parent e800b99 commit e4d816e
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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`.
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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`.
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit e4d816e

Please sign in to comment.