]> granicus.if.org Git - clang/commitdiff
MS ABI: Build C++ default argument exprs for exported template classes
authorReid Kleckner <reid@kleckner.net>
Tue, 17 Mar 2015 21:51:43 +0000 (21:51 +0000)
committerReid Kleckner <reid@kleckner.net>
Tue, 17 Mar 2015 21:51:43 +0000 (21:51 +0000)
This was an omission from r232229.

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

include/clang/Sema/Sema.h
lib/CodeGen/MicrosoftCXXABI.cpp
lib/Parse/ParseDeclCXX.cpp
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaTemplateInstantiate.cpp
test/CodeGenCXX/dllexport.cpp

index 30d35f61c22fd108ca4eee8e3369838690beea9e..7671ab3f3a1fe745e24787d0ebc4618758256916 100644 (file)
@@ -5012,7 +5012,7 @@ public:
                                          SourceLocation RBrac,
                                          AttributeList *AttrList);
   void ActOnFinishCXXMemberDecls();
-  void ActOnFinishCXXMethodDefs(Decl *D);
+  void ActOnFinishCXXMemberDefaultArgs(Decl *D);
 
   void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param);
   unsigned ActOnReenterTemplateScope(Scope *S, Decl *Template);
index 6417b87444d32ea5fcc041671c8ad781650c5660..b09d658c820886c0b47dba1b09f68b78eda5aeeb 100644 (file)
@@ -3411,8 +3411,11 @@ MicrosoftCXXABI::getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD,
 
   // Add the rest of the default arguments.
   std::vector<Stmt *> ArgVec;
-  for (unsigned I = IsCopy ? 1 : 0, E = CD->getNumParams(); I != E; ++I)
-    ArgVec.push_back(getContext().getDefaultArgExprForConstructor(CD, I));
+  for (unsigned I = IsCopy ? 1 : 0, E = CD->getNumParams(); I != E; ++I) {
+    Stmt *DefaultArg = getContext().getDefaultArgExprForConstructor(CD, I);
+    assert(DefaultArg && "sema forgot to instantiate default args");
+    ArgVec.push_back(DefaultArg);
+  }
 
   CodeGenFunction::RunCleanupsScope Cleanups(CGF);
 
index d5497085f2d76f017cee714ff14c8de11216ac0c..c5655941187d2ad8adb59a846e2b81d11f9a22eb 100644 (file)
@@ -2918,7 +2918,7 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc,
 
     // We've finished parsing everything, including default argument
     // initializers.
-    Actions.ActOnFinishCXXMethodDefs(TagDecl);
+    Actions.ActOnFinishCXXMemberDefaultArgs(TagDecl);
   }
 
   if (TagDecl)
index 4e64595e11412456a6789a4468916c46b3bb5d6a..f7183bc2c4a6a5b77cdf6edfd42bc14d839e5a75 100644 (file)
@@ -9449,7 +9449,7 @@ static void getDefaultArgExprsForConstructors(Sema &S, CXXRecordDecl *Class) {
   }
 }
 
-void Sema::ActOnFinishCXXMethodDefs(Decl *D) {
+void Sema::ActOnFinishCXXMemberDefaultArgs(Decl *D) {
   auto *RD = dyn_cast<CXXRecordDecl>(D);
 
   // Default constructors that are annotated with __declspec(dllexport) which
index 8ea1e6be9110513d293bcee519acc1c6e08dda81..8e4fe85077fe54c2665cb62d09f3534de06cbffd 100644 (file)
@@ -2043,6 +2043,10 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation,
               SourceLocation(), SourceLocation(), nullptr);
   CheckCompletedCXXClass(Instantiation);
 
+  // Default arguments are parsed, if not instantiated. We can go instantiate
+  // default arg exprs for default constructors if necessary now.
+  ActOnFinishCXXMemberDefaultArgs(Instantiation);
+
   // Instantiate late parsed attributes, and attach them to their decls.
   // See Sema::InstantiateAttrs
   for (LateInstantiatedAttrVec::iterator I = LateAttrs.begin(),
index c71ab5c67d2e403d3c4a91dd1363787c311664e2..c6ab232a760ae3e302a5b8bcb15aafafc01ecb3c 100644 (file)
@@ -523,6 +523,15 @@ struct __declspec(dllexport) NestedOuter {
 // M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01??_FNestedOuter@@QAEXXZ"
 // M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01??_FNestedInner@NestedOuter@@QAEXXZ"
 
+template <typename T>
+struct SomeTemplate {
+  SomeTemplate(T o = T()) : o(o) {}
+  T o;
+};
+struct __declspec(dllexport) InheritFromTemplate : SomeTemplate<int> {};
+
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01??_F?$SomeTemplate@H@@QAEXXZ"
+
 struct __declspec(dllexport) T {
   // Copy assignment operator:
   // M32-DAG: define weak_odr dllexport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.T* @"\01??4T@@QAEAAU0@ABU0@@Z"