A few TemplateArgumentLoc clean-ups. Try to remember the Expr for a declaration.
Provide an API for getting the SourceRange of a TAL and use it judiciously.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85520 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/TemplateBase.cpp b/lib/AST/TemplateBase.cpp
index b136fe0..94e1ca1 100644
--- a/lib/AST/TemplateBase.cpp
+++ b/lib/AST/TemplateBase.cpp
@@ -78,20 +78,20 @@
// TemplateArgumentLoc Implementation
//===----------------------------------------------------------------------===//
-SourceLocation TemplateArgumentLoc::getLocation() const {
+SourceRange TemplateArgumentLoc::getSourceRange() const {
switch (Argument.getKind()) {
case TemplateArgument::Expression:
- return getSourceExpression()->getExprLoc();
- case TemplateArgument::Type:
- return getSourceDeclaratorInfo()->
- getTypeLoc().getFullSourceRange().getBegin();
+ return getSourceExpression()->getSourceRange();
case TemplateArgument::Declaration:
+ return getSourceDeclExpression()->getSourceRange();
+ case TemplateArgument::Type:
+ return getSourceDeclaratorInfo()->getTypeLoc().getFullSourceRange();
case TemplateArgument::Integral:
case TemplateArgument::Pack:
case TemplateArgument::Null:
- return SourceLocation();
+ return SourceRange();
}
// Silence bonus gcc warning.
- return SourceLocation();
+ return SourceRange();
}
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index a2883fa..fb5eef2 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -1425,7 +1425,8 @@
// We have a template type parameter but the template argument
// is not a type.
- Diag(AL.getLocation(), diag::err_template_arg_must_be_type);
+ SourceRange SR = AL.getSourceRange();
+ Diag(SR.getBegin(), diag::err_template_arg_must_be_type) << SR;
Diag(Param->getLocation(), diag::note_template_param_here);
return true;
@@ -1558,8 +1559,8 @@
break;
// FIXME: Subst default argument
- // FIXME: preserve source information
- Arg = TemplateArgumentLoc(TemplateArgument(TempParm->getDefaultArgument()));
+ Arg = TemplateArgumentLoc(TemplateArgument(TempParm->getDefaultArgument()),
+ TempParm->getDefaultArgument());
}
} else {
// Retrieve the template argument produced by the user.
@@ -1646,11 +1647,12 @@
// We warn specifically about this case, since it can be rather
// confusing for users.
QualType T = Arg.getArgument().getAsType();
+ SourceRange SR = Arg.getSourceRange();
if (T->isFunctionType())
- Diag(Arg.getLocation(), diag::err_template_arg_nontype_ambig)
- << T;
+ Diag(SR.getBegin(), diag::err_template_arg_nontype_ambig)
+ << SR << T;
else
- Diag(Arg.getLocation(), diag::err_template_arg_must_be_expr);
+ Diag(SR.getBegin(), diag::err_template_arg_must_be_expr) << SR;
Diag((*Param)->getLocation(), diag::note_template_param_here);
Invalid = true;
break;
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index cb7b69f..04bec72 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1919,7 +1919,7 @@
case TemplateArgument::Declaration:
case TemplateArgument::Integral:
case TemplateArgument::Pack:
- Output = TemplateArgumentLoc(Arg);
+ Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
break;
}
}
@@ -1956,7 +1956,20 @@
Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
if (!D) return true;
- Output = TemplateArgumentLoc(TemplateArgument(D));
+ Expr *SourceExpr = Input.getSourceDeclExpression();
+ if (SourceExpr) {
+ EnterExpressionEvaluationContext Unevaluated(getSema(),
+ Action::Unevaluated);
+ Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
+ if (E.isInvalid())
+ SourceExpr = NULL;
+ else {
+ SourceExpr = E.takeAs<Expr>();
+ SourceExpr->Retain();
+ }
+ }
+
+ Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
return false;
}
@@ -1973,6 +1986,7 @@
if (E.isInvalid()) return true;
Expr *ETaken = E.takeAs<Expr>();
+ ETaken->Retain();
Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
return false;
}
@@ -1987,18 +2001,18 @@
// FIXME: preserve source information here when we start
// caring about parameter packs.
- TemplateArgumentLoc Input;
- TemplateArgumentLoc Output;
- getDerived().InventTemplateArgumentLoc(*A, Input);
- if (getDerived().TransformTemplateArgument(Input, Output))
+ TemplateArgumentLoc InputArg;
+ TemplateArgumentLoc OutputArg;
+ getDerived().InventTemplateArgumentLoc(*A, InputArg);
+ if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
return true;
- TransformedArgs.push_back(Output.getArgument());
+ TransformedArgs.push_back(OutputArg.getArgument());
}
TemplateArgument Result;
Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
true);
- Output = TemplateArgumentLoc(Result);
+ Output = TemplateArgumentLoc(Result, Input.getLocInfo());
return false;
}
}
@@ -2764,9 +2778,11 @@
TemplateSpecializationTypeLoc TL
= TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
- TL.setTemplateNameLoc(getDerived().getBaseLocation());
- TL.setLAngleLoc(SourceLocation());
- TL.setRAngleLoc(SourceLocation());
+ SourceLocation BaseLoc = getDerived().getBaseLocation();
+
+ TL.setTemplateNameLoc(BaseLoc);
+ TL.setLAngleLoc(BaseLoc);
+ TL.setRAngleLoc(BaseLoc);
for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
const TemplateArgument &TA = TST->getArg(i);
TemplateArgumentLoc TAL;