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