From: Douglas Gregor Date: Mon, 20 Dec 2010 17:42:22 +0000 (+0000) Subject: Finish refactoring the transformation of template argument lists, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7f61f2fc1a880ac3bf5b0993525922dd2c1f09bf;p=clang Finish refactoring the transformation of template argument lists, centralizing the transformation into two routines. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122253 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index bd471cea13..65a7580436 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -312,7 +312,25 @@ public: bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, unsigned NumInputs, TemplateArgumentListInfo &Outputs); - + + /// \brief Transform the given set of template arguments. + /// + /// By default, this operation transforms all of the template arguments + /// in the input set using \c TransformTemplateArgument(), and appends + /// the transformed arguments to the output list. + /// + /// \param Inputs The set of template arguments to be transformed. The + /// \c getArgLoc() function will be invoked on each argument indexed, while + /// the number of arguments is determined via \c getNumArgs(). + /// + /// \param Outputs The set of transformed template arguments output by this + /// routine. + /// + /// Returns true if an error occurred. + template + bool TransformTemplateArgumentsFromArgLoc(const InputsType &Inputs, + TemplateArgumentListInfo &Outputs); + /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. void InventTemplateArgumentLoc(const TemplateArgument &Arg, TemplateArgumentLoc &ArgLoc); @@ -2432,6 +2450,23 @@ bool TreeTransform::TransformTemplateArguments( return false; } +template +template +bool TreeTransform::TransformTemplateArgumentsFromArgLoc( + const InputsType &Inputs, + TemplateArgumentListInfo &Outputs) { + for (unsigned I = 0, N = Inputs.getNumArgs(); I != N; ++I) { + TemplateArgumentLoc Out; + if (getDerived().TransformTemplateArgument(Inputs.getArgLoc(I), Out)) + return true; + + Outputs.addArgument(Out); + } + + return false; + +} + //===----------------------------------------------------------------------===// // Type transformation //===----------------------------------------------------------------------===// @@ -3351,13 +3386,8 @@ QualType TreeTransform::TransformTemplateSpecializationType( TemplateArgumentListInfo NewTemplateArgs; NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); - - for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { - TemplateArgumentLoc Loc; - if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc)) - return QualType(); - NewTemplateArgs.addArgument(Loc); - } + if (getDerived().TransformTemplateArgumentsFromArgLoc(TL, NewTemplateArgs)) + return QualType(); // FIXME: maybe don't rebuild if all the template arguments are the same. @@ -3499,13 +3529,8 @@ QualType TreeTransform:: TemplateArgumentListInfo NewTemplateArgs; NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); - - for (unsigned I = 0, E = T->getNumArgs(); I != E; ++I) { - TemplateArgumentLoc Loc; - if (getDerived().TransformTemplateArgument(TL.getArgLoc(I), Loc)) - return QualType(); - NewTemplateArgs.addArgument(Loc); - } + if (getDerived().TransformTemplateArgumentsFromArgLoc(TL, NewTemplateArgs)) + return QualType(); QualType Result = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),