about summary refs log tree commit diff
path: root/tests/ui/impl-trait/auto-trait-selection-freeze.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/impl-trait/auto-trait-selection-freeze.rs')
-rw-r--r--tests/ui/impl-trait/auto-trait-selection-freeze.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/ui/impl-trait/auto-trait-selection-freeze.rs b/tests/ui/impl-trait/auto-trait-selection-freeze.rs
new file mode 100644
index 00000000000..72c24c51962
--- /dev/null
+++ b/tests/ui/impl-trait/auto-trait-selection-freeze.rs
@@ -0,0 +1,24 @@
+//! This test shows how we fail selection in a way that can influence
+//! selection in a code path that succeeds.
+
+//@ revisions: next old
+//@[next] compile-flags: -Znext-solver
+//@[old]check-pass
+
+#![feature(freeze)]
+
+use std::marker::Freeze;
+
+fn is_trait<T: Trait<U>, U: Default>(_: T) -> U {
+    Default::default()
+}
+
+trait Trait<T> {}
+impl<T: Freeze> Trait<u32> for T {}
+impl<T> Trait<i32> for T {}
+fn foo() -> impl Sized {
+    if false { is_trait(foo()) } else { Default::default() }
+    //[next]~^ ERROR: type annotations needed
+}
+
+fn main() {}