// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s | FileCheck %s // RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s -fexperimental-new-constant-interpreter | FileCheck %s template struct Wrapper { T *Val; template constexpr Wrapper(_Up&& __u) { T& __f = static_cast<_Up&&>(__u); Val = &__f; } constexpr T& get() const { return *Val; } }; void f(){} int main() { auto W = Wrapper(f); if (&W.get() != &f) __builtin_abort(); } /// We used to convert do the pointer->fnptr conversion /// by doing an integer conversion in between, which caused the /// %0 line to be: /// store ptr inttoptr (i64 138574454870464 to ptr), ptr %__f, align 8 // CHECK: @_ZN7WrapperIFvvEEC2IRS0_EEOT_ // CHECK: %0 = load ptr, ptr %__u.addr