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)
llvm-svn: 223177

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

index 2f1c189..ba1f985 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 1626044..c4d40b4 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 bff1d76..7bf9258 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;