//@ 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 // See comment below for why this test exists. trait Tr { type Projection; } impl Tr for F where F: Fn() -> U { type Projection = U; } fn test, U>(b: B) -> B::Projection { todo!() } fn main() { fn rpit_fn() -> impl Sized {} // When CFI runs, it tries to compute the signature of the call. This // ends up giving us a signature of: // `fn test::() -> >::Projection`, // where `rpit_fn` is the ZST FnDef for the function. However, we were // previously using a Reveal::UserFacing param-env. This means that the // `>::Projection` return type is impossible to normalize, // since it would require proving `rpit_fn: Fn() -> ()`, but we cannot // prove that the `impl Sized` opaque is `()` with a user-facing param-env. // This leads to a normalization error, and then an ICE. // // Side-note: // So why is the second generic of `test` "`()`", and not the // `impl Sized` since we inferred it from the return type of `rpit_fn` // during typeck? Well, that's because we're using the generics from the // terminator of the MIR, which has had the RevealAll pass performed on it. let _ = test(rpit_fn); }