| //@ compile-flags: -Cno-prepopulate-passes -Copt-level=0 |
| |
| #![crate_type = "lib"] |
| |
| #[no_mangle] |
| pub fn demo_for_i32() { |
| generic_impl::<i32>(); |
| } |
| |
| // Two important things here: |
| // - We replace the "then" block with `unreachable` to avoid linking problems |
| // - We neither declare nor define the `big_impl` that said block "calls". |
| |
| // CHECK-LABEL: ; skip_mono_inside_if_false::generic_impl |
| // CHECK: start: |
| // CHECK-NEXT: br label %[[ELSE_BRANCH:bb[0-9]+]] |
| // CHECK: [[ELSE_BRANCH]]: |
| // CHECK-NEXT: call skip_mono_inside_if_false::small_impl |
| // CHECK: bb{{[0-9]+}}: |
| // CHECK-NEXT: ret void |
| // CHECK: bb{{[0-9+]}}: |
| // CHECK-NEXT: unreachable |
| |
| fn generic_impl<T>() { |
| trait MagicTrait { |
| const IS_BIG: bool; |
| } |
| impl<T> MagicTrait for T { |
| const IS_BIG: bool = std::mem::size_of::<T>() > 10; |
| } |
| if T::IS_BIG { |
| big_impl::<T>(); |
| } else { |
| small_impl::<T>(); |
| } |
| } |
| |
| #[inline(never)] |
| fn small_impl<T>() {} |
| #[inline(never)] |
| fn big_impl<T>() {} |