CFI: Erase regions when projecting ADT to its transparent non-1zst field

This commit is contained in:
Michael Goulet 2024-08-16 21:33:44 -04:00
parent a73bc4a131
commit c8ae02fb84
2 changed files with 19 additions and 1 deletions

View File

@ -146,7 +146,7 @@ fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
!is_zst
});
if let Some(field) = field {
let ty0 = self.tcx.type_of(field.did).instantiate(self.tcx, args);
let ty0 = self.tcx.erase_regions(field.ty(self.tcx, args));
// Generalize any repr(transparent) user-defined type that is either a
// pointer or reference, and either references itself or any other type that
// contains or references itself, to avoid a reference cycle.

View File

@ -0,0 +1,18 @@
//@ needs-sanitizer-cfi
//@ compile-flags: -Ccodegen-units=1 -Clto -Ctarget-feature=-crt-static -Zsanitizer=cfi
//@ no-prefer-dynamic
//@ only-x86_64-unknown-linux-gnu
//@ build-pass
pub trait Trait {}
impl Trait for i32 {}
#[repr(transparent)]
struct BoxedTrait(Box<dyn Trait + 'static>);
fn hello(x: BoxedTrait) {}
fn main() {
hello(BoxedTrait(Box::new(1)));
}