about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-03-24 10:57:20 +0100
committerMatthias Krüger <matthias.krueger@famsik.de>2024-03-24 10:57:20 +0100
commite4d816e66c9de3e78a330cd27287c10b831b1c14 (patch)
tree0b3e600fdf2e9b9ee6d9b3bbeb09a316833e359d
parente800b99347b88dc90bb105a0551011ac01ead624 (diff)
downloadrust-e4d816e66c9de3e78a330cd27287c10b831b1c14.tar.gz
rust-e4d816e66c9de3e78a330cd27287c10b831b1c14.zip
add tests for ICE: 'broken MIR: bad assignment: NoSolution' on trait with default method and no impls
Fixes #109869
-rw-r--r--tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.rs21
-rw-r--r--tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.stderr19
-rw-r--r--tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.rs17
-rw-r--r--tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.stderr14
-rw-r--r--tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.rs18
-rw-r--r--tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.stderr14
6 files changed, 103 insertions, 0 deletions
diff --git a/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.rs b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.rs
new file mode 100644
index 00000000000..5cccda62608
--- /dev/null
+++ b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.rs
@@ -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() {}
diff --git a/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.stderr b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.stderr
new file mode 100644
index 00000000000..d43c9c01821
--- /dev/null
+++ b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.stderr
@@ -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`.
diff --git a/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.rs b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.rs
new file mode 100644
index 00000000000..2e0179fb164
--- /dev/null
+++ b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.rs
@@ -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() {}
diff --git a/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.stderr b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.stderr
new file mode 100644
index 00000000000..5f00ced09b8
--- /dev/null
+++ b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.stderr
@@ -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`.
diff --git a/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.rs b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.rs
new file mode 100644
index 00000000000..d8bc2a4321e
--- /dev/null
+++ b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.rs
@@ -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() {}
diff --git a/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.stderr b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.stderr
new file mode 100644
index 00000000000..872b7f5cee1
--- /dev/null
+++ b/tests/ui/traits/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.stderr
@@ -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`.