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;