From 9321f926b01bfba21fa2524d916b889f280bae8e Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 11 Jun 2015 02:38:06 +0000 Subject: [PATCH] [MS Compatibility] Handle cleanups we create for a ctor closure This fixes PR23801. llvm-svn: 239503 --- clang/lib/Sema/SemaDeclCXX.cpp | 1 + clang/test/CodeGenCXX/dllexport.cpp | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index c80ef2d..7ed9bfc 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -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); } } diff --git a/clang/test/CodeGenCXX/dllexport.cpp b/clang/test/CodeGenCXX/dllexport.cpp index 477e7dc..0eb6476 100644 --- a/clang/test/CodeGenCXX/dllexport.cpp +++ b/clang/test/CodeGenCXX/dllexport.cpp @@ -532,6 +532,22 @@ struct __declspec(dllexport) InheritFromTemplate : SomeTemplate {}; // M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01??_F?$SomeTemplate@H@@QAEXXZ" +namespace PR23801 { +template +struct S { + ~S() {} +}; +struct A { + A(int); + S 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" -- 2.7.4