summaryrefslogtreecommitdiffstats
path: root/src/test/ui/specialization/issue-39448.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/specialization/issue-39448.rs')
-rw-r--r--src/test/ui/specialization/issue-39448.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/test/ui/specialization/issue-39448.rs b/src/test/ui/specialization/issue-39448.rs
new file mode 100644
index 000000000..a15c4bd6b
--- /dev/null
+++ b/src/test/ui/specialization/issue-39448.rs
@@ -0,0 +1,50 @@
+#![feature(specialization)] //~ WARN the feature `specialization` is incomplete
+
+// Regression test for a specialization-related ICE (#39448).
+
+trait A: Sized {
+ fn foo(self, _: Self) -> Self {
+ self
+ }
+}
+
+impl A for u8 {}
+impl A for u16 {}
+
+impl FromA<u8> for u16 {
+ fn from(x: u8) -> u16 {
+ x as u16
+ }
+}
+
+trait FromA<T> {
+ fn from(t: T) -> Self;
+}
+
+impl<T: A, U: A + FromA<T>> FromA<T> for U {
+ default fn from(x: T) -> Self {
+ ToA::to(x)
+ }
+}
+
+trait ToA<T> {
+ fn to(self) -> T;
+}
+
+impl<T, U> ToA<U> for T
+where
+ U: FromA<T>,
+{
+ fn to(self) -> U {
+ U::from(self)
+ }
+}
+
+#[allow(dead_code)]
+fn foo<T: A, U: A>(x: T, y: U) -> U {
+ x.foo(y.to()).to() //~ ERROR overflow evaluating the requirement
+}
+
+fn main() {
+ let z = foo(8u8, 1u16);
+}