summaryrefslogtreecommitdiffstats
path: root/src/test/ui/coherence/coherence-fn-inputs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/coherence/coherence-fn-inputs.rs')
-rw-r--r--src/test/ui/coherence/coherence-fn-inputs.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/test/ui/coherence/coherence-fn-inputs.rs b/src/test/ui/coherence/coherence-fn-inputs.rs
new file mode 100644
index 000000000..3afec5c54
--- /dev/null
+++ b/src/test/ui/coherence/coherence-fn-inputs.rs
@@ -0,0 +1,25 @@
+// Test that we consider these two types completely equal:
+//
+// * `for<'a, 'b> fn(&'a u32, &'b u32)`
+// * `for<'c> fn(&'c u32, &'c u32)`
+//
+// For a long time we considered these to be distinct types. But in fact they
+// are equivalent, if you work through the implications of subtyping -- this is
+// because:
+//
+// * `'c` can be the intersection of `'a` and `'b` (and there is always an intersection)
+// * `'a` and `'b` can both be equal to `'c`
+
+trait Trait {}
+impl Trait for for<'a, 'b> fn(&'a u32, &'b u32) {}
+impl Trait for for<'c> fn(&'c u32, &'c u32) {
+ //~^ ERROR conflicting implementations
+ //
+ // Note in particular that we do NOT get a future-compatibility warning
+ // here. This is because the new leak-check proposed in [MCP 295] does not
+ // "error" when these two types are equated.
+ //
+ // [MCP 295]: https://github.com/rust-lang/compiler-team/issues/295
+}
+
+fn main() {}