From 750f511f11d49f5632880a38eca97818e872961c Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Mon, 24 Mar 2014 23:54:09 +0000 Subject: Fix a bug where an explicit instantiation declaration of a class template specialization would make us think it might have a key function. llvm-svn: 204686 --- clang/test/CodeGenCXX/template-instantiation.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'clang/test/CodeGenCXX/template-instantiation.cpp') diff --git a/clang/test/CodeGenCXX/template-instantiation.cpp b/clang/test/CodeGenCXX/template-instantiation.cpp index 80283a1edd0..3baa946b0b1 100644 --- a/clang/test/CodeGenCXX/template-instantiation.cpp +++ b/clang/test/CodeGenCXX/template-instantiation.cpp @@ -5,11 +5,15 @@ // // CHECK-NOT: @_ZTVN5test118stdio_sync_filebufIwEE = constant // CHECK-NOT: _ZTVN5test315basic_fstreamXXIcEE -// CHECK: @_ZTVN5test018stdio_sync_filebufIwEE = unnamed_addr constant +// CHECK-NOT: @_ZTVN5test018stdio_sync_filebufIA1_iEE +// CHECK-NOT: @_ZTVN5test018stdio_sync_filebufIA2_iEE +// CHECK: @_ZTVN5test018stdio_sync_filebufIA3_iEE = weak_odr unnamed_addr constant // CHECK: @_ZN7PR100011SIiE3arrE = weak_odr global [3 x i32] // CHECK-NOT: @_ZN7PR100011SIiE3arr2E = weak_odr global [3 x i32]A +// CHECK: @_ZTVN5test018stdio_sync_filebufIA4_iEE = linkonce_odr unnamed_addr constant + // CHECK-NOT: _ZTVN5test31SIiEE // CHECK-NOT: _ZTSN5test31SIiEE @@ -39,11 +43,21 @@ namespace test0 { virtual void xsgetn(); }; - // This specialization should cause the vtable to be emitted, even with - // the following extern template declaration. - template<> void stdio_sync_filebuf::xsgetn() { + // This specialization is not a key function, so doesn't cause the vtable to + // be instantiated unless we're instantiating a class definition anyway. + template<> void stdio_sync_filebuf::xsgetn() { + } + template<> void stdio_sync_filebuf::xsgetn() { + } + template<> void stdio_sync_filebuf::xsgetn() { } - extern template class stdio_sync_filebuf; + template<> void stdio_sync_filebuf::xsgetn() { + } + extern template class stdio_sync_filebuf; + + // These two both cause vtables to be emitted. + template class stdio_sync_filebuf; + stdio_sync_filebuf implicit_instantiation; } namespace test1 { -- cgit v1.2.3