]> granicus.if.org Git - clang/commitdiff
Don't produce a vtable for a class if we have an explicit template instantiation...
authorRafael Espindola <rafael.espindola@gmail.com>
Sat, 3 Apr 2010 04:26:42 +0000 (04:26 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sat, 3 Apr 2010 04:26:42 +0000 (04:26 +0000)
Fixes PR6748

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100266 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGVtable.cpp
test/CodeGenCXX/vtable-linkage.cpp

index 2d1c73440bbef54ff018ad3d1072193593ddb749..fc6d1a8e37092ed806daab325efc4f5b82c2bd9e 100644 (file)
@@ -3146,11 +3146,16 @@ void CodeGenVTables::EmitVTableRelatedData(GlobalDecl GD) {
     if (KeyFunction->getCanonicalDecl() != MD->getCanonicalDecl())
       return;
   } else {
+    // If we have no key funcion and this is a explicit instantiation declaration,
+    // we will produce a vtable at the explicit instantiation. We don't need one
+    // here.
+    if (RDKind == clang::TSK_ExplicitInstantiationDeclaration)
+      return;
+
     // If this is an explicit instantiation of a method, we don't need a vtable.
     // Since we have no key function, we will emit the vtable when we see
     // a use, and just defining a function is not an use.
-    if ((RDKind == TSK_ImplicitInstantiation ||
-         RDKind == TSK_ExplicitInstantiationDeclaration) &&
+    if (RDKind == TSK_ImplicitInstantiation &&
         MDKind == TSK_ExplicitInstantiationDefinition)
       return;
   }
index a4ea2a19c23805ee9869ee3fccf8e9bba2d7146e..c75efe228dff5f44599c42029311bdb5792a5547 100644 (file)
@@ -128,10 +128,8 @@ void use_F(F<char> &fc) {
 // CHECK: @_ZTI1FIlE = weak_odr constant
 
 // F<int> is an explicit template instantiation declaration without a
-// key function, so its vtable should have weak_odr linkage.
-// CHECK: @_ZTV1FIiE = weak_odr constant
-// CHECK: @_ZTS1FIiE = weak_odr constant
-// CHECK: @_ZTI1FIiE = weak_odr constant
+// key function, so its vtable should have external linkage.
+// CHECK: @_ZTV1FIiE = external constant
 
 // E<int> is an explicit template instantiation declaration. It has a
 // key function that is not instantiated, so we should only reference