diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/TemplateBase.cpp | 14 | ||||
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 14 | ||||
-rw-r--r-- | lib/Sema/TreeTransform.h | 38 |
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; |