xref: /llvm-project/clang/test/CodeGenCXX/vtable-key-function-address-space.cpp (revision 8acdcf4016876d122733991561be706b64026e73)
1*8acdcf40SAlex Voicu // RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - | FileCheck %s
2*8acdcf40SAlex Voicu // PR5697
3*8acdcf40SAlex Voicu namespace PR5697 {
4*8acdcf40SAlex Voicu struct A {
fPR5697::A5*8acdcf40SAlex Voicu   virtual void f() { }
6*8acdcf40SAlex Voicu   A();
7*8acdcf40SAlex Voicu   A(int);
8*8acdcf40SAlex Voicu };
9*8acdcf40SAlex Voicu 
10*8acdcf40SAlex Voicu // A does not have a key function, so the first constructor we emit should
11*8acdcf40SAlex Voicu // cause the vtable to be defined (without assertions.)
12*8acdcf40SAlex Voicu // CHECK: @_ZTVN6PR56971AE = linkonce_odr unnamed_addr addrspace(1) constant
A()13*8acdcf40SAlex Voicu A::A() { }
A(int)14*8acdcf40SAlex Voicu A::A(int) { }
15*8acdcf40SAlex Voicu }
16*8acdcf40SAlex Voicu 
17*8acdcf40SAlex Voicu // Make sure that we don't assert when building the vtable for a class
18*8acdcf40SAlex Voicu // template specialization or explicit instantiation with a key
19*8acdcf40SAlex Voicu // function.
20*8acdcf40SAlex Voicu template<typename T>
21*8acdcf40SAlex Voicu struct Base {
22*8acdcf40SAlex Voicu   virtual ~Base();
23*8acdcf40SAlex Voicu };
24*8acdcf40SAlex Voicu 
25*8acdcf40SAlex Voicu template<typename T>
26*8acdcf40SAlex Voicu struct Derived : public Base<T> { };
27*8acdcf40SAlex Voicu 
28*8acdcf40SAlex Voicu template<>
29*8acdcf40SAlex Voicu struct Derived<char> : public Base<char> {
30*8acdcf40SAlex Voicu   virtual void anchor();
31*8acdcf40SAlex Voicu };
32*8acdcf40SAlex Voicu 
anchor()33*8acdcf40SAlex Voicu void Derived<char>::anchor() { }
34