1*8acdcf40SAlex Voicu // RUN: %clang_cc1 -std=c++20 -triple=amdgcn-amd-amdhsa %s -emit-llvm -o - | FileCheck %s --implicit-check-not=DoNotEmit 2*8acdcf40SAlex Voicu 3*8acdcf40SAlex Voicu // constexpr virtual functions can be called at runtime and go in the vtable as 4*8acdcf40SAlex Voicu // normal. But they are implicitly inline so are never the key function. 5*8acdcf40SAlex Voicu 6*8acdcf40SAlex Voicu struct DoNotEmit { 7*8acdcf40SAlex Voicu virtual constexpr void f(); 8*8acdcf40SAlex Voicu }; f()9*8acdcf40SAlex Voicuconstexpr void DoNotEmit::f() {} 10*8acdcf40SAlex Voicu 11*8acdcf40SAlex Voicu // CHECK-DAG: @_ZTV1B = {{.*}} addrspace(1) constant { [3 x ptr addrspace(1)] } { {{.*}} null, {{.*}} @_ZTI1B, {{.*}} @_ZN1B1fEv 12*8acdcf40SAlex Voicu struct B { 13*8acdcf40SAlex Voicu // CHECK-DAG: define {{.*}} @_ZN1B1fEv fB14*8acdcf40SAlex Voicu virtual constexpr void f() {} 15*8acdcf40SAlex Voicu }; 16*8acdcf40SAlex Voicu B b; 17*8acdcf40SAlex Voicu 18*8acdcf40SAlex Voicu struct CBase { 19*8acdcf40SAlex Voicu virtual constexpr void f(); // not key function 20*8acdcf40SAlex Voicu }; 21*8acdcf40SAlex Voicu 22*8acdcf40SAlex Voicu // CHECK-DAG: @_ZTV1C = {{.*}} addrspace(1) constant {{.*}} null, {{.*}} @_ZTI1C, {{.*}} @_ZN1C1fEv 23*8acdcf40SAlex Voicu struct C : CBase { 24*8acdcf40SAlex Voicu void f(); // key function 25*8acdcf40SAlex Voicu }; 26*8acdcf40SAlex Voicu // CHECK-DAG: define {{.*}} @_ZN1C1fEv f()27*8acdcf40SAlex Voicuvoid C::f() {} 28