]> granicus.if.org Git - clang/commitdiff
Ensure typos in the default values of template parameters get diagnosed.
authorKaelyn Takata <rikka@google.com>
Tue, 2 Dec 2014 23:32:20 +0000 (23:32 +0000)
committerKaelyn Takata <rikka@google.com>
Tue, 2 Dec 2014 23:32:20 +0000 (23:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223177 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseTemplate.cpp
test/SemaCXX/default2.cpp
test/SemaCXX/typo-correction-delayed.cpp

index 2f1c189c1a78f701f13a12b2b6aa01dba01fe4b2..ba1f98515edc4974e6cfc9caad3099ae7ee50658 100644 (file)
@@ -676,7 +676,7 @@ Parser::ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position) {
     GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
     EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
 
-    DefaultArg = ParseAssignmentExpression();
+    DefaultArg = Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression());
     if (DefaultArg.isInvalid())
       SkipUntil(tok::comma, tok::greater, StopAtSemi | StopBeforeMatch);
   }
index 16260449d4be674a90924c44e884f7472cfb6db4..c4d40b4280e96e953256b27d73d2c8c22ae9e1b6 100644 (file)
@@ -122,3 +122,9 @@ class XX {
   void A(int length = -1 ) {  } 
   void B() { A(); }
 };
+
+template <int I = (1 * I)> struct S {};  // expected-error-re {{use of undeclared identifier 'I'{{$}}}}
+S<1> s;
+
+template <int I1 = I2, int I2 = 1> struct T {};  // expected-error-re {{use of undeclared identifier 'I2'{{$}}}}
+T<0, 1> t;
index bff1d7633fc6adf3eb7a3febaa20db4b2f08661e..7bf925816d309f2feeb9203f729a32b16f2fc07a 100644 (file)
@@ -102,3 +102,7 @@ void f(int *i) {
   __atomic_load(i, i, something_something);  // expected-error-re {{use of undeclared identifier 'something_something'{{$}}}}
 }
 }
+
+const int DefaultArg = 9;  // expected-note {{'DefaultArg' declared here}}
+template <int I = defaultArg> struct S {};  // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}}
+S<1> s;