summaryrefslogtreecommitdiffstats
path: root/tests/ui/coherence/coherence-wasm-bindgen.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/coherence/coherence-wasm-bindgen.rs')
-rw-r--r--tests/ui/coherence/coherence-wasm-bindgen.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/ui/coherence/coherence-wasm-bindgen.rs b/tests/ui/coherence/coherence-wasm-bindgen.rs
new file mode 100644
index 000000000..ee09a7244
--- /dev/null
+++ b/tests/ui/coherence/coherence-wasm-bindgen.rs
@@ -0,0 +1,37 @@
+// Capture a coherence pattern from wasm-bindgen that we discovered as part of
+// future-compatibility warning #56105. This pattern currently receives a lint
+// warning but we probably want to support it long term.
+//
+// Key distinction: we are implementing once for `A` (take ownership) and one
+// for `&A` (borrow).
+//
+// c.f. #56105
+
+#![deny(coherence_leak_check)]
+
+trait IntoWasmAbi {
+ fn some_method(&self) {}
+}
+
+trait FromWasmAbi {}
+trait RefFromWasmAbi {}
+trait ReturnWasmAbi {}
+
+impl<'a, 'b, A, R> IntoWasmAbi for &'a (dyn Fn(A) -> R + 'b)
+where
+ A: FromWasmAbi,
+ R: ReturnWasmAbi,
+{
+}
+
+// Explicitly writing the bound lifetime.
+impl<'a, 'b, A, R> IntoWasmAbi for &'a (dyn for<'x> Fn(&'x A) -> R + 'b)
+where
+ A: RefFromWasmAbi,
+ R: ReturnWasmAbi,
+{
+ //~^^^^^ ERROR conflicting implementation
+ //~| WARNING this was previously accepted
+}
+
+fn main() {}