add tests for ICE: 'broken MIR: bad assignment: NoSolution' on trait with default method and no impls
Fixes #109869
This commit is contained in:
parent
e800b99347
commit
e4d816e66c
@ -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() {}
|
@ -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`.
|
@ -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() {}
|
@ -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`.
|
@ -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() {}
|
@ -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`.
|
Loading…
Reference in New Issue
Block a user