Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -554,6 +554,20 @@ // 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 (const auto *spec = + dyn_cast(MD->getParent())) { + if (spec->getTemplateSpecializationKind() == + TSK_ImplicitInstantiation && + OldParam->hasUninstantiatedDefaultArg()) { + 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);