From: David Majnemer Date: Fri, 10 Jun 2016 20:21:15 +0000 (+0000) Subject: [-fms-extensions] Don't crash on explicit class-scope specializations & default arguments X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d00c493c50f8548ee916c0ad9b071e5f8f057efb;p=clang [-fms-extensions] Don't crash on explicit class-scope specializations & default arguments The code had a typo it was doing: Param->setUninstantiatedDefaultArg(Param->getUninstantiatedDefaultArg()); This is a no-op but may assert, we wanted to do: Param->setUninstantiatedDefaultArg(OldParam->getUninstantiatedDefaultArg()); This fixes PR28082. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272425 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseCXXInlineMethods.cpp b/lib/Parse/ParseCXXInlineMethods.cpp index 3db75c7ee7..3c5134268e 100644 --- a/lib/Parse/ParseCXXInlineMethods.cpp +++ b/lib/Parse/ParseCXXInlineMethods.cpp @@ -381,7 +381,7 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) { assert (!OldParam->hasUnparsedDefaultArg()); if (OldParam->hasUninstantiatedDefaultArg()) Param->setUninstantiatedDefaultArg( - Param->getUninstantiatedDefaultArg()); + OldParam->getUninstantiatedDefaultArg()); else Param->setDefaultArg(OldParam->getInit()); } diff --git a/test/SemaTemplate/ms-function-specialization-class-scope.cpp b/test/SemaTemplate/ms-function-specialization-class-scope.cpp index 5da00837cc..3c7111d058 100644 --- a/test/SemaTemplate/ms-function-specialization-class-scope.cpp +++ b/test/SemaTemplate/ms-function-specialization-class-scope.cpp @@ -75,3 +75,12 @@ namespace Duplicates { // here. template struct A; } + +namespace PR28082 { +struct S { + template + int f(int = 0); + template <> + int f<0>(int); // expected-warning {{Microsoft extension}} +}; +}