summaryrefslogtreecommitdiffstats
path: root/tests/ui/codegen/subtyping-impacts-selection-1.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/codegen/subtyping-impacts-selection-1.rs')
-rw-r--r--tests/ui/codegen/subtyping-impacts-selection-1.rs44
1 files changed, 44 insertions, 0 deletions
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");
+}