]> granicus.if.org Git - clang/commitdiff
[-fms-extensions] Don't crash on explicit class-scope specializations & default arguments
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 10 Jun 2016 20:21:15 +0000 (20:21 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 10 Jun 2016 20:21:15 +0000 (20:21 +0000)
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

lib/Parse/ParseCXXInlineMethods.cpp
test/SemaTemplate/ms-function-specialization-class-scope.cpp

index 3db75c7ee791c9cbb208db3ee05942c04caf1efd..3c5134268e870eefcb1de4b1d9f1599088db62af 100644 (file)
@@ -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());
     }
index 5da00837cc09e1485df5ba8a907bea9e9cd4ed65..3c7111d058389566f8f503ada6236d10fd373450 100644 (file)
@@ -75,3 +75,12 @@ namespace Duplicates {
   // here.
   template struct A<int>;
 }
+
+namespace PR28082 {
+struct S {
+  template <int>
+  int f(int = 0);
+  template <>
+  int f<0>(int); // expected-warning {{Microsoft extension}}
+};
+}