diff options
author | John McCall <rjmccall@apple.com> | 2009-10-29 18:45:58 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2009-10-29 18:45:58 +0000 |
commit | 0d07eb32decf4480a0a90616c397f0dbe6cce537 (patch) | |
tree | dd5ce5e44013733611304e3fda8251d4052e66ad /clang/lib/Sema/TreeTransform.h | |
parent | 94f8f8789010dda14f87539535bd37566a5d114a (diff) | |
download | bcm5719-llvm-0d07eb32decf4480a0a90616c397f0dbe6cce537.tar.gz bcm5719-llvm-0d07eb32decf4480a0a90616c397f0dbe6cce537.zip |
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.
llvm-svn: 85520
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index cb7b69fc95d..04bec726c01 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/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; |