diff options
| author | lcnr <rust@lcnr.de> | 2023-06-09 13:12:45 +0200 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2023-06-19 09:01:29 +0200 |
| commit | c5943307ec68e82bcfcb7604a4ebb2bbab6a0272 (patch) | |
| tree | 1894d66900b0f9f3c0a181ae39fb72bc24078a99 | |
| parent | c911e085144324110b4b51b333e71444861b0d17 (diff) | |
| download | rust-c5943307ec68e82bcfcb7604a4ebb2bbab6a0272.tar.gz rust-c5943307ec68e82bcfcb7604a4ebb2bbab6a0272.zip | |
add tests for unsound subtype handling
| -rw-r--r-- | tests/ui/codegen/subtyping-impacts-selection-1.rs | 44 | ||||
| -rw-r--r-- | tests/ui/codegen/subtyping-impacts-selection-2.rs | 12 |
2 files changed, 56 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 00000000000..09e06f6d684 --- /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 00000000000..921136775b7 --- /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) +} |
