add tests for unsound subtype handling
This commit is contained in:
parent
c911e08514
commit
c5943307ec
44
tests/ui/codegen/subtyping-impacts-selection-1.rs
Normal file
44
tests/ui/codegen/subtyping-impacts-selection-1.rs
Normal file
@ -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");
|
||||
}
|
12
tests/ui/codegen/subtyping-impacts-selection-2.rs
Normal file
12
tests/ui/codegen/subtyping-impacts-selection-2.rs
Normal file
@ -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)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user