aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/AST/TemplateBase.cpp14
-rw-r--r--lib/Sema/SemaTemplate.cpp14
-rw-r--r--lib/Sema/TreeTransform.h38
3 files changed, 42 insertions, 24 deletions
diff --git a/lib/AST/TemplateBase.cpp b/lib/AST/TemplateBase.cpp
index b136fe0d38..94e1ca1e06 100644
--- a/lib/AST/TemplateBase.cpp
+++ b/lib/AST/TemplateBase.cpp
@@ -78,20 +78,20 @@ void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
// 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 a2883fa980..fb5eef2760 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -1425,7 +1425,8 @@ bool Sema::CheckTemplateTypeArgument(TemplateTypeParmDecl *Param,
// 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 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
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 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
// 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 cb7b69fc95..04bec726c0 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1919,7 +1919,7 @@ void TreeTransform<Derived>::InventTemplateArgumentLoc(
case TemplateArgument::Declaration:
case TemplateArgument::Integral:
case TemplateArgument::Pack:
- Output = TemplateArgumentLoc(Arg);
+ Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
break;
}
}
@@ -1956,7 +1956,20 @@ bool TreeTransform<Derived>::TransformTemplateArgument(
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 @@ bool TreeTransform<Derived>::TransformTemplateArgument(
if (E.isInvalid()) return true;
Expr *ETaken = E.takeAs<Expr>();
+ ETaken->Retain();
Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
return false;
}
@@ -1987,18 +2001,18 @@ bool TreeTransform<Derived>::TransformTemplateArgument(
// 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 @@ QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
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;