Rudimentary checking of template arguments against their corresponding
template parameters when performing semantic analysis of a template-id
naming a class template specialization.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64185 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseTemplate.cpp b/lib/Parse/ParseTemplate.cpp
index fa76714..f860058 100644
--- a/lib/Parse/ParseTemplate.cpp
+++ b/lib/Parse/ParseTemplate.cpp
@@ -370,10 +370,13 @@
   // Parse the optional template-argument-list.
   TemplateArgList TemplateArgs;
   TemplateArgIsTypeList TemplateArgIsType;
+  TemplateArgLocationList TemplateArgLocations;
+
   {
     GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
     if (Tok.isNot(tok::greater) && 
-        ParseTemplateArgumentList(TemplateArgs, TemplateArgIsType)) {
+        ParseTemplateArgumentList(TemplateArgs, TemplateArgIsType,
+                                  TemplateArgLocations)) {
       // Try to find the closing '>'.
       SkipUntil(tok::greater, true, true);
 
@@ -417,9 +420,14 @@
                                        &TemplateArgIsType[0],
                                        TemplateArgs.size());
     TypeTy *Ty 
-      = Actions.ActOnClassTemplateSpecialization(Template, LAngleLoc,
-                                                 TemplateArgsPtr,
+      = Actions.ActOnClassTemplateSpecialization(Template, TemplateNameLoc,
+                                                 LAngleLoc, TemplateArgsPtr,
+                                                 &TemplateArgLocations[0],
                                                  RAngleLoc, SS);
+
+    if (!Ty) // Something went wrong; don't annotate
+      return;
+
     Tok.setKind(tok::annot_typename);
     Tok.setAnnotationValue(Ty);
   }
@@ -453,8 +461,8 @@
     return ParseTypeName();
   }
 
-  OwningExprResult ExprArg = ParseExpression();
-  if (ExprArg.isInvalid())
+  OwningExprResult ExprArg = ParseAssignmentExpression();
+  if (ExprArg.isInvalid() || !ExprArg.get())
     return 0;
 
   ArgIsType = false;
@@ -469,13 +477,16 @@
 ///         template-argument-list ',' template-argument
 bool 
 Parser::ParseTemplateArgumentList(TemplateArgList &TemplateArgs,
-                                  TemplateArgIsTypeList &TemplateArgIsType) {
+                                  TemplateArgIsTypeList &TemplateArgIsType,
+                              TemplateArgLocationList &TemplateArgLocations) {
   while (true) {
     bool IsType = false;
+    SourceLocation Loc = Tok.getLocation();
     void *Arg = ParseTemplateArgument(IsType);
     if (Arg) {
       TemplateArgs.push_back(Arg);
       TemplateArgIsType.push_back(IsType);
+      TemplateArgLocations.push_back(Loc);
     } else {
       SkipUntil(tok::comma, tok::greater, true, true);
       return true;