xref: /llvm-project/clang/test/CodeGenCXX/vtable-constexpr-address-space.cpp (revision 8acdcf4016876d122733991561be706b64026e73)
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 Voicu constexpr 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 Voicu void C::f() {}
28