Quellcode durchsuchen

Don't try emitting dllexported explicitly defaulted non-trivial ctors twice during explicit template instantiation definition (PR42857)

Trying to emit the definition twice triggers an assert.

Differential revision: https://reviews.llvm.org/D65579

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@367661 91177308-0d34-0410-b5e6-96231b3b80d8
Hans Wennborg vor 6 Jahren
Ursprung
Commit
0743ec24e3
2 geänderte Dateien mit 14 neuen und 1 gelöschten Zeilen
  1. 7 1
      lib/Sema/SemaDeclCXX.cpp
  2. 7 0
      test/CodeGenCXX/dllexport.cpp

+ 7 - 1
lib/Sema/SemaDeclCXX.cpp

@@ -11543,7 +11543,13 @@ void Sema::ActOnFinishCXXNonNestedClass(Decl *D) {
     std::swap(DelayedDllExportMemberFunctions, WorkList);
     for (CXXMethodDecl *M : WorkList) {
       DefineImplicitSpecialMember(*this, M, M->getLocation());
-      ActOnFinishInlineFunctionDef(M);
+
+      // Pass the method to the consumer to get emitted. This is not necessary
+      // for explicit instantiation definitions, as they will get emitted
+      // anyway.
+      if (M->getParent()->getTemplateSpecializationKind() !=
+          TSK_ExplicitInstantiationDefinition)
+        ActOnFinishInlineFunctionDef(M);
     }
   }
 }

+ 7 - 0
test/CodeGenCXX/dllexport.cpp

@@ -860,6 +860,13 @@ struct PR40006 {
 };
 // M32-DAG: define weak_odr dso_local dllexport x86_thiscallcc %"struct.InClassInits::PR40006"* @"??0PR40006@InClassInits@@QAE@XZ"
 
+// PR42857: Clang would try to emit the non-trivial explicitly defaulted
+// dllexport ctor twice when doing an explicit instantiation definition.
+struct Qux { Qux(); };
+template <typename T> struct PR42857 { __declspec(dllexport) PR42857() = default; Qux q; };
+template struct PR42857<int>;
+// M32-DAG: define weak_odr dso_local dllexport x86_thiscallcc %"struct.InClassInits::PR42857"* @"??0?$PR42857@H@InClassInits@@QAE@XZ"
+
 }
 
 // We had an issue where instantiating A would force emission of B's delayed