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 VoicuA::A() { } A(int)14*8acdcf40SAlex VoicuA::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 Voicuvoid Derived<char>::anchor() { } 34