Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -554,6 +554,26 @@ // declaration will be instantiated. if (New->getFriendObjectKind() == Decl::FOK_None || !New->getLexicalDeclContext()->isDependentContext()) { + if (getLangOpts().MicrosoftExt) { + // If there is an MS extension make sure that the default argument + // that has been instantiated has the right setting before merging. + CXXMethodDecl *MD = dyn_cast(New); + if (MD && MD->getParent()->isRecord()) { + MemberSpecializationInfo *NewSI = + New->getMemberSpecializationInfo(); + MemberSpecializationInfo *OldSI = + Old->getMemberSpecializationInfo(); + if (NewSI && + NewSI->getInstantiatedFrom()->getKind() == + Decl::Kind::CXXConstructor && + NewSI->isExplicitSpecialization() && + OldSI->getTemplateSpecializationKind() == + TSK_ImplicitInstantiation) { + Expr *e = OldParam->getInit(); + OldParam->setDefaultArg(e); + } + } + } // It's important to use getInit() here; getDefaultArg() // strips off any top-level ExprWithCleanups. NewParam->setHasInheritedDefaultArg(); Index: clang/test/SemaCXX/dllexport.cpp =================================================================== --- clang/test/SemaCXX/dllexport.cpp +++ clang/test/SemaCXX/dllexport.cpp @@ -1168,3 +1168,13 @@ // expected-error@+2{{lambda cannot be declared 'dllexport'}} #endif auto Lambda = []() __declspec(dllexport) -> bool { return true; }; + +//===----------------------------------------------------------------------===// +// Constructor Closure with default argument +//===----------------------------------------------------------------------===// +template +class __declspec(dllexport) foo { + foo(int x = 0); +}; +template <> +foo::foo(int);