]> granicus.if.org Git - clang/commitdiff
[MS Compatibility] Handle cleanups we create for a ctor closure
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 11 Jun 2015 02:38:06 +0000 (02:38 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 11 Jun 2015 02:38:06 +0000 (02:38 +0000)
This fixes PR23801.

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

lib/Sema/SemaDeclCXX.cpp
test/CodeGenCXX/dllexport.cpp

index c80ef2d2bdc1545a32c663143a5b585ebcd14b2d..7ed9bfcb9796f5b97de9402852c375ab644c7d54 100644 (file)
@@ -9494,6 +9494,7 @@ static void getDefaultArgExprsForConstructors(Sema &S, CXXRecordDecl *Class) {
 
       Expr *DefaultArg = S.BuildCXXDefaultArgExpr(Class->getLocation(), CD,
                                                   CD->getParamDecl(I)).get();
+      S.DiscardCleanupsInEvaluationContext();
       S.Context.addDefaultArgExprForConstructor(CD, I, DefaultArg);
     }
   }
index 477e7dcf0b53e4e33c789ef5ea485b72f8e345ee..0eb6476bd0eca14a7f5b1c9a489956956769dca2 100644 (file)
@@ -532,6 +532,22 @@ struct __declspec(dllexport) InheritFromTemplate : SomeTemplate<int> {};
 
 // M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01??_F?$SomeTemplate@H@@QAEXXZ"
 
+namespace PR23801 {
+template <typename>
+struct S {
+  ~S() {}
+};
+struct A {
+  A(int);
+  S<int> s;
+};
+struct __declspec(dllexport) B {
+  B(A = 0) {}
+};
+}
+//
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01??_FB@PR23801@@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"