summaryrefslogtreecommitdiffstats
path: root/tests/ui/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/codegen')
-rw-r--r--tests/ui/codegen/subtyping-enforces-type-equality.rs48
-rw-r--r--tests/ui/codegen/subtyping-enforces-type-equality.stderr1
-rw-r--r--tests/ui/codegen/subtyping-impacts-selection-1.rs44
-rw-r--r--tests/ui/codegen/subtyping-impacts-selection-2.rs12
4 files changed, 105 insertions, 0 deletions
diff --git a/tests/ui/codegen/subtyping-enforces-type-equality.rs b/tests/ui/codegen/subtyping-enforces-type-equality.rs
new file mode 100644
index 000000000..a5ffcb3f8
--- /dev/null
+++ b/tests/ui/codegen/subtyping-enforces-type-equality.rs
@@ -0,0 +1,48 @@
+// ignore-pass
+// build-pass
+// edition:2021
+use std::future::Future;
+use std::pin::Pin;
+
+type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
+
+fn main() {
+ let _ = wrapper_call(handler);
+}
+
+async fn wrapper_call(handler: impl Handler) {
+ handler.call().await;
+}
+async fn handler() {
+ f(&()).await;
+}
+async fn f<'a>(db: impl Acquire<'a>) {
+ db.acquire().await;
+}
+
+trait Handler {
+ type Future: Future;
+ fn call(self) -> Self::Future;
+}
+
+impl<Fut, F> Handler for F
+where
+ F: Fn() -> Fut,
+ Fut: Future,
+{
+ type Future = Fut;
+ fn call(self) -> Self::Future {
+ loop {}
+ }
+}
+
+trait Acquire<'a> {
+ type Connection;
+ fn acquire(self) -> BoxFuture<Self::Connection>;
+}
+impl<'a> Acquire<'a> for &'a () {
+ type Connection = Self;
+ fn acquire(self) -> BoxFuture<Self> {
+ loop {}
+ }
+}
diff --git a/tests/ui/codegen/subtyping-enforces-type-equality.stderr b/tests/ui/codegen/subtyping-enforces-type-equality.stderr
new file mode 100644
index 000000000..870ca0f83
--- /dev/null
+++ b/tests/ui/codegen/subtyping-enforces-type-equality.stderr
@@ -0,0 +1 @@
+WARN rustc_codegen_ssa::mir::locals Unexpected initial operand type. See the issues/114858
diff --git a/tests/ui/codegen/subtyping-impacts-selection-1.rs b/tests/ui/codegen/subtyping-impacts-selection-1.rs
new file mode 100644
index 000000000..09e06f6d6
--- /dev/null
+++ b/tests/ui/codegen/subtyping-impacts-selection-1.rs
@@ -0,0 +1,44 @@
+// run-pass
+// revisions: mir codegen
+//[mir] compile-flags: -Zmir-opt-level=3
+//[codegen] compile-flags: -Zmir-opt-level=0
+
+// A regression test for #107205
+#![allow(coherence_leak_check)]
+struct Foo<T: 'static>(T);
+
+fn useful<'a>(_: &'a u8) {}
+
+trait GetInner {
+ type Assoc;
+ fn muahaha(&mut self) -> Self::Assoc;
+}
+
+impl GetInner for Foo<fn(&'static u8)> {
+ type Assoc = String;
+ fn muahaha(&mut self) -> String {
+ String::from("I am a string")
+ }
+}
+
+impl GetInner for Foo<for<'a> fn(&'a u8)> {
+ type Assoc = [usize; 3];
+ fn muahaha(&mut self) -> [usize; 3] {
+ [100; 3]
+ }
+}
+
+fn break_me(hr_fnptr: Box<Foo::<for<'a> fn(&'a u8)>>) -> Box<dyn GetInner<Assoc = String>> {
+ let lr_fnptr = hr_fnptr as Box<Foo<fn(&'static u8)>>;
+ lr_fnptr as Box<dyn GetInner<Assoc = String>>
+}
+
+fn main() {
+ drop(Box::new(Foo(useful as fn(&'static u8))) as Box<dyn GetInner<Assoc = String>>);
+ drop(Box::new(Foo(useful as fn(&u8))) as Box<dyn GetInner<Assoc = [usize; 3]>>);
+
+ let mut any = break_me(Box::new(Foo(useful)));
+
+ let evil_string = any.muahaha();
+ assert_eq!(evil_string, "I am a string");
+}
diff --git a/tests/ui/codegen/subtyping-impacts-selection-2.rs b/tests/ui/codegen/subtyping-impacts-selection-2.rs
new file mode 100644
index 000000000..921136775
--- /dev/null
+++ b/tests/ui/codegen/subtyping-impacts-selection-2.rs
@@ -0,0 +1,12 @@
+// run-pass
+// revisions: mir codegen
+//[mir] compile-flags: -Zmir-opt-level=3
+//[codegen] compile-flags: -Zmir-opt-level=0
+
+// A regression test for #107205
+
+const X: for<'b> fn(&'b ()) = |&()| ();
+fn main() {
+ let dyn_debug = Box::new(X) as Box<fn(&'static ())> as Box<dyn Send>;
+ drop(dyn_debug)
+}