clang API Documentation

TreeTransform.h
Go to the documentation of this file.
00001 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //===----------------------------------------------------------------------===//
00008 //
00009 //  This file implements a semantic tree transformation that takes a given
00010 //  AST and rebuilds it, possibly transforming some nodes in the process.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
00015 #define LLVM_CLANG_SEMA_TREETRANSFORM_H
00016 
00017 #include "clang/Sema/SemaInternal.h"
00018 #include "clang/Sema/Lookup.h"
00019 #include "clang/Sema/ParsedTemplate.h"
00020 #include "clang/Sema/SemaDiagnostic.h"
00021 #include "clang/Sema/ScopeInfo.h"
00022 #include "clang/AST/Decl.h"
00023 #include "clang/AST/DeclObjC.h"
00024 #include "clang/AST/DeclTemplate.h"
00025 #include "clang/AST/Expr.h"
00026 #include "clang/AST/ExprCXX.h"
00027 #include "clang/AST/ExprObjC.h"
00028 #include "clang/AST/Stmt.h"
00029 #include "clang/AST/StmtCXX.h"
00030 #include "clang/AST/StmtObjC.h"
00031 #include "clang/Sema/Ownership.h"
00032 #include "clang/Sema/Designator.h"
00033 #include "clang/Lex/Preprocessor.h"
00034 #include "llvm/ADT/ArrayRef.h"
00035 #include "llvm/Support/ErrorHandling.h"
00036 #include "TypeLocBuilder.h"
00037 #include <algorithm>
00038 
00039 namespace clang {
00040 using namespace sema;
00041 
00042 /// \brief A semantic tree transformation that allows one to transform one
00043 /// abstract syntax tree into another.
00044 ///
00045 /// A new tree transformation is defined by creating a new subclass \c X of
00046 /// \c TreeTransform<X> and then overriding certain operations to provide
00047 /// behavior specific to that transformation. For example, template
00048 /// instantiation is implemented as a tree transformation where the
00049 /// transformation of TemplateTypeParmType nodes involves substituting the
00050 /// template arguments for their corresponding template parameters; a similar
00051 /// transformation is performed for non-type template parameters and
00052 /// template template parameters.
00053 ///
00054 /// This tree-transformation template uses static polymorphism to allow
00055 /// subclasses to customize any of its operations. Thus, a subclass can
00056 /// override any of the transformation or rebuild operators by providing an
00057 /// operation with the same signature as the default implementation. The
00058 /// overridding function should not be virtual.
00059 ///
00060 /// Semantic tree transformations are split into two stages, either of which
00061 /// can be replaced by a subclass. The "transform" step transforms an AST node
00062 /// or the parts of an AST node using the various transformation functions,
00063 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
00064 /// node of the appropriate kind from the pieces. The default transformation
00065 /// routines recursively transform the operands to composite AST nodes (e.g.,
00066 /// the pointee type of a PointerType node) and, if any of those operand nodes
00067 /// were changed by the transformation, invokes the rebuild operation to create
00068 /// a new AST node.
00069 ///
00070 /// Subclasses can customize the transformation at various levels. The
00071 /// most coarse-grained transformations involve replacing TransformType(),
00072 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
00073 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
00074 /// new implementations.
00075 ///
00076 /// For more fine-grained transformations, subclasses can replace any of the
00077 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
00078 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
00079 /// replacing TransformTemplateTypeParmType() allows template instantiation
00080 /// to substitute template arguments for their corresponding template
00081 /// parameters. Additionally, subclasses can override the \c RebuildXXX
00082 /// functions to control how AST nodes are rebuilt when their operands change.
00083 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
00084 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
00085 /// be able to use more efficient rebuild steps.
00086 ///
00087 /// There are a handful of other functions that can be overridden, allowing one
00088 /// to avoid traversing nodes that don't need any transformation
00089 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
00090 /// operands have not changed (\c AlwaysRebuild()), and customize the
00091 /// default locations and entity names used for type-checking
00092 /// (\c getBaseLocation(), \c getBaseEntity()).
00093 template<typename Derived>
00094 class TreeTransform {
00095   /// \brief Private RAII object that helps us forget and then re-remember
00096   /// the template argument corresponding to a partially-substituted parameter
00097   /// pack.
00098   class ForgetPartiallySubstitutedPackRAII {
00099     Derived &Self;
00100     TemplateArgument Old;
00101     
00102   public:
00103     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
00104       Old = Self.ForgetPartiallySubstitutedPack();
00105     }
00106     
00107     ~ForgetPartiallySubstitutedPackRAII() {
00108       Self.RememberPartiallySubstitutedPack(Old);
00109     }
00110   };
00111   
00112 protected:
00113   Sema &SemaRef;
00114   
00115   /// \brief The set of local declarations that have been transformed, for
00116   /// cases where we are forced to build new declarations within the transformer
00117   /// rather than in the subclass (e.g., lambda closure types).
00118   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
00119   
00120 public:
00121   /// \brief Initializes a new tree transformer.
00122   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
00123 
00124   /// \brief Retrieves a reference to the derived class.
00125   Derived &getDerived() { return static_cast<Derived&>(*this); }
00126 
00127   /// \brief Retrieves a reference to the derived class.
00128   const Derived &getDerived() const {
00129     return static_cast<const Derived&>(*this);
00130   }
00131 
00132   static inline ExprResult Owned(Expr *E) { return E; }
00133   static inline StmtResult Owned(Stmt *S) { return S; }
00134 
00135   /// \brief Retrieves a reference to the semantic analysis object used for
00136   /// this tree transform.
00137   Sema &getSema() const { return SemaRef; }
00138 
00139   /// \brief Whether the transformation should always rebuild AST nodes, even
00140   /// if none of the children have changed.
00141   ///
00142   /// Subclasses may override this function to specify when the transformation
00143   /// should rebuild all AST nodes.
00144   bool AlwaysRebuild() { return false; }
00145 
00146   /// \brief Returns the location of the entity being transformed, if that
00147   /// information was not available elsewhere in the AST.
00148   ///
00149   /// By default, returns no source-location information. Subclasses can
00150   /// provide an alternative implementation that provides better location
00151   /// information.
00152   SourceLocation getBaseLocation() { return SourceLocation(); }
00153 
00154   /// \brief Returns the name of the entity being transformed, if that
00155   /// information was not available elsewhere in the AST.
00156   ///
00157   /// By default, returns an empty name. Subclasses can provide an alternative
00158   /// implementation with a more precise name.
00159   DeclarationName getBaseEntity() { return DeclarationName(); }
00160 
00161   /// \brief Sets the "base" location and entity when that
00162   /// information is known based on another transformation.
00163   ///
00164   /// By default, the source location and entity are ignored. Subclasses can
00165   /// override this function to provide a customized implementation.
00166   void setBase(SourceLocation Loc, DeclarationName Entity) { }
00167 
00168   /// \brief RAII object that temporarily sets the base location and entity
00169   /// used for reporting diagnostics in types.
00170   class TemporaryBase {
00171     TreeTransform &Self;
00172     SourceLocation OldLocation;
00173     DeclarationName OldEntity;
00174 
00175   public:
00176     TemporaryBase(TreeTransform &Self, SourceLocation Location,
00177                   DeclarationName Entity) : Self(Self) {
00178       OldLocation = Self.getDerived().getBaseLocation();
00179       OldEntity = Self.getDerived().getBaseEntity();
00180       
00181       if (Location.isValid())
00182         Self.getDerived().setBase(Location, Entity);
00183     }
00184 
00185     ~TemporaryBase() {
00186       Self.getDerived().setBase(OldLocation, OldEntity);
00187     }
00188   };
00189 
00190   /// \brief Determine whether the given type \p T has already been
00191   /// transformed.
00192   ///
00193   /// Subclasses can provide an alternative implementation of this routine
00194   /// to short-circuit evaluation when it is known that a given type will
00195   /// not change. For example, template instantiation need not traverse
00196   /// non-dependent types.
00197   bool AlreadyTransformed(QualType T) {
00198     return T.isNull();
00199   }
00200 
00201   /// \brief Determine whether the given call argument should be dropped, e.g.,
00202   /// because it is a default argument.
00203   ///
00204   /// Subclasses can provide an alternative implementation of this routine to
00205   /// determine which kinds of call arguments get dropped. By default,
00206   /// CXXDefaultArgument nodes are dropped (prior to transformation).
00207   bool DropCallArgument(Expr *E) {
00208     return E->isDefaultArgument();
00209   }
00210   
00211   /// \brief Determine whether we should expand a pack expansion with the
00212   /// given set of parameter packs into separate arguments by repeatedly
00213   /// transforming the pattern.
00214   ///
00215   /// By default, the transformer never tries to expand pack expansions.
00216   /// Subclasses can override this routine to provide different behavior.
00217   ///
00218   /// \param EllipsisLoc The location of the ellipsis that identifies the
00219   /// pack expansion.
00220   ///
00221   /// \param PatternRange The source range that covers the entire pattern of
00222   /// the pack expansion.
00223   ///
00224   /// \param Unexpanded The set of unexpanded parameter packs within the 
00225   /// pattern.
00226   ///
00227   /// \param NumUnexpanded The number of unexpanded parameter packs in
00228   /// \p Unexpanded.
00229   ///
00230   /// \param ShouldExpand Will be set to \c true if the transformer should
00231   /// expand the corresponding pack expansions into separate arguments. When
00232   /// set, \c NumExpansions must also be set.
00233   ///
00234   /// \param RetainExpansion Whether the caller should add an unexpanded
00235   /// pack expansion after all of the expanded arguments. This is used
00236   /// when extending explicitly-specified template argument packs per
00237   /// C++0x [temp.arg.explicit]p9.
00238   ///
00239   /// \param NumExpansions The number of separate arguments that will be in
00240   /// the expanded form of the corresponding pack expansion. This is both an
00241   /// input and an output parameter, which can be set by the caller if the
00242   /// number of expansions is known a priori (e.g., due to a prior substitution)
00243   /// and will be set by the callee when the number of expansions is known.
00244   /// The callee must set this value when \c ShouldExpand is \c true; it may
00245   /// set this value in other cases.
00246   ///
00247   /// \returns true if an error occurred (e.g., because the parameter packs 
00248   /// are to be instantiated with arguments of different lengths), false 
00249   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 
00250   /// must be set.
00251   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
00252                                SourceRange PatternRange,
00253                              llvm::ArrayRef<UnexpandedParameterPack> Unexpanded,
00254                                bool &ShouldExpand,
00255                                bool &RetainExpansion,
00256                                llvm::Optional<unsigned> &NumExpansions) {
00257     ShouldExpand = false;
00258     return false;
00259   }
00260   
00261   /// \brief "Forget" about the partially-substituted pack template argument,
00262   /// when performing an instantiation that must preserve the parameter pack
00263   /// use.
00264   ///
00265   /// This routine is meant to be overridden by the template instantiator.
00266   TemplateArgument ForgetPartiallySubstitutedPack() {
00267     return TemplateArgument();
00268   }
00269   
00270   /// \brief "Remember" the partially-substituted pack template argument
00271   /// after performing an instantiation that must preserve the parameter pack
00272   /// use.
00273   ///
00274   /// This routine is meant to be overridden by the template instantiator.
00275   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
00276   
00277   /// \brief Note to the derived class when a function parameter pack is
00278   /// being expanded.
00279   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
00280                                       
00281   /// \brief Transforms the given type into another type.
00282   ///
00283   /// By default, this routine transforms a type by creating a
00284   /// TypeSourceInfo for it and delegating to the appropriate
00285   /// function.  This is expensive, but we don't mind, because
00286   /// this method is deprecated anyway;  all users should be
00287   /// switched to storing TypeSourceInfos.
00288   ///
00289   /// \returns the transformed type.
00290   QualType TransformType(QualType T);
00291 
00292   /// \brief Transforms the given type-with-location into a new
00293   /// type-with-location.
00294   ///
00295   /// By default, this routine transforms a type by delegating to the
00296   /// appropriate TransformXXXType to build a new type.  Subclasses
00297   /// may override this function (to take over all type
00298   /// transformations) or some set of the TransformXXXType functions
00299   /// to alter the transformation.
00300   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
00301 
00302   /// \brief Transform the given type-with-location into a new
00303   /// type, collecting location information in the given builder
00304   /// as necessary.
00305   ///
00306   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
00307 
00308   /// \brief Transform the given statement.
00309   ///
00310   /// By default, this routine transforms a statement by delegating to the
00311   /// appropriate TransformXXXStmt function to transform a specific kind of
00312   /// statement or the TransformExpr() function to transform an expression.
00313   /// Subclasses may override this function to transform statements using some
00314   /// other mechanism.
00315   ///
00316   /// \returns the transformed statement.
00317   StmtResult TransformStmt(Stmt *S);
00318 
00319   /// \brief Transform the given expression.
00320   ///
00321   /// By default, this routine transforms an expression by delegating to the
00322   /// appropriate TransformXXXExpr function to build a new expression.
00323   /// Subclasses may override this function to transform expressions using some
00324   /// other mechanism.
00325   ///
00326   /// \returns the transformed expression.
00327   ExprResult TransformExpr(Expr *E);
00328 
00329   /// \brief Transform the given list of expressions.
00330   ///
00331   /// This routine transforms a list of expressions by invoking 
00332   /// \c TransformExpr() for each subexpression. However, it also provides 
00333   /// support for variadic templates by expanding any pack expansions (if the
00334   /// derived class permits such expansion) along the way. When pack expansions
00335   /// are present, the number of outputs may not equal the number of inputs.
00336   ///
00337   /// \param Inputs The set of expressions to be transformed.
00338   ///
00339   /// \param NumInputs The number of expressions in \c Inputs.
00340   ///
00341   /// \param IsCall If \c true, then this transform is being performed on
00342   /// function-call arguments, and any arguments that should be dropped, will 
00343   /// be.
00344   ///
00345   /// \param Outputs The transformed input expressions will be added to this
00346   /// vector.
00347   ///
00348   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
00349   /// due to transformation.
00350   ///
00351   /// \returns true if an error occurred, false otherwise.
00352   bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall,
00353                       SmallVectorImpl<Expr *> &Outputs,
00354                       bool *ArgChanged = 0);
00355   
00356   /// \brief Transform the given declaration, which is referenced from a type
00357   /// or expression.
00358   ///
00359   /// By default, acts as the identity function on declarations, unless the
00360   /// transformer has had to transform the declaration itself. Subclasses
00361   /// may override this function to provide alternate behavior.
00362   Decl *TransformDecl(SourceLocation Loc, Decl *D) { 
00363     llvm::DenseMap<Decl *, Decl *>::iterator Known
00364       = TransformedLocalDecls.find(D);
00365     if (Known != TransformedLocalDecls.end())
00366       return Known->second;
00367     
00368     return D; 
00369   }
00370 
00371   /// \brief Transform the attributes associated with the given declaration and 
00372   /// place them on the new declaration.
00373   ///
00374   /// By default, this operation does nothing. Subclasses may override this
00375   /// behavior to transform attributes.
00376   void transformAttrs(Decl *Old, Decl *New) { }
00377   
00378   /// \brief Note that a local declaration has been transformed by this
00379   /// transformer.
00380   ///
00381   /// Local declarations are typically transformed via a call to 
00382   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
00383   /// the transformer itself has to transform the declarations. This routine
00384   /// can be overridden by a subclass that keeps track of such mappings.
00385   void transformedLocalDecl(Decl *Old, Decl *New) {
00386     TransformedLocalDecls[Old] = New;
00387   }
00388   
00389   /// \brief Transform the definition of the given declaration.
00390   ///
00391   /// By default, invokes TransformDecl() to transform the declaration.
00392   /// Subclasses may override this function to provide alternate behavior.
00393   Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 
00394     return getDerived().TransformDecl(Loc, D); 
00395   }
00396 
00397   /// \brief Transform the given declaration, which was the first part of a
00398   /// nested-name-specifier in a member access expression.
00399   ///
00400   /// This specific declaration transformation only applies to the first 
00401   /// identifier in a nested-name-specifier of a member access expression, e.g.,
00402   /// the \c T in \c x->T::member
00403   ///
00404   /// By default, invokes TransformDecl() to transform the declaration.
00405   /// Subclasses may override this function to provide alternate behavior.
00406   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 
00407     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 
00408   }
00409   
00410   /// \brief Transform the given nested-name-specifier with source-location
00411   /// information.
00412   ///
00413   /// By default, transforms all of the types and declarations within the
00414   /// nested-name-specifier. Subclasses may override this function to provide
00415   /// alternate behavior.
00416   NestedNameSpecifierLoc TransformNestedNameSpecifierLoc(
00417                                                     NestedNameSpecifierLoc NNS,
00418                                           QualType ObjectType = QualType(),
00419                                           NamedDecl *FirstQualifierInScope = 0);
00420 
00421   /// \brief Transform the given declaration name.
00422   ///
00423   /// By default, transforms the types of conversion function, constructor,
00424   /// and destructor names and then (if needed) rebuilds the declaration name.
00425   /// Identifiers and selectors are returned unmodified. Sublcasses may
00426   /// override this function to provide alternate behavior.
00427   DeclarationNameInfo
00428   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
00429 
00430   /// \brief Transform the given template name.
00431   ///
00432   /// \param SS The nested-name-specifier that qualifies the template
00433   /// name. This nested-name-specifier must already have been transformed.
00434   ///
00435   /// \param Name The template name to transform.
00436   ///
00437   /// \param NameLoc The source location of the template name.
00438   ///
00439   /// \param ObjectType If we're translating a template name within a member 
00440   /// access expression, this is the type of the object whose member template
00441   /// is being referenced.
00442   ///
00443   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
00444   /// also refers to a name within the current (lexical) scope, this is the
00445   /// declaration it refers to.
00446   ///
00447   /// By default, transforms the template name by transforming the declarations
00448   /// and nested-name-specifiers that occur within the template name.
00449   /// Subclasses may override this function to provide alternate behavior.
00450   TemplateName TransformTemplateName(CXXScopeSpec &SS,
00451                                      TemplateName Name,
00452                                      SourceLocation NameLoc,
00453                                      QualType ObjectType = QualType(),
00454                                      NamedDecl *FirstQualifierInScope = 0);
00455 
00456   /// \brief Transform the given template argument.
00457   ///
00458   /// By default, this operation transforms the type, expression, or
00459   /// declaration stored within the template argument and constructs a
00460   /// new template argument from the transformed result. Subclasses may
00461   /// override this function to provide alternate behavior.
00462   ///
00463   /// Returns true if there was an error.
00464   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
00465                                  TemplateArgumentLoc &Output);
00466 
00467   /// \brief Transform the given set of template arguments.
00468   ///
00469   /// By default, this operation transforms all of the template arguments 
00470   /// in the input set using \c TransformTemplateArgument(), and appends
00471   /// the transformed arguments to the output list.
00472   ///
00473   /// Note that this overload of \c TransformTemplateArguments() is merely
00474   /// a convenience function. Subclasses that wish to override this behavior
00475   /// should override the iterator-based member template version.
00476   ///
00477   /// \param Inputs The set of template arguments to be transformed.
00478   ///
00479   /// \param NumInputs The number of template arguments in \p Inputs.
00480   ///
00481   /// \param Outputs The set of transformed template arguments output by this
00482   /// routine.
00483   ///
00484   /// Returns true if an error occurred.
00485   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
00486                                   unsigned NumInputs,
00487                                   TemplateArgumentListInfo &Outputs) {
00488     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
00489   }
00490 
00491   /// \brief Transform the given set of template arguments.
00492   ///
00493   /// By default, this operation transforms all of the template arguments 
00494   /// in the input set using \c TransformTemplateArgument(), and appends
00495   /// the transformed arguments to the output list. 
00496   ///
00497   /// \param First An iterator to the first template argument.
00498   ///
00499   /// \param Last An iterator one step past the last template argument.
00500   ///
00501   /// \param Outputs The set of transformed template arguments output by this
00502   /// routine.
00503   ///
00504   /// Returns true if an error occurred.
00505   template<typename InputIterator>
00506   bool TransformTemplateArguments(InputIterator First,
00507                                   InputIterator Last,
00508                                   TemplateArgumentListInfo &Outputs);
00509 
00510   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
00511   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
00512                                  TemplateArgumentLoc &ArgLoc);
00513 
00514   /// \brief Fakes up a TypeSourceInfo for a type.
00515   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
00516     return SemaRef.Context.getTrivialTypeSourceInfo(T,
00517                        getDerived().getBaseLocation());
00518   }
00519 
00520 #define ABSTRACT_TYPELOC(CLASS, PARENT)
00521 #define TYPELOC(CLASS, PARENT)                                   \
00522   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
00523 #include "clang/AST/TypeLocNodes.def"
00524 
00525   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
00526                                       FunctionProtoTypeLoc TL,
00527                                       CXXRecordDecl *ThisContext,
00528                                       unsigned ThisTypeQuals);
00529 
00530   StmtResult
00531   TransformSEHHandler(Stmt *Handler);
00532 
00533   QualType 
00534   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
00535                                       TemplateSpecializationTypeLoc TL,
00536                                       TemplateName Template);
00537 
00538   QualType 
00539   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
00540                                       DependentTemplateSpecializationTypeLoc TL,
00541                                                TemplateName Template,
00542                                                CXXScopeSpec &SS);
00543 
00544   QualType 
00545   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
00546                                                DependentTemplateSpecializationTypeLoc TL,
00547                                          NestedNameSpecifierLoc QualifierLoc);
00548 
00549   /// \brief Transforms the parameters of a function type into the
00550   /// given vectors.
00551   ///
00552   /// The result vectors should be kept in sync; null entries in the
00553   /// variables vector are acceptable.
00554   ///
00555   /// Return true on error.
00556   bool TransformFunctionTypeParams(SourceLocation Loc,
00557                                    ParmVarDecl **Params, unsigned NumParams,
00558                                    const QualType *ParamTypes,
00559                                    SmallVectorImpl<QualType> &PTypes,
00560                                    SmallVectorImpl<ParmVarDecl*> *PVars);
00561 
00562   /// \brief Transforms a single function-type parameter.  Return null
00563   /// on error.
00564   ///
00565   /// \param indexAdjustment - A number to add to the parameter's
00566   ///   scope index;  can be negative
00567   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
00568                                           int indexAdjustment,
00569                                         llvm::Optional<unsigned> NumExpansions,
00570                                           bool ExpectParameterPack);
00571 
00572   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
00573 
00574   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
00575   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
00576 
00577 #define STMT(Node, Parent)                        \
00578   StmtResult Transform##Node(Node *S);
00579 #define EXPR(Node, Parent)                        \
00580   ExprResult Transform##Node(Node *E);
00581 #define ABSTRACT_STMT(Stmt)
00582 #include "clang/AST/StmtNodes.inc"
00583 
00584   /// \brief Build a new pointer type given its pointee type.
00585   ///
00586   /// By default, performs semantic analysis when building the pointer type.
00587   /// Subclasses may override this routine to provide different behavior.
00588   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
00589 
00590   /// \brief Build a new block pointer type given its pointee type.
00591   ///
00592   /// By default, performs semantic analysis when building the block pointer
00593   /// type. Subclasses may override this routine to provide different behavior.
00594   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
00595 
00596   /// \brief Build a new reference type given the type it references.
00597   ///
00598   /// By default, performs semantic analysis when building the
00599   /// reference type. Subclasses may override this routine to provide
00600   /// different behavior.
00601   ///
00602   /// \param LValue whether the type was written with an lvalue sigil
00603   /// or an rvalue sigil.
00604   QualType RebuildReferenceType(QualType ReferentType,
00605                                 bool LValue,
00606                                 SourceLocation Sigil);
00607 
00608   /// \brief Build a new member pointer type given the pointee type and the
00609   /// class type it refers into.
00610   ///
00611   /// By default, performs semantic analysis when building the member pointer
00612   /// type. Subclasses may override this routine to provide different behavior.
00613   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
00614                                     SourceLocation Sigil);
00615 
00616   /// \brief Build a new array type given the element type, size
00617   /// modifier, size of the array (if known), size expression, and index type
00618   /// qualifiers.
00619   ///
00620   /// By default, performs semantic analysis when building the array type.
00621   /// Subclasses may override this routine to provide different behavior.
00622   /// Also by default, all of the other Rebuild*Array
00623   QualType RebuildArrayType(QualType ElementType,
00624                             ArrayType::ArraySizeModifier SizeMod,
00625                             const llvm::APInt *Size,
00626                             Expr *SizeExpr,
00627                             unsigned IndexTypeQuals,
00628                             SourceRange BracketsRange);
00629 
00630   /// \brief Build a new constant array type given the element type, size
00631   /// modifier, (known) size of the array, and index type qualifiers.
00632   ///
00633   /// By default, performs semantic analysis when building the array type.
00634   /// Subclasses may override this routine to provide different behavior.
00635   QualType RebuildConstantArrayType(QualType ElementType,
00636                                     ArrayType::ArraySizeModifier SizeMod,
00637                                     const llvm::APInt &Size,
00638                                     unsigned IndexTypeQuals,
00639                                     SourceRange BracketsRange);
00640 
00641   /// \brief Build a new incomplete array type given the element type, size
00642   /// modifier, and index type qualifiers.
00643   ///
00644   /// By default, performs semantic analysis when building the array type.
00645   /// Subclasses may override this routine to provide different behavior.
00646   QualType RebuildIncompleteArrayType(QualType ElementType,
00647                                       ArrayType::ArraySizeModifier SizeMod,
00648                                       unsigned IndexTypeQuals,
00649                                       SourceRange BracketsRange);
00650 
00651   /// \brief Build a new variable-length array type given the element type,
00652   /// size modifier, size expression, and index type qualifiers.
00653   ///
00654   /// By default, performs semantic analysis when building the array type.
00655   /// Subclasses may override this routine to provide different behavior.
00656   QualType RebuildVariableArrayType(QualType ElementType,
00657                                     ArrayType::ArraySizeModifier SizeMod,
00658                                     Expr *SizeExpr,
00659                                     unsigned IndexTypeQuals,
00660                                     SourceRange BracketsRange);
00661 
00662   /// \brief Build a new dependent-sized array type given the element type,
00663   /// size modifier, size expression, and index type qualifiers.
00664   ///
00665   /// By default, performs semantic analysis when building the array type.
00666   /// Subclasses may override this routine to provide different behavior.
00667   QualType RebuildDependentSizedArrayType(QualType ElementType,
00668                                           ArrayType::ArraySizeModifier SizeMod,
00669                                           Expr *SizeExpr,
00670                                           unsigned IndexTypeQuals,
00671                                           SourceRange BracketsRange);
00672 
00673   /// \brief Build a new vector type given the element type and
00674   /// number of elements.
00675   ///
00676   /// By default, performs semantic analysis when building the vector type.
00677   /// Subclasses may override this routine to provide different behavior.
00678   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
00679                              VectorType::VectorKind VecKind);
00680 
00681   /// \brief Build a new extended vector type given the element type and
00682   /// number of elements.
00683   ///
00684   /// By default, performs semantic analysis when building the vector type.
00685   /// Subclasses may override this routine to provide different behavior.
00686   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
00687                                 SourceLocation AttributeLoc);
00688 
00689   /// \brief Build a new potentially dependently-sized extended vector type
00690   /// given the element type and number of elements.
00691   ///
00692   /// By default, performs semantic analysis when building the vector type.
00693   /// Subclasses may override this routine to provide different behavior.
00694   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
00695                                               Expr *SizeExpr,
00696                                               SourceLocation AttributeLoc);
00697 
00698   /// \brief Build a new function type.
00699   ///
00700   /// By default, performs semantic analysis when building the function type.
00701   /// Subclasses may override this routine to provide different behavior.
00702   QualType RebuildFunctionProtoType(QualType T,
00703                                     QualType *ParamTypes,
00704                                     unsigned NumParamTypes,
00705                                     bool Variadic, bool HasTrailingReturn,
00706                                     unsigned Quals,
00707                                     RefQualifierKind RefQualifier,
00708                                     const FunctionType::ExtInfo &Info);
00709 
00710   /// \brief Build a new unprototyped function type.
00711   QualType RebuildFunctionNoProtoType(QualType ResultType);
00712 
00713   /// \brief Rebuild an unresolved typename type, given the decl that
00714   /// the UnresolvedUsingTypenameDecl was transformed to.
00715   QualType RebuildUnresolvedUsingType(Decl *D);
00716 
00717   /// \brief Build a new typedef type.
00718   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
00719     return SemaRef.Context.getTypeDeclType(Typedef);
00720   }
00721 
00722   /// \brief Build a new class/struct/union type.
00723   QualType RebuildRecordType(RecordDecl *Record) {
00724     return SemaRef.Context.getTypeDeclType(Record);
00725   }
00726 
00727   /// \brief Build a new Enum type.
00728   QualType RebuildEnumType(EnumDecl *Enum) {
00729     return SemaRef.Context.getTypeDeclType(Enum);
00730   }
00731 
00732   /// \brief Build a new typeof(expr) type.
00733   ///
00734   /// By default, performs semantic analysis when building the typeof type.
00735   /// Subclasses may override this routine to provide different behavior.
00736   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
00737 
00738   /// \brief Build a new typeof(type) type.
00739   ///
00740   /// By default, builds a new TypeOfType with the given underlying type.
00741   QualType RebuildTypeOfType(QualType Underlying);
00742 
00743   /// \brief Build a new unary transform type.
00744   QualType RebuildUnaryTransformType(QualType BaseType,
00745                                      UnaryTransformType::UTTKind UKind,
00746                                      SourceLocation Loc);
00747 
00748   /// \brief Build a new C++0x decltype type.
00749   ///
00750   /// By default, performs semantic analysis when building the decltype type.
00751   /// Subclasses may override this routine to provide different behavior.
00752   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
00753 
00754   /// \brief Build a new C++0x auto type.
00755   ///
00756   /// By default, builds a new AutoType with the given deduced type.
00757   QualType RebuildAutoType(QualType Deduced) {
00758     return SemaRef.Context.getAutoType(Deduced);
00759   }
00760 
00761   /// \brief Build a new template specialization type.
00762   ///
00763   /// By default, performs semantic analysis when building the template
00764   /// specialization type. Subclasses may override this routine to provide
00765   /// different behavior.
00766   QualType RebuildTemplateSpecializationType(TemplateName Template,
00767                                              SourceLocation TemplateLoc,
00768                                              TemplateArgumentListInfo &Args);
00769 
00770   /// \brief Build a new parenthesized type.
00771   ///
00772   /// By default, builds a new ParenType type from the inner type.
00773   /// Subclasses may override this routine to provide different behavior.
00774   QualType RebuildParenType(QualType InnerType) {
00775     return SemaRef.Context.getParenType(InnerType);
00776   }
00777 
00778   /// \brief Build a new qualified name type.
00779   ///
00780   /// By default, builds a new ElaboratedType type from the keyword,
00781   /// the nested-name-specifier and the named type.
00782   /// Subclasses may override this routine to provide different behavior.
00783   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
00784                                  ElaboratedTypeKeyword Keyword,
00785                                  NestedNameSpecifierLoc QualifierLoc,
00786                                  QualType Named) {
00787     return SemaRef.Context.getElaboratedType(Keyword, 
00788                                          QualifierLoc.getNestedNameSpecifier(), 
00789                                              Named);
00790   }
00791 
00792   /// \brief Build a new typename type that refers to a template-id.
00793   ///
00794   /// By default, builds a new DependentNameType type from the
00795   /// nested-name-specifier and the given type. Subclasses may override
00796   /// this routine to provide different behavior.
00797   QualType RebuildDependentTemplateSpecializationType(
00798                                           ElaboratedTypeKeyword Keyword,
00799                                           NestedNameSpecifierLoc QualifierLoc,
00800                                           const IdentifierInfo *Name,
00801                                           SourceLocation NameLoc,
00802                                           TemplateArgumentListInfo &Args) {
00803     // Rebuild the template name.
00804     // TODO: avoid TemplateName abstraction
00805     CXXScopeSpec SS;
00806     SS.Adopt(QualifierLoc);
00807     TemplateName InstName 
00808       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0);
00809     
00810     if (InstName.isNull())
00811       return QualType();
00812     
00813     // If it's still dependent, make a dependent specialization.
00814     if (InstName.getAsDependentTemplateName())
00815       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 
00816                                           QualifierLoc.getNestedNameSpecifier(), 
00817                                                                     Name, 
00818                                                                     Args);
00819     
00820     // Otherwise, make an elaborated type wrapping a non-dependent
00821     // specialization.
00822     QualType T =
00823     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
00824     if (T.isNull()) return QualType();
00825     
00826     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0)
00827       return T;
00828     
00829     return SemaRef.Context.getElaboratedType(Keyword, 
00830                                        QualifierLoc.getNestedNameSpecifier(), 
00831                                              T);
00832   }
00833 
00834   /// \brief Build a new typename type that refers to an identifier.
00835   ///
00836   /// By default, performs semantic analysis when building the typename type
00837   /// (or elaborated type). Subclasses may override this routine to provide
00838   /// different behavior.
00839   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
00840                                     SourceLocation KeywordLoc,
00841                                     NestedNameSpecifierLoc QualifierLoc,
00842                                     const IdentifierInfo *Id,
00843                                     SourceLocation IdLoc) {
00844     CXXScopeSpec SS;
00845     SS.Adopt(QualifierLoc);
00846 
00847     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
00848       // If the name is still dependent, just build a new dependent name type.
00849       if (!SemaRef.computeDeclContext(SS))
00850         return SemaRef.Context.getDependentNameType(Keyword, 
00851                                           QualifierLoc.getNestedNameSpecifier(), 
00852                                                     Id);
00853     }
00854 
00855     if (Keyword == ETK_None || Keyword == ETK_Typename)
00856       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
00857                                        *Id, IdLoc);
00858 
00859     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
00860 
00861     // We had a dependent elaborated-type-specifier that has been transformed
00862     // into a non-dependent elaborated-type-specifier. Find the tag we're
00863     // referring to.
00864     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
00865     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
00866     if (!DC)
00867       return QualType();
00868 
00869     if (SemaRef.RequireCompleteDeclContext(SS, DC))
00870       return QualType();
00871 
00872     TagDecl *Tag = 0;
00873     SemaRef.LookupQualifiedName(Result, DC);
00874     switch (Result.getResultKind()) {
00875       case LookupResult::NotFound:
00876       case LookupResult::NotFoundInCurrentInstantiation:
00877         break;
00878         
00879       case LookupResult::Found:
00880         Tag = Result.getAsSingle<TagDecl>();
00881         break;
00882         
00883       case LookupResult::FoundOverloaded:
00884       case LookupResult::FoundUnresolvedValue:
00885         llvm_unreachable("Tag lookup cannot find non-tags");
00886         
00887       case LookupResult::Ambiguous:
00888         // Let the LookupResult structure handle ambiguities.
00889         return QualType();
00890     }
00891 
00892     if (!Tag) {
00893       // Check where the name exists but isn't a tag type and use that to emit
00894       // better diagnostics.
00895       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
00896       SemaRef.LookupQualifiedName(Result, DC);
00897       switch (Result.getResultKind()) {
00898         case LookupResult::Found:
00899         case LookupResult::FoundOverloaded:
00900         case LookupResult::FoundUnresolvedValue: {
00901           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
00902           unsigned Kind = 0;
00903           if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
00904           else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2;
00905           else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3;
00906           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
00907           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
00908           break;
00909         }
00910         default:
00911           // FIXME: Would be nice to highlight just the source range.
00912           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
00913             << Kind << Id << DC;
00914           break;
00915       }
00916       return QualType();
00917     }
00918 
00919     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
00920                                               IdLoc, *Id)) {
00921       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
00922       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
00923       return QualType();
00924     }
00925 
00926     // Build the elaborated-type-specifier type.
00927     QualType T = SemaRef.Context.getTypeDeclType(Tag);
00928     return SemaRef.Context.getElaboratedType(Keyword, 
00929                                          QualifierLoc.getNestedNameSpecifier(), 
00930                                              T);
00931   }
00932 
00933   /// \brief Build a new pack expansion type.
00934   ///
00935   /// By default, builds a new PackExpansionType type from the given pattern.
00936   /// Subclasses may override this routine to provide different behavior.
00937   QualType RebuildPackExpansionType(QualType Pattern, 
00938                                     SourceRange PatternRange,
00939                                     SourceLocation EllipsisLoc,
00940                                     llvm::Optional<unsigned> NumExpansions) {
00941     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
00942                                         NumExpansions);
00943   }
00944 
00945   /// \brief Build a new atomic type given its value type.
00946   ///
00947   /// By default, performs semantic analysis when building the atomic type.
00948   /// Subclasses may override this routine to provide different behavior.
00949   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
00950 
00951   /// \brief Build a new template name given a nested name specifier, a flag
00952   /// indicating whether the "template" keyword was provided, and the template
00953   /// that the template name refers to.
00954   ///
00955   /// By default, builds the new template name directly. Subclasses may override
00956   /// this routine to provide different behavior.
00957   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
00958                                    bool TemplateKW,
00959                                    TemplateDecl *Template);
00960 
00961   /// \brief Build a new template name given a nested name specifier and the
00962   /// name that is referred to as a template.
00963   ///
00964   /// By default, performs semantic analysis to determine whether the name can
00965   /// be resolved to a specific template, then builds the appropriate kind of
00966   /// template name. Subclasses may override this routine to provide different
00967   /// behavior.
00968   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
00969                                    const IdentifierInfo &Name,
00970                                    SourceLocation NameLoc,
00971                                    QualType ObjectType,
00972                                    NamedDecl *FirstQualifierInScope);
00973 
00974   /// \brief Build a new template name given a nested name specifier and the
00975   /// overloaded operator name that is referred to as a template.
00976   ///
00977   /// By default, performs semantic analysis to determine whether the name can
00978   /// be resolved to a specific template, then builds the appropriate kind of
00979   /// template name. Subclasses may override this routine to provide different
00980   /// behavior.
00981   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
00982                                    OverloadedOperatorKind Operator,
00983                                    SourceLocation NameLoc,
00984                                    QualType ObjectType);
00985 
00986   /// \brief Build a new template name given a template template parameter pack
00987   /// and the 
00988   ///
00989   /// By default, performs semantic analysis to determine whether the name can
00990   /// be resolved to a specific template, then builds the appropriate kind of
00991   /// template name. Subclasses may override this routine to provide different
00992   /// behavior.
00993   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
00994                                    const TemplateArgument &ArgPack) {
00995     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
00996   }
00997 
00998   /// \brief Build a new compound statement.
00999   ///
01000   /// By default, performs semantic analysis to build the new statement.
01001   /// Subclasses may override this routine to provide different behavior.
01002   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
01003                                        MultiStmtArg Statements,
01004                                        SourceLocation RBraceLoc,
01005                                        bool IsStmtExpr) {
01006     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
01007                                        IsStmtExpr);
01008   }
01009 
01010   /// \brief Build a new case statement.
01011   ///
01012   /// By default, performs semantic analysis to build the new statement.
01013   /// Subclasses may override this routine to provide different behavior.
01014   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
01015                                    Expr *LHS,
01016                                    SourceLocation EllipsisLoc,
01017                                    Expr *RHS,
01018                                    SourceLocation ColonLoc) {
01019     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
01020                                    ColonLoc);
01021   }
01022 
01023   /// \brief Attach the body to a new case statement.
01024   ///
01025   /// By default, performs semantic analysis to build the new statement.
01026   /// Subclasses may override this routine to provide different behavior.
01027   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
01028     getSema().ActOnCaseStmtBody(S, Body);
01029     return S;
01030   }
01031 
01032   /// \brief Build a new default statement.
01033   ///
01034   /// By default, performs semantic analysis to build the new statement.
01035   /// Subclasses may override this routine to provide different behavior.
01036   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
01037                                       SourceLocation ColonLoc,
01038                                       Stmt *SubStmt) {
01039     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
01040                                       /*CurScope=*/0);
01041   }
01042 
01043   /// \brief Build a new label statement.
01044   ///
01045   /// By default, performs semantic analysis to build the new statement.
01046   /// Subclasses may override this routine to provide different behavior.
01047   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
01048                               SourceLocation ColonLoc, Stmt *SubStmt) {
01049     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
01050   }
01051 
01052   /// \brief Build a new label statement.
01053   ///
01054   /// By default, performs semantic analysis to build the new statement.
01055   /// Subclasses may override this routine to provide different behavior.
01056   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, const AttrVec &Attrs,
01057                                    Stmt *SubStmt) {
01058     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
01059   }
01060 
01061   /// \brief Build a new "if" statement.
01062   ///
01063   /// By default, performs semantic analysis to build the new statement.
01064   /// Subclasses may override this routine to provide different behavior.
01065   StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
01066                            VarDecl *CondVar, Stmt *Then, 
01067                            SourceLocation ElseLoc, Stmt *Else) {
01068     return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
01069   }
01070 
01071   /// \brief Start building a new switch statement.
01072   ///
01073   /// By default, performs semantic analysis to build the new statement.
01074   /// Subclasses may override this routine to provide different behavior.
01075   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
01076                                     Expr *Cond, VarDecl *CondVar) {
01077     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond, 
01078                                             CondVar);
01079   }
01080 
01081   /// \brief Attach the body to the switch statement.
01082   ///
01083   /// By default, performs semantic analysis to build the new statement.
01084   /// Subclasses may override this routine to provide different behavior.
01085   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
01086                                    Stmt *Switch, Stmt *Body) {
01087     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
01088   }
01089 
01090   /// \brief Build a new while statement.
01091   ///
01092   /// By default, performs semantic analysis to build the new statement.
01093   /// Subclasses may override this routine to provide different behavior.
01094   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
01095                               VarDecl *CondVar, Stmt *Body) {
01096     return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
01097   }
01098 
01099   /// \brief Build a new do-while statement.
01100   ///
01101   /// By default, performs semantic analysis to build the new statement.
01102   /// Subclasses may override this routine to provide different behavior.
01103   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
01104                            SourceLocation WhileLoc, SourceLocation LParenLoc,
01105                            Expr *Cond, SourceLocation RParenLoc) {
01106     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
01107                                  Cond, RParenLoc);
01108   }
01109 
01110   /// \brief Build a new for statement.
01111   ///
01112   /// By default, performs semantic analysis to build the new statement.
01113   /// Subclasses may override this routine to provide different behavior.
01114   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
01115                             Stmt *Init, Sema::FullExprArg Cond, 
01116                             VarDecl *CondVar, Sema::FullExprArg Inc,
01117                             SourceLocation RParenLoc, Stmt *Body) {
01118     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 
01119                                   CondVar, Inc, RParenLoc, Body);
01120   }
01121 
01122   /// \brief Build a new goto statement.
01123   ///
01124   /// By default, performs semantic analysis to build the new statement.
01125   /// Subclasses may override this routine to provide different behavior.
01126   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
01127                              LabelDecl *Label) {
01128     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
01129   }
01130 
01131   /// \brief Build a new indirect goto statement.
01132   ///
01133   /// By default, performs semantic analysis to build the new statement.
01134   /// Subclasses may override this routine to provide different behavior.
01135   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
01136                                      SourceLocation StarLoc,
01137                                      Expr *Target) {
01138     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
01139   }
01140 
01141   /// \brief Build a new return statement.
01142   ///
01143   /// By default, performs semantic analysis to build the new statement.
01144   /// Subclasses may override this routine to provide different behavior.
01145   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
01146     return getSema().ActOnReturnStmt(ReturnLoc, Result);
01147   }
01148 
01149   /// \brief Build a new declaration statement.
01150   ///
01151   /// By default, performs semantic analysis to build the new statement.
01152   /// Subclasses may override this routine to provide different behavior.
01153   StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
01154                                    SourceLocation StartLoc,
01155                                    SourceLocation EndLoc) {
01156     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls, NumDecls);
01157     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
01158   }
01159 
01160   /// \brief Build a new inline asm statement.
01161   ///
01162   /// By default, performs semantic analysis to build the new statement.
01163   /// Subclasses may override this routine to provide different behavior.
01164   StmtResult RebuildAsmStmt(SourceLocation AsmLoc,
01165                                   bool IsSimple,
01166                                   bool IsVolatile,
01167                                   unsigned NumOutputs,
01168                                   unsigned NumInputs,
01169                                   IdentifierInfo **Names,
01170                                   MultiExprArg Constraints,
01171                                   MultiExprArg Exprs,
01172                                   Expr *AsmString,
01173                                   MultiExprArg Clobbers,
01174                                   SourceLocation RParenLoc,
01175                                   bool MSAsm) {
01176     return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 
01177                                   NumInputs, Names, move(Constraints),
01178                                   Exprs, AsmString, Clobbers,
01179                                   RParenLoc, MSAsm);
01180   }
01181 
01182   /// \brief Build a new Objective-C @try statement.
01183   ///
01184   /// By default, performs semantic analysis to build the new statement.
01185   /// Subclasses may override this routine to provide different behavior.
01186   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
01187                                         Stmt *TryBody,
01188                                         MultiStmtArg CatchStmts,
01189                                         Stmt *Finally) {
01190     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts),
01191                                         Finally);
01192   }
01193 
01194   /// \brief Rebuild an Objective-C exception declaration.
01195   ///
01196   /// By default, performs semantic analysis to build the new declaration.
01197   /// Subclasses may override this routine to provide different behavior.
01198   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
01199                                     TypeSourceInfo *TInfo, QualType T) {
01200     return getSema().BuildObjCExceptionDecl(TInfo, T,
01201                                             ExceptionDecl->getInnerLocStart(),
01202                                             ExceptionDecl->getLocation(),
01203                                             ExceptionDecl->getIdentifier());
01204   }
01205   
01206   /// \brief Build a new Objective-C @catch statement.
01207   ///
01208   /// By default, performs semantic analysis to build the new statement.
01209   /// Subclasses may override this routine to provide different behavior.
01210   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
01211                                           SourceLocation RParenLoc,
01212                                           VarDecl *Var,
01213                                           Stmt *Body) {
01214     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
01215                                           Var, Body);
01216   }
01217   
01218   /// \brief Build a new Objective-C @finally statement.
01219   ///
01220   /// By default, performs semantic analysis to build the new statement.
01221   /// Subclasses may override this routine to provide different behavior.
01222   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
01223                                             Stmt *Body) {
01224     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
01225   }
01226   
01227   /// \brief Build a new Objective-C @throw statement.
01228   ///
01229   /// By default, performs semantic analysis to build the new statement.
01230   /// Subclasses may override this routine to provide different behavior.
01231   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
01232                                           Expr *Operand) {
01233     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
01234   }
01235   
01236   /// \brief Rebuild the operand to an Objective-C @synchronized statement.
01237   ///
01238   /// By default, performs semantic analysis to build the new statement.
01239   /// Subclasses may override this routine to provide different behavior.
01240   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
01241                                               Expr *object) {
01242     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
01243   }
01244 
01245   /// \brief Build a new Objective-C @synchronized statement.
01246   ///
01247   /// By default, performs semantic analysis to build the new statement.
01248   /// Subclasses may override this routine to provide different behavior.
01249   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
01250                                            Expr *Object, Stmt *Body) {
01251     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
01252   }
01253 
01254   /// \brief Build a new Objective-C @autoreleasepool statement.
01255   ///
01256   /// By default, performs semantic analysis to build the new statement.
01257   /// Subclasses may override this routine to provide different behavior.
01258   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
01259                                             Stmt *Body) {
01260     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
01261   }
01262 
01263   /// \brief Build the collection operand to a new Objective-C fast
01264   /// enumeration statement.
01265   ///
01266   /// By default, performs semantic analysis to build the new statement.
01267   /// Subclasses may override this routine to provide different behavior.
01268   ExprResult RebuildObjCForCollectionOperand(SourceLocation forLoc,
01269                                              Expr *collection) {
01270     return getSema().ActOnObjCForCollectionOperand(forLoc, collection);
01271   }
01272 
01273   /// \brief Build a new Objective-C fast enumeration statement.
01274   ///
01275   /// By default, performs semantic analysis to build the new statement.
01276   /// Subclasses may override this routine to provide different behavior.
01277   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
01278                                           SourceLocation LParenLoc,
01279                                           Stmt *Element,
01280                                           Expr *Collection,
01281                                           SourceLocation RParenLoc,
01282                                           Stmt *Body) {
01283     return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
01284                                                 Element, 
01285                                                 Collection,
01286                                                 RParenLoc,
01287                                                 Body);
01288   }
01289   
01290   /// \brief Build a new C++ exception declaration.
01291   ///
01292   /// By default, performs semantic analysis to build the new decaration.
01293   /// Subclasses may override this routine to provide different behavior.
01294   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
01295                                 TypeSourceInfo *Declarator,
01296                                 SourceLocation StartLoc,
01297                                 SourceLocation IdLoc,
01298                                 IdentifierInfo *Id) {
01299     VarDecl *Var = getSema().BuildExceptionDeclaration(0, Declarator,
01300                                                        StartLoc, IdLoc, Id);
01301     if (Var)
01302       getSema().CurContext->addDecl(Var);
01303     return Var;
01304   }
01305 
01306   /// \brief Build a new C++ catch statement.
01307   ///
01308   /// By default, performs semantic analysis to build the new statement.
01309   /// Subclasses may override this routine to provide different behavior.
01310   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
01311                                  VarDecl *ExceptionDecl,
01312                                  Stmt *Handler) {
01313     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
01314                                                       Handler));
01315   }
01316 
01317   /// \brief Build a new C++ try statement.
01318   ///
01319   /// By default, performs semantic analysis to build the new statement.
01320   /// Subclasses may override this routine to provide different behavior.
01321   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
01322                                Stmt *TryBlock,
01323                                MultiStmtArg Handlers) {
01324     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers));
01325   }
01326 
01327   /// \brief Build a new C++0x range-based for statement.
01328   ///
01329   /// By default, performs semantic analysis to build the new statement.
01330   /// Subclasses may override this routine to provide different behavior.
01331   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
01332                                     SourceLocation ColonLoc,
01333                                     Stmt *Range, Stmt *BeginEnd,
01334                                     Expr *Cond, Expr *Inc,
01335                                     Stmt *LoopVar,
01336                                     SourceLocation RParenLoc) {
01337     return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd,
01338                                           Cond, Inc, LoopVar, RParenLoc);
01339   }
01340 
01341   /// \brief Build a new C++0x range-based for statement.
01342   ///
01343   /// By default, performs semantic analysis to build the new statement.
01344   /// Subclasses may override this routine to provide different behavior.
01345   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 
01346                                           bool IsIfExists,
01347                                           NestedNameSpecifierLoc QualifierLoc,
01348                                           DeclarationNameInfo NameInfo,
01349                                           Stmt *Nested) {
01350     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
01351                                                 QualifierLoc, NameInfo, Nested);
01352   }
01353 
01354   /// \brief Attach body to a C++0x range-based for statement.
01355   ///
01356   /// By default, performs semantic analysis to finish the new statement.
01357   /// Subclasses may override this routine to provide different behavior.
01358   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
01359     return getSema().FinishCXXForRangeStmt(ForRange, Body);
01360   }
01361   
01362   StmtResult RebuildSEHTryStmt(bool IsCXXTry,
01363                                SourceLocation TryLoc,
01364                                Stmt *TryBlock,
01365                                Stmt *Handler) {
01366     return getSema().ActOnSEHTryBlock(IsCXXTry,TryLoc,TryBlock,Handler);
01367   }
01368 
01369   StmtResult RebuildSEHExceptStmt(SourceLocation Loc,
01370                                   Expr *FilterExpr,
01371                                   Stmt *Block) {
01372     return getSema().ActOnSEHExceptBlock(Loc,FilterExpr,Block);
01373   }
01374 
01375   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc,
01376                                    Stmt *Block) {
01377     return getSema().ActOnSEHFinallyBlock(Loc,Block);
01378   }
01379 
01380   /// \brief Build a new expression that references a declaration.
01381   ///
01382   /// By default, performs semantic analysis to build the new expression.
01383   /// Subclasses may override this routine to provide different behavior.
01384   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
01385                                         LookupResult &R,
01386                                         bool RequiresADL) {
01387     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
01388   }
01389 
01390 
01391   /// \brief Build a new expression that references a declaration.
01392   ///
01393   /// By default, performs semantic analysis to build the new expression.
01394   /// Subclasses may override this routine to provide different behavior.
01395   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
01396                                 ValueDecl *VD,
01397                                 const DeclarationNameInfo &NameInfo,
01398                                 TemplateArgumentListInfo *TemplateArgs) {
01399     CXXScopeSpec SS;
01400     SS.Adopt(QualifierLoc);
01401 
01402     // FIXME: loses template args.
01403 
01404     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
01405   }
01406 
01407   /// \brief Build a new expression in parentheses.
01408   ///
01409   /// By default, performs semantic analysis to build the new expression.
01410   /// Subclasses may override this routine to provide different behavior.
01411   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
01412                                     SourceLocation RParen) {
01413     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
01414   }
01415 
01416   /// \brief Build a new pseudo-destructor expression.
01417   ///
01418   /// By default, performs semantic analysis to build the new expression.
01419   /// Subclasses may override this routine to provide different behavior.
01420   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
01421                                             SourceLocation OperatorLoc,
01422                                             bool isArrow,
01423                                             CXXScopeSpec &SS,
01424                                             TypeSourceInfo *ScopeType,
01425                                             SourceLocation CCLoc,
01426                                             SourceLocation TildeLoc,
01427                                         PseudoDestructorTypeStorage Destroyed);
01428 
01429   /// \brief Build a new unary operator expression.
01430   ///
01431   /// By default, performs semantic analysis to build the new expression.
01432   /// Subclasses may override this routine to provide different behavior.
01433   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
01434                                         UnaryOperatorKind Opc,
01435                                         Expr *SubExpr) {
01436     return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr);
01437   }
01438 
01439   /// \brief Build a new builtin offsetof expression.
01440   ///
01441   /// By default, performs semantic analysis to build the new expression.
01442   /// Subclasses may override this routine to provide different behavior.
01443   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
01444                                        TypeSourceInfo *Type,
01445                                        Sema::OffsetOfComponent *Components,
01446                                        unsigned NumComponents,
01447                                        SourceLocation RParenLoc) {
01448     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
01449                                           NumComponents, RParenLoc);
01450   }
01451   
01452   /// \brief Build a new sizeof, alignof or vec_step expression with a 
01453   /// type argument.
01454   ///
01455   /// By default, performs semantic analysis to build the new expression.
01456   /// Subclasses may override this routine to provide different behavior.
01457   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
01458                                          SourceLocation OpLoc,
01459                                          UnaryExprOrTypeTrait ExprKind,
01460                                          SourceRange R) {
01461     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
01462   }
01463 
01464   /// \brief Build a new sizeof, alignof or vec step expression with an
01465   /// expression argument.
01466   ///
01467   /// By default, performs semantic analysis to build the new expression.
01468   /// Subclasses may override this routine to provide different behavior.
01469   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
01470                                          UnaryExprOrTypeTrait ExprKind,
01471                                          SourceRange R) {
01472     ExprResult Result
01473       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
01474     if (Result.isInvalid())
01475       return ExprError();
01476 
01477     return move(Result);
01478   }
01479 
01480   /// \brief Build a new array subscript expression.
01481   ///
01482   /// By default, performs semantic analysis to build the new expression.
01483   /// Subclasses may override this routine to provide different behavior.
01484   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
01485                                              SourceLocation LBracketLoc,
01486                                              Expr *RHS,
01487                                              SourceLocation RBracketLoc) {
01488     return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS,
01489                                              LBracketLoc, RHS,
01490                                              RBracketLoc);
01491   }
01492 
01493   /// \brief Build a new call expression.
01494   ///
01495   /// By default, performs semantic analysis to build the new expression.
01496   /// Subclasses may override this routine to provide different behavior.
01497   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
01498                                    MultiExprArg Args,
01499                                    SourceLocation RParenLoc,
01500                                    Expr *ExecConfig = 0) {
01501     return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc,
01502                                    move(Args), RParenLoc, ExecConfig);
01503   }
01504 
01505   /// \brief Build a new member access expression.
01506   ///
01507   /// By default, performs semantic analysis to build the new expression.
01508   /// Subclasses may override this routine to provide different behavior.
01509   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
01510                                bool isArrow,
01511                                NestedNameSpecifierLoc QualifierLoc,
01512                                SourceLocation TemplateKWLoc,
01513                                const DeclarationNameInfo &MemberNameInfo,
01514                                ValueDecl *Member,
01515                                NamedDecl *FoundDecl,
01516                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
01517                                NamedDecl *FirstQualifierInScope) {
01518     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
01519                                                                       isArrow);
01520     if (!Member->getDeclName()) {
01521       // We have a reference to an unnamed field.  This is always the
01522       // base of an anonymous struct/union member access, i.e. the
01523       // field is always of record type.
01524       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
01525       assert(Member->getType()->isRecordType() &&
01526              "unnamed member not of record type?");
01527 
01528       BaseResult =
01529         getSema().PerformObjectMemberConversion(BaseResult.take(),
01530                                                 QualifierLoc.getNestedNameSpecifier(),
01531                                                 FoundDecl, Member);
01532       if (BaseResult.isInvalid())
01533         return ExprError();
01534       Base = BaseResult.take();
01535       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
01536       MemberExpr *ME =
01537         new (getSema().Context) MemberExpr(Base, isArrow,
01538                                            Member, MemberNameInfo,
01539                                            cast<FieldDecl>(Member)->getType(),
01540                                            VK, OK_Ordinary);
01541       return getSema().Owned(ME);
01542     }
01543 
01544     CXXScopeSpec SS;
01545     SS.Adopt(QualifierLoc);
01546 
01547     Base = BaseResult.take();
01548     QualType BaseType = Base->getType();
01549 
01550     // FIXME: this involves duplicating earlier analysis in a lot of
01551     // cases; we should avoid this when possible.
01552     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
01553     R.addDecl(FoundDecl);
01554     R.resolveKind();
01555 
01556     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
01557                                               SS, TemplateKWLoc,
01558                                               FirstQualifierInScope,
01559                                               R, ExplicitTemplateArgs);
01560   }
01561 
01562   /// \brief Build a new binary operator expression.
01563   ///
01564   /// By default, performs semantic analysis to build the new expression.
01565   /// Subclasses may override this routine to provide different behavior.
01566   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
01567                                          BinaryOperatorKind Opc,
01568                                          Expr *LHS, Expr *RHS) {
01569     return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS);
01570   }
01571 
01572   /// \brief Build a new conditional operator expression.
01573   ///
01574   /// By default, performs semantic analysis to build the new expression.
01575   /// Subclasses may override this routine to provide different behavior.
01576   ExprResult RebuildConditionalOperator(Expr *Cond,
01577                                         SourceLocation QuestionLoc,
01578                                         Expr *LHS,
01579                                         SourceLocation ColonLoc,
01580                                         Expr *RHS) {
01581     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
01582                                         LHS, RHS);
01583   }
01584 
01585   /// \brief Build a new C-style cast expression.
01586   ///
01587   /// By default, performs semantic analysis to build the new expression.
01588   /// Subclasses may override this routine to provide different behavior.
01589   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
01590                                          TypeSourceInfo *TInfo,
01591                                          SourceLocation RParenLoc,
01592                                          Expr *SubExpr) {
01593     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
01594                                          SubExpr);
01595   }
01596 
01597   /// \brief Build a new compound literal expression.
01598   ///
01599   /// By default, performs semantic analysis to build the new expression.
01600   /// Subclasses may override this routine to provide different behavior.
01601   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
01602                                               TypeSourceInfo *TInfo,
01603                                               SourceLocation RParenLoc,
01604                                               Expr *Init) {
01605     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
01606                                               Init);
01607   }
01608 
01609   /// \brief Build a new extended vector element access expression.
01610   ///
01611   /// By default, performs semantic analysis to build the new expression.
01612   /// Subclasses may override this routine to provide different behavior.
01613   ExprResult RebuildExtVectorElementExpr(Expr *Base,
01614                                                SourceLocation OpLoc,
01615                                                SourceLocation AccessorLoc,
01616                                                IdentifierInfo &Accessor) {
01617 
01618     CXXScopeSpec SS;
01619     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
01620     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
01621                                               OpLoc, /*IsArrow*/ false,
01622                                               SS, SourceLocation(),
01623                                               /*FirstQualifierInScope*/ 0,
01624                                               NameInfo,
01625                                               /* TemplateArgs */ 0);
01626   }
01627 
01628   /// \brief Build a new initializer list expression.
01629   ///
01630   /// By default, performs semantic analysis to build the new expression.
01631   /// Subclasses may override this routine to provide different behavior.
01632   ExprResult RebuildInitList(SourceLocation LBraceLoc,
01633                              MultiExprArg Inits,
01634                              SourceLocation RBraceLoc,
01635                              QualType ResultTy) {
01636     ExprResult Result
01637       = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
01638     if (Result.isInvalid() || ResultTy->isDependentType())
01639       return move(Result);
01640     
01641     // Patch in the result type we were given, which may have been computed
01642     // when the initial InitListExpr was built.
01643     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
01644     ILE->setType(ResultTy);
01645     return move(Result);
01646   }
01647 
01648   /// \brief Build a new designated initializer expression.
01649   ///
01650   /// By default, performs semantic analysis to build the new expression.
01651   /// Subclasses may override this routine to provide different behavior.
01652   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
01653                                              MultiExprArg ArrayExprs,
01654                                              SourceLocation EqualOrColonLoc,
01655                                              bool GNUSyntax,
01656                                              Expr *Init) {
01657     ExprResult Result
01658       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
01659                                            Init);
01660     if (Result.isInvalid())
01661       return ExprError();
01662 
01663     ArrayExprs.release();
01664     return move(Result);
01665   }
01666 
01667   /// \brief Build a new value-initialized expression.
01668   ///
01669   /// By default, builds the implicit value initialization without performing
01670   /// any semantic analysis. Subclasses may override this routine to provide
01671   /// different behavior.
01672   ExprResult RebuildImplicitValueInitExpr(QualType T) {
01673     return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
01674   }
01675 
01676   /// \brief Build a new \c va_arg expression.
01677   ///
01678   /// By default, performs semantic analysis to build the new expression.
01679   /// Subclasses may override this routine to provide different behavior.
01680   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
01681                                     Expr *SubExpr, TypeSourceInfo *TInfo,
01682                                     SourceLocation RParenLoc) {
01683     return getSema().BuildVAArgExpr(BuiltinLoc,
01684                                     SubExpr, TInfo,
01685                                     RParenLoc);
01686   }
01687 
01688   /// \brief Build a new expression list in parentheses.
01689   ///
01690   /// By default, performs semantic analysis to build the new expression.
01691   /// Subclasses may override this routine to provide different behavior.
01692   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
01693                                   MultiExprArg SubExprs,
01694                                   SourceLocation RParenLoc) {
01695     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
01696   }
01697 
01698   /// \brief Build a new address-of-label expression.
01699   ///
01700   /// By default, performs semantic analysis, using the name of the label
01701   /// rather than attempting to map the label statement itself.
01702   /// Subclasses may override this routine to provide different behavior.
01703   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
01704                                   SourceLocation LabelLoc, LabelDecl *Label) {
01705     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
01706   }
01707 
01708   /// \brief Build a new GNU statement expression.
01709   ///
01710   /// By default, performs semantic analysis to build the new expression.
01711   /// Subclasses may override this routine to provide different behavior.
01712   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
01713                                    Stmt *SubStmt,
01714                                    SourceLocation RParenLoc) {
01715     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
01716   }
01717 
01718   /// \brief Build a new __builtin_choose_expr expression.
01719   ///
01720   /// By default, performs semantic analysis to build the new expression.
01721   /// Subclasses may override this routine to provide different behavior.
01722   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
01723                                      Expr *Cond, Expr *LHS, Expr *RHS,
01724                                      SourceLocation RParenLoc) {
01725     return SemaRef.ActOnChooseExpr(BuiltinLoc,
01726                                    Cond, LHS, RHS,
01727                                    RParenLoc);
01728   }
01729 
01730   /// \brief Build a new generic selection expression.
01731   ///
01732   /// By default, performs semantic analysis to build the new expression.
01733   /// Subclasses may override this routine to provide different behavior.
01734   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
01735                                          SourceLocation DefaultLoc,
01736                                          SourceLocation RParenLoc,
01737                                          Expr *ControllingExpr,
01738                                          TypeSourceInfo **Types,
01739                                          Expr **Exprs,
01740                                          unsigned NumAssocs) {
01741     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
01742                                                 ControllingExpr, Types, Exprs,
01743                                                 NumAssocs);
01744   }
01745 
01746   /// \brief Build a new overloaded operator call expression.
01747   ///
01748   /// By default, performs semantic analysis to build the new expression.
01749   /// The semantic analysis provides the behavior of template instantiation,
01750   /// copying with transformations that turn what looks like an overloaded
01751   /// operator call into a use of a builtin operator, performing
01752   /// argument-dependent lookup, etc. Subclasses may override this routine to
01753   /// provide different behavior.
01754   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
01755                                               SourceLocation OpLoc,
01756                                               Expr *Callee,
01757                                               Expr *First,
01758                                               Expr *Second);
01759 
01760   /// \brief Build a new C++ "named" cast expression, such as static_cast or
01761   /// reinterpret_cast.
01762   ///
01763   /// By default, this routine dispatches to one of the more-specific routines
01764   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
01765   /// Subclasses may override this routine to provide different behavior.
01766   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
01767                                            Stmt::StmtClass Class,
01768                                            SourceLocation LAngleLoc,
01769                                            TypeSourceInfo *TInfo,
01770                                            SourceLocation RAngleLoc,
01771                                            SourceLocation LParenLoc,
01772                                            Expr *SubExpr,
01773                                            SourceLocation RParenLoc) {
01774     switch (Class) {
01775     case Stmt::CXXStaticCastExprClass:
01776       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
01777                                                    RAngleLoc, LParenLoc,
01778                                                    SubExpr, RParenLoc);
01779 
01780     case Stmt::CXXDynamicCastExprClass:
01781       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
01782                                                     RAngleLoc, LParenLoc,
01783                                                     SubExpr, RParenLoc);
01784 
01785     case Stmt::CXXReinterpretCastExprClass:
01786       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
01787                                                         RAngleLoc, LParenLoc,
01788                                                         SubExpr,
01789                                                         RParenLoc);
01790 
01791     case Stmt::CXXConstCastExprClass:
01792       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
01793                                                    RAngleLoc, LParenLoc,
01794                                                    SubExpr, RParenLoc);
01795 
01796     default:
01797       llvm_unreachable("Invalid C++ named cast");
01798     }
01799   }
01800 
01801   /// \brief Build a new C++ static_cast expression.
01802   ///
01803   /// By default, performs semantic analysis to build the new expression.
01804   /// Subclasses may override this routine to provide different behavior.
01805   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
01806                                             SourceLocation LAngleLoc,
01807                                             TypeSourceInfo *TInfo,
01808                                             SourceLocation RAngleLoc,
01809                                             SourceLocation LParenLoc,
01810                                             Expr *SubExpr,
01811                                             SourceLocation RParenLoc) {
01812     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
01813                                        TInfo, SubExpr,
01814                                        SourceRange(LAngleLoc, RAngleLoc),
01815                                        SourceRange(LParenLoc, RParenLoc));
01816   }
01817 
01818   /// \brief Build a new C++ dynamic_cast expression.
01819   ///
01820   /// By default, performs semantic analysis to build the new expression.
01821   /// Subclasses may override this routine to provide different behavior.
01822   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
01823                                              SourceLocation LAngleLoc,
01824                                              TypeSourceInfo *TInfo,
01825                                              SourceLocation RAngleLoc,
01826                                              SourceLocation LParenLoc,
01827                                              Expr *SubExpr,
01828                                              SourceLocation RParenLoc) {
01829     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
01830                                        TInfo, SubExpr,
01831                                        SourceRange(LAngleLoc, RAngleLoc),
01832                                        SourceRange(LParenLoc, RParenLoc));
01833   }
01834 
01835   /// \brief Build a new C++ reinterpret_cast expression.
01836   ///
01837   /// By default, performs semantic analysis to build the new expression.
01838   /// Subclasses may override this routine to provide different behavior.
01839   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
01840                                                  SourceLocation LAngleLoc,
01841                                                  TypeSourceInfo *TInfo,
01842                                                  SourceLocation RAngleLoc,
01843                                                  SourceLocation LParenLoc,
01844                                                  Expr *SubExpr,
01845                                                  SourceLocation RParenLoc) {
01846     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
01847                                        TInfo, SubExpr,
01848                                        SourceRange(LAngleLoc, RAngleLoc),
01849                                        SourceRange(LParenLoc, RParenLoc));
01850   }
01851 
01852   /// \brief Build a new C++ const_cast expression.
01853   ///
01854   /// By default, performs semantic analysis to build the new expression.
01855   /// Subclasses may override this routine to provide different behavior.
01856   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
01857                                            SourceLocation LAngleLoc,
01858                                            TypeSourceInfo *TInfo,
01859                                            SourceLocation RAngleLoc,
01860                                            SourceLocation LParenLoc,
01861                                            Expr *SubExpr,
01862                                            SourceLocation RParenLoc) {
01863     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
01864                                        TInfo, SubExpr,
01865                                        SourceRange(LAngleLoc, RAngleLoc),
01866                                        SourceRange(LParenLoc, RParenLoc));
01867   }
01868 
01869   /// \brief Build a new C++ functional-style cast expression.
01870   ///
01871   /// By default, performs semantic analysis to build the new expression.
01872   /// Subclasses may override this routine to provide different behavior.
01873   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
01874                                           SourceLocation LParenLoc,
01875                                           Expr *Sub,
01876                                           SourceLocation RParenLoc) {
01877     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
01878                                                MultiExprArg(&Sub, 1),
01879                                                RParenLoc);
01880   }
01881 
01882   /// \brief Build a new C++ typeid(type) expression.
01883   ///
01884   /// By default, performs semantic analysis to build the new expression.
01885   /// Subclasses may override this routine to provide different behavior.
01886   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
01887                                         SourceLocation TypeidLoc,
01888                                         TypeSourceInfo *Operand,
01889                                         SourceLocation RParenLoc) {
01890     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 
01891                                     RParenLoc);
01892   }
01893 
01894 
01895   /// \brief Build a new C++ typeid(expr) expression.
01896   ///
01897   /// By default, performs semantic analysis to build the new expression.
01898   /// Subclasses may override this routine to provide different behavior.
01899   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
01900                                         SourceLocation TypeidLoc,
01901                                         Expr *Operand,
01902                                         SourceLocation RParenLoc) {
01903     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
01904                                     RParenLoc);
01905   }
01906 
01907   /// \brief Build a new C++ __uuidof(type) expression.
01908   ///
01909   /// By default, performs semantic analysis to build the new expression.
01910   /// Subclasses may override this routine to provide different behavior.
01911   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
01912                                         SourceLocation TypeidLoc,
01913                                         TypeSourceInfo *Operand,
01914                                         SourceLocation RParenLoc) {
01915     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 
01916                                     RParenLoc);
01917   }
01918 
01919   /// \brief Build a new C++ __uuidof(expr) expression.
01920   ///
01921   /// By default, performs semantic analysis to build the new expression.
01922   /// Subclasses may override this routine to provide different behavior.
01923   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
01924                                         SourceLocation TypeidLoc,
01925                                         Expr *Operand,
01926                                         SourceLocation RParenLoc) {
01927     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
01928                                     RParenLoc);
01929   }
01930 
01931   /// \brief Build a new C++ "this" expression.
01932   ///
01933   /// By default, builds a new "this" expression without performing any
01934   /// semantic analysis. Subclasses may override this routine to provide
01935   /// different behavior.
01936   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
01937                                 QualType ThisType,
01938                                 bool isImplicit) {
01939     getSema().CheckCXXThisCapture(ThisLoc);
01940     return getSema().Owned(
01941                       new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
01942                                                           isImplicit));
01943   }
01944 
01945   /// \brief Build a new C++ throw expression.
01946   ///
01947   /// By default, performs semantic analysis to build the new expression.
01948   /// Subclasses may override this routine to provide different behavior.
01949   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
01950                                  bool IsThrownVariableInScope) {
01951     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
01952   }
01953 
01954   /// \brief Build a new C++ default-argument expression.
01955   ///
01956   /// By default, builds a new default-argument expression, which does not
01957   /// require any semantic analysis. Subclasses may override this routine to
01958   /// provide different behavior.
01959   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 
01960                                             ParmVarDecl *Param) {
01961     return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
01962                                                      Param));
01963   }
01964 
01965   /// \brief Build a new C++ zero-initialization expression.
01966   ///
01967   /// By default, performs semantic analysis to build the new expression.
01968   /// Subclasses may override this routine to provide different behavior.
01969   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
01970                                            SourceLocation LParenLoc,
01971                                            SourceLocation RParenLoc) {
01972     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
01973                                                MultiExprArg(getSema(), 0, 0),
01974                                                RParenLoc);
01975   }
01976 
01977   /// \brief Build a new C++ "new" expression.
01978   ///
01979   /// By default, performs semantic analysis to build the new expression.
01980   /// Subclasses may override this routine to provide different behavior.
01981   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
01982                                bool UseGlobal,
01983                                SourceLocation PlacementLParen,
01984                                MultiExprArg PlacementArgs,
01985                                SourceLocation PlacementRParen,
01986                                SourceRange TypeIdParens,
01987                                QualType AllocatedType,
01988                                TypeSourceInfo *AllocatedTypeInfo,
01989                                Expr *ArraySize,
01990                                SourceRange DirectInitRange,
01991                                Expr *Initializer) {
01992     return getSema().BuildCXXNew(StartLoc, UseGlobal,
01993                                  PlacementLParen,
01994                                  move(PlacementArgs),
01995                                  PlacementRParen,
01996                                  TypeIdParens,
01997                                  AllocatedType,
01998                                  AllocatedTypeInfo,
01999                                  ArraySize,
02000                                  DirectInitRange,
02001                                  Initializer);
02002   }
02003 
02004   /// \brief Build a new C++ "delete" expression.
02005   ///
02006   /// By default, performs semantic analysis to build the new expression.
02007   /// Subclasses may override this routine to provide different behavior.
02008   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
02009                                         bool IsGlobalDelete,
02010                                         bool IsArrayForm,
02011                                         Expr *Operand) {
02012     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
02013                                     Operand);
02014   }
02015 
02016   /// \brief Build a new unary type trait expression.
02017   ///
02018   /// By default, performs semantic analysis to build the new expression.
02019   /// Subclasses may override this routine to provide different behavior.
02020   ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
02021                                    SourceLocation StartLoc,
02022                                    TypeSourceInfo *T,
02023                                    SourceLocation RParenLoc) {
02024     return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc);
02025   }
02026 
02027   /// \brief Build a new binary type trait expression.
02028   ///
02029   /// By default, performs semantic analysis to build the new expression.
02030   /// Subclasses may override this routine to provide different behavior.
02031   ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait,
02032                                     SourceLocation StartLoc,
02033                                     TypeSourceInfo *LhsT,
02034                                     TypeSourceInfo *RhsT,
02035                                     SourceLocation RParenLoc) {
02036     return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc);
02037   }
02038 
02039   /// \brief Build a new type trait expression.
02040   ///
02041   /// By default, performs semantic analysis to build the new expression.
02042   /// Subclasses may override this routine to provide different behavior.
02043   ExprResult RebuildTypeTrait(TypeTrait Trait,
02044                               SourceLocation StartLoc,
02045                               ArrayRef<TypeSourceInfo *> Args,
02046                               SourceLocation RParenLoc) {
02047     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
02048   }
02049   
02050   /// \brief Build a new array type trait expression.
02051   ///
02052   /// By default, performs semantic analysis to build the new expression.
02053   /// Subclasses may override this routine to provide different behavior.
02054   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
02055                                    SourceLocation StartLoc,
02056                                    TypeSourceInfo *TSInfo,
02057                                    Expr *DimExpr,
02058                                    SourceLocation RParenLoc) {
02059     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
02060   }
02061 
02062   /// \brief Build a new expression trait expression.
02063   ///
02064   /// By default, performs semantic analysis to build the new expression.
02065   /// Subclasses may override this routine to provide different behavior.
02066   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
02067                                    SourceLocation StartLoc,
02068                                    Expr *Queried,
02069                                    SourceLocation RParenLoc) {
02070     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
02071   }
02072 
02073   /// \brief Build a new (previously unresolved) declaration reference
02074   /// expression.
02075   ///
02076   /// By default, performs semantic analysis to build the new expression.
02077   /// Subclasses may override this routine to provide different behavior.
02078   ExprResult RebuildDependentScopeDeclRefExpr(
02079                                           NestedNameSpecifierLoc QualifierLoc,
02080                                           SourceLocation TemplateKWLoc,
02081                                        const DeclarationNameInfo &NameInfo,
02082                               const TemplateArgumentListInfo *TemplateArgs) {
02083     CXXScopeSpec SS;
02084     SS.Adopt(QualifierLoc);
02085 
02086     if (TemplateArgs || TemplateKWLoc.isValid())
02087       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc,
02088                                                     NameInfo, TemplateArgs);
02089 
02090     return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
02091   }
02092 
02093   /// \brief Build a new template-id expression.
02094   ///
02095   /// By default, performs semantic analysis to build the new expression.
02096   /// Subclasses may override this routine to provide different behavior.
02097   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
02098                                    SourceLocation TemplateKWLoc,
02099                                    LookupResult &R,
02100                                    bool RequiresADL,
02101                               const TemplateArgumentListInfo *TemplateArgs) {
02102     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
02103                                          TemplateArgs);
02104   }
02105 
02106   /// \brief Build a new object-construction expression.
02107   ///
02108   /// By default, performs semantic analysis to build the new expression.
02109   /// Subclasses may override this routine to provide different behavior.
02110   ExprResult RebuildCXXConstructExpr(QualType T,
02111                                      SourceLocation Loc,
02112                                      CXXConstructorDecl *Constructor,
02113                                      bool IsElidable,
02114                                      MultiExprArg Args,
02115                                      bool HadMultipleCandidates,
02116                                      bool RequiresZeroInit,
02117                              CXXConstructExpr::ConstructionKind ConstructKind,
02118                                      SourceRange ParenRange) {
02119     ASTOwningVector<Expr*> ConvertedArgs(SemaRef);
02120     if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 
02121                                           ConvertedArgs))
02122       return ExprError();
02123     
02124     return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
02125                                            move_arg(ConvertedArgs),
02126                                            HadMultipleCandidates,
02127                                            RequiresZeroInit, ConstructKind,
02128                                            ParenRange);
02129   }
02130 
02131   /// \brief Build a new object-construction expression.
02132   ///
02133   /// By default, performs semantic analysis to build the new expression.
02134   /// Subclasses may override this routine to provide different behavior.
02135   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
02136                                            SourceLocation LParenLoc,
02137                                            MultiExprArg Args,
02138                                            SourceLocation RParenLoc) {
02139     return getSema().BuildCXXTypeConstructExpr(TSInfo,
02140                                                LParenLoc,
02141                                                move(Args),
02142                                                RParenLoc);
02143   }
02144 
02145   /// \brief Build a new object-construction expression.
02146   ///
02147   /// By default, performs semantic analysis to build the new expression.
02148   /// Subclasses may override this routine to provide different behavior.
02149   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
02150                                                SourceLocation LParenLoc,
02151                                                MultiExprArg Args,
02152                                                SourceLocation RParenLoc) {
02153     return getSema().BuildCXXTypeConstructExpr(TSInfo,
02154                                                LParenLoc,
02155                                                move(Args),
02156                                                RParenLoc);
02157   }
02158 
02159   /// \brief Build a new member reference expression.
02160   ///
02161   /// By default, performs semantic analysis to build the new expression.
02162   /// Subclasses may override this routine to provide different behavior.
02163   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
02164                                                 QualType BaseType,
02165                                                 bool IsArrow,
02166                                                 SourceLocation OperatorLoc,
02167                                           NestedNameSpecifierLoc QualifierLoc,
02168                                                 SourceLocation TemplateKWLoc,
02169                                             NamedDecl *FirstQualifierInScope,
02170                                    const DeclarationNameInfo &MemberNameInfo,
02171                               const TemplateArgumentListInfo *TemplateArgs) {
02172     CXXScopeSpec SS;
02173     SS.Adopt(QualifierLoc);
02174 
02175     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
02176                                             OperatorLoc, IsArrow,
02177                                             SS, TemplateKWLoc,
02178                                             FirstQualifierInScope,
02179                                             MemberNameInfo,
02180                                             TemplateArgs);
02181   }
02182 
02183   /// \brief Build a new member reference expression.
02184   ///
02185   /// By default, performs semantic analysis to build the new expression.
02186   /// Subclasses may override this routine to provide different behavior.
02187   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
02188                                          SourceLocation OperatorLoc,
02189                                          bool IsArrow,
02190                                          NestedNameSpecifierLoc QualifierLoc,
02191                                          SourceLocation TemplateKWLoc,
02192                                          NamedDecl *FirstQualifierInScope,
02193                                          LookupResult &R,
02194                                 const TemplateArgumentListInfo *TemplateArgs) {
02195     CXXScopeSpec SS;
02196     SS.Adopt(QualifierLoc);
02197 
02198     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
02199                                             OperatorLoc, IsArrow,
02200                                             SS, TemplateKWLoc,
02201                                             FirstQualifierInScope,
02202                                             R, TemplateArgs);
02203   }
02204 
02205   /// \brief Build a new noexcept expression.
02206   ///
02207   /// By default, performs semantic analysis to build the new expression.
02208   /// Subclasses may override this routine to provide different behavior.
02209   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
02210     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
02211   }
02212 
02213   /// \brief Build a new expression to compute the length of a parameter pack.
02214   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 
02215                                    SourceLocation PackLoc, 
02216                                    SourceLocation RParenLoc,
02217                                    llvm::Optional<unsigned> Length) {
02218     if (Length)
02219       return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 
02220                                                   OperatorLoc, Pack, PackLoc, 
02221                                                   RParenLoc, *Length);
02222     
02223     return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 
02224                                                 OperatorLoc, Pack, PackLoc, 
02225                                                 RParenLoc);
02226   }
02227 
02228   /// \brief Build a new Objective-C boxed expression.
02229   ///
02230   /// By default, performs semantic analysis to build the new expression.
02231   /// Subclasses may override this routine to provide different behavior.
02232   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
02233     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
02234   }
02235   
02236   /// \brief Build a new Objective-C array literal.
02237   ///
02238   /// By default, performs semantic analysis to build the new expression.
02239   /// Subclasses may override this routine to provide different behavior.
02240   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
02241                                      Expr **Elements, unsigned NumElements) {
02242     return getSema().BuildObjCArrayLiteral(Range, 
02243                                            MultiExprArg(Elements, NumElements));
02244   }
02245  
02246   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 
02247                                          Expr *Base, Expr *Key,
02248                                          ObjCMethodDecl *getterMethod,
02249                                          ObjCMethodDecl *setterMethod) {
02250     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
02251                                                    getterMethod, setterMethod);
02252   }
02253 
02254   /// \brief Build a new Objective-C dictionary literal.
02255   ///
02256   /// By default, performs semantic analysis to build the new expression.
02257   /// Subclasses may override this routine to provide different behavior.
02258   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
02259                                           ObjCDictionaryElement *Elements,
02260                                           unsigned NumElements) {
02261     return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements);
02262   }
02263   
02264   /// \brief Build a new Objective-C @encode expression.
02265   ///
02266   /// By default, performs semantic analysis to build the new expression.
02267   /// Subclasses may override this routine to provide different behavior.
02268   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
02269                                          TypeSourceInfo *EncodeTypeInfo,
02270                                          SourceLocation RParenLoc) {
02271     return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
02272                                                            RParenLoc));
02273   }
02274 
02275   /// \brief Build a new Objective-C class message.
02276   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
02277                                           Selector Sel,
02278                                           ArrayRef<SourceLocation> SelectorLocs,
02279                                           ObjCMethodDecl *Method,
02280                                           SourceLocation LBracLoc, 
02281                                           MultiExprArg Args,
02282                                           SourceLocation RBracLoc) {
02283     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
02284                                      ReceiverTypeInfo->getType(),
02285                                      /*SuperLoc=*/SourceLocation(),
02286                                      Sel, Method, LBracLoc, SelectorLocs,
02287                                      RBracLoc, move(Args));
02288   }
02289 
02290   /// \brief Build a new Objective-C instance message.
02291   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
02292                                           Selector Sel,
02293                                           ArrayRef<SourceLocation> SelectorLocs,
02294                                           ObjCMethodDecl *Method,
02295                                           SourceLocation LBracLoc, 
02296                                           MultiExprArg Args,
02297                                           SourceLocation RBracLoc) {
02298     return SemaRef.BuildInstanceMessage(Receiver,
02299                                         Receiver->getType(),
02300                                         /*SuperLoc=*/SourceLocation(),
02301                                         Sel, Method, LBracLoc, SelectorLocs,
02302                                         RBracLoc, move(Args));
02303   }
02304 
02305   /// \brief Build a new Objective-C ivar reference expression.
02306   ///
02307   /// By default, performs semantic analysis to build the new expression.
02308   /// Subclasses may override this routine to provide different behavior.
02309   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
02310                                           SourceLocation IvarLoc,
02311                                           bool IsArrow, bool IsFreeIvar) {
02312     // FIXME: We lose track of the IsFreeIvar bit.
02313     CXXScopeSpec SS;
02314     ExprResult Base = getSema().Owned(BaseArg);
02315     LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
02316                    Sema::LookupMemberName);
02317     ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
02318                                                          /*FIME:*/IvarLoc,
02319                                                          SS, 0,
02320                                                          false);
02321     if (Result.isInvalid() || Base.isInvalid())
02322       return ExprError();
02323     
02324     if (Result.get())
02325       return move(Result);
02326     
02327     return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(),
02328                                               /*FIXME:*/IvarLoc, IsArrow,
02329                                               SS, SourceLocation(),
02330                                               /*FirstQualifierInScope=*/0,
02331                                               R, 
02332                                               /*TemplateArgs=*/0);
02333   }
02334 
02335   /// \brief Build a new Objective-C property reference expression.
02336   ///
02337   /// By default, performs semantic analysis to build the new expression.
02338   /// Subclasses may override this routine to provide different behavior.
02339   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 
02340                                         ObjCPropertyDecl *Property,
02341                                         SourceLocation PropertyLoc) {
02342     CXXScopeSpec SS;
02343     ExprResult Base = getSema().Owned(BaseArg);
02344     LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
02345                    Sema::LookupMemberName);
02346     bool IsArrow = false;
02347     ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
02348                                                          /*FIME:*/PropertyLoc,
02349                                                          SS, 0, false);
02350     if (Result.isInvalid() || Base.isInvalid())
02351       return ExprError();
02352     
02353     if (Result.get())
02354       return move(Result);
02355     
02356     return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(),
02357                                               /*FIXME:*/PropertyLoc, IsArrow, 
02358                                               SS, SourceLocation(),
02359                                               /*FirstQualifierInScope=*/0,
02360                                               R, 
02361                                               /*TemplateArgs=*/0);
02362   }
02363   
02364   /// \brief Build a new Objective-C property reference expression.
02365   ///
02366   /// By default, performs semantic analysis to build the new expression.
02367   /// Subclasses may override this routine to provide different behavior.
02368   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
02369                                         ObjCMethodDecl *Getter,
02370                                         ObjCMethodDecl *Setter,
02371                                         SourceLocation PropertyLoc) {
02372     // Since these expressions can only be value-dependent, we do not
02373     // need to perform semantic analysis again.
02374     return Owned(
02375       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
02376                                                   VK_LValue, OK_ObjCProperty,
02377                                                   PropertyLoc, Base));
02378   }
02379 
02380   /// \brief Build a new Objective-C "isa" expression.
02381   ///
02382   /// By default, performs semantic analysis to build the new expression.
02383   /// Subclasses may override this routine to provide different behavior.
02384   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
02385                                       bool IsArrow) {
02386     CXXScopeSpec SS;
02387     ExprResult Base = getSema().Owned(BaseArg);
02388     LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
02389                    Sema::LookupMemberName);
02390     ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
02391                                                          /*FIME:*/IsaLoc,
02392                                                          SS, 0, false);
02393     if (Result.isInvalid() || Base.isInvalid())
02394       return ExprError();
02395     
02396     if (Result.get())
02397       return move(Result);
02398     
02399     return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(),
02400                                               /*FIXME:*/IsaLoc, IsArrow,
02401                                               SS, SourceLocation(),
02402                                               /*FirstQualifierInScope=*/0,
02403                                               R, 
02404                                               /*TemplateArgs=*/0);
02405   }
02406   
02407   /// \brief Build a new shuffle vector expression.
02408   ///
02409   /// By default, performs semantic analysis to build the new expression.
02410   /// Subclasses may override this routine to provide different behavior.
02411   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
02412                                       MultiExprArg SubExprs,
02413                                       SourceLocation RParenLoc) {
02414     // Find the declaration for __builtin_shufflevector
02415     const IdentifierInfo &Name
02416       = SemaRef.Context.Idents.get("__builtin_shufflevector");
02417     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
02418     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
02419     assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
02420 
02421     // Build a reference to the __builtin_shufflevector builtin
02422     FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
02423     ExprResult Callee
02424       = SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Builtin, false,
02425                                                         Builtin->getType(),
02426                                                         VK_LValue, BuiltinLoc));
02427     Callee = SemaRef.UsualUnaryConversions(Callee.take());
02428     if (Callee.isInvalid())
02429       return ExprError();
02430 
02431     // Build the CallExpr
02432     unsigned NumSubExprs = SubExprs.size();
02433     Expr **Subs = (Expr **)SubExprs.release();
02434     ExprResult TheCall = SemaRef.Owned(
02435       new (SemaRef.Context) CallExpr(SemaRef.Context, Callee.take(),
02436                                                        Subs, NumSubExprs,
02437                                                    Builtin->getCallResultType(),
02438                             Expr::getValueKindForType(Builtin->getResultType()),
02439                                      RParenLoc));
02440 
02441     // Type-check the __builtin_shufflevector expression.
02442     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.take()));
02443   }
02444 
02445   /// \brief Build a new template argument pack expansion.
02446   ///
02447   /// By default, performs semantic analysis to build a new pack expansion
02448   /// for a template argument. Subclasses may override this routine to provide 
02449   /// different behavior.
02450   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
02451                                            SourceLocation EllipsisLoc,
02452                                        llvm::Optional<unsigned> NumExpansions) {
02453     switch (Pattern.getArgument().getKind()) {
02454     case TemplateArgument::Expression: {
02455       ExprResult Result
02456         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
02457                                        EllipsisLoc, NumExpansions);
02458       if (Result.isInvalid())
02459         return TemplateArgumentLoc();
02460           
02461       return TemplateArgumentLoc(Result.get(), Result.get());
02462     }
02463         
02464     case TemplateArgument::Template:
02465       return TemplateArgumentLoc(TemplateArgument(
02466                                           Pattern.getArgument().getAsTemplate(),
02467                                                   NumExpansions),
02468                                  Pattern.getTemplateQualifierLoc(),
02469                                  Pattern.getTemplateNameLoc(),
02470                                  EllipsisLoc);
02471         
02472     case TemplateArgument::Null:
02473     case TemplateArgument::Integral:
02474     case TemplateArgument::Declaration:
02475     case TemplateArgument::Pack:
02476     case TemplateArgument::TemplateExpansion:
02477       llvm_unreachable("Pack expansion pattern has no parameter packs");
02478         
02479     case TemplateArgument::Type:
02480       if (TypeSourceInfo *Expansion 
02481             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
02482                                            EllipsisLoc,
02483                                            NumExpansions))
02484         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
02485                                    Expansion);
02486       break;
02487     }
02488     
02489     return TemplateArgumentLoc();
02490   }
02491   
02492   /// \brief Build a new expression pack expansion.
02493   ///
02494   /// By default, performs semantic analysis to build a new pack expansion
02495   /// for an expression. Subclasses may override this routine to provide 
02496   /// different behavior.
02497   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
02498                                   llvm::Optional<unsigned> NumExpansions) {
02499     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
02500   }
02501 
02502   /// \brief Build a new atomic operation expression.
02503   ///
02504   /// By default, performs semantic analysis to build the new expression.
02505   /// Subclasses may override this routine to provide different behavior.
02506   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
02507                                MultiExprArg SubExprs,
02508                                QualType RetTy,
02509                                AtomicExpr::AtomicOp Op,
02510                                SourceLocation RParenLoc) {
02511     // Just create the expression; there is not any interesting semantic
02512     // analysis here because we can't actually build an AtomicExpr until
02513     // we are sure it is semantically sound.
02514     unsigned NumSubExprs = SubExprs.size();
02515     Expr **Subs = (Expr **)SubExprs.release();
02516     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, Subs,
02517                                             NumSubExprs, RetTy, Op,
02518                                             RParenLoc);
02519   }
02520 
02521 private:
02522   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
02523                                      QualType ObjectType,
02524                                      NamedDecl *FirstQualifierInScope,
02525                                      CXXScopeSpec &SS);
02526 
02527   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
02528                                              QualType ObjectType,
02529                                              NamedDecl *FirstQualifierInScope,
02530                                              CXXScopeSpec &SS);
02531 };
02532 
02533 template<typename Derived>
02534 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
02535   if (!S)
02536     return SemaRef.Owned(S);
02537 
02538   switch (S->getStmtClass()) {
02539   case Stmt::NoStmtClass: break;
02540 
02541   // Transform individual statement nodes
02542 #define STMT(Node, Parent)                                              \
02543   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
02544 #define ABSTRACT_STMT(Node)
02545 #define EXPR(Node, Parent)
02546 #include "clang/AST/StmtNodes.inc"
02547 
02548   // Transform expressions by calling TransformExpr.
02549 #define STMT(Node, Parent)
02550 #define ABSTRACT_STMT(Stmt)
02551 #define EXPR(Node, Parent) case Stmt::Node##Class:
02552 #include "clang/AST/StmtNodes.inc"
02553     {
02554       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
02555       if (E.isInvalid())
02556         return StmtError();
02557 
02558       return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take()));
02559     }
02560   }
02561 
02562   return SemaRef.Owned(S);
02563 }
02564 
02565 
02566 template<typename Derived>
02567 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
02568   if (!E)
02569     return SemaRef.Owned(E);
02570 
02571   switch (E->getStmtClass()) {
02572     case Stmt::NoStmtClass: break;
02573 #define STMT(Node, Parent) case Stmt::Node##Class: break;
02574 #define ABSTRACT_STMT(Stmt)
02575 #define EXPR(Node, Parent)                                              \
02576     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
02577 #include "clang/AST/StmtNodes.inc"
02578   }
02579 
02580   return SemaRef.Owned(E);
02581 }
02582 
02583 template<typename Derived>
02584 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs, 
02585                                             unsigned NumInputs, 
02586                                             bool IsCall,
02587                                       SmallVectorImpl<Expr *> &Outputs,
02588                                             bool *ArgChanged) {
02589   for (unsigned I = 0; I != NumInputs; ++I) {
02590     // If requested, drop call arguments that need to be dropped.
02591     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
02592       if (ArgChanged)
02593         *ArgChanged = true;
02594       
02595       break;
02596     }
02597     
02598     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
02599       Expr *Pattern = Expansion->getPattern();
02600         
02601       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
02602       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
02603       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
02604       
02605       // Determine whether the set of unexpanded parameter packs can and should
02606       // be expanded.
02607       bool Expand = true;
02608       bool RetainExpansion = false;
02609       llvm::Optional<unsigned> OrigNumExpansions
02610         = Expansion->getNumExpansions();
02611       llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
02612       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
02613                                                Pattern->getSourceRange(),
02614                                                Unexpanded,
02615                                                Expand, RetainExpansion,
02616                                                NumExpansions))
02617         return true;
02618         
02619       if (!Expand) {
02620         // The transform has determined that we should perform a simple
02621         // transformation on the pack expansion, producing another pack 
02622         // expansion.
02623         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
02624         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
02625         if (OutPattern.isInvalid())
02626           return true;
02627         
02628         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 
02629                                                 Expansion->getEllipsisLoc(),
02630                                                            NumExpansions);
02631         if (Out.isInvalid())
02632           return true;
02633         
02634         if (ArgChanged)
02635           *ArgChanged = true;
02636         Outputs.push_back(Out.get());
02637         continue;
02638       }
02639 
02640       // Record right away that the argument was changed.  This needs
02641       // to happen even if the array expands to nothing.
02642       if (ArgChanged) *ArgChanged = true;
02643       
02644       // The transform has determined that we should perform an elementwise
02645       // expansion of the pattern. Do so.
02646       for (unsigned I = 0; I != *NumExpansions; ++I) {
02647         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
02648         ExprResult Out = getDerived().TransformExpr(Pattern);
02649         if (Out.isInvalid())
02650           return true;
02651 
02652         if (Out.get()->containsUnexpandedParameterPack()) {
02653           Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(),
02654                                      OrigNumExpansions);
02655           if (Out.isInvalid())
02656             return true;
02657         }
02658         
02659         Outputs.push_back(Out.get());
02660       }
02661         
02662       continue;
02663     }
02664     
02665     ExprResult Result = getDerived().TransformExpr(Inputs[I]);
02666     if (Result.isInvalid())
02667       return true;
02668     
02669     if (Result.get() != Inputs[I] && ArgChanged)
02670       *ArgChanged = true;
02671     
02672     Outputs.push_back(Result.get());    
02673   }
02674   
02675   return false;
02676 }
02677 
02678 template<typename Derived>
02679 NestedNameSpecifierLoc
02680 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
02681                                                     NestedNameSpecifierLoc NNS,
02682                                                      QualType ObjectType,
02683                                              NamedDecl *FirstQualifierInScope) {
02684   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
02685   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 
02686        Qualifier = Qualifier.getPrefix())
02687     Qualifiers.push_back(Qualifier);
02688 
02689   CXXScopeSpec SS;
02690   while (!Qualifiers.empty()) {
02691     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
02692     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
02693     
02694     switch (QNNS->getKind()) {
02695     case NestedNameSpecifier::Identifier:
02696       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0, 
02697                                               *QNNS->getAsIdentifier(),
02698                                               Q.getLocalBeginLoc(), 
02699                                               Q.getLocalEndLoc(),
02700                                               ObjectType, false, SS, 
02701                                               FirstQualifierInScope, false))
02702         return NestedNameSpecifierLoc();
02703         
02704       break;
02705       
02706     case NestedNameSpecifier::Namespace: {
02707       NamespaceDecl *NS
02708         = cast_or_null<NamespaceDecl>(
02709                                     getDerived().TransformDecl(
02710                                                           Q.getLocalBeginLoc(),
02711                                                        QNNS->getAsNamespace()));
02712       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
02713       break;
02714     }
02715       
02716     case NestedNameSpecifier::NamespaceAlias: {
02717       NamespaceAliasDecl *Alias
02718         = cast_or_null<NamespaceAliasDecl>(
02719                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
02720                                                  QNNS->getAsNamespaceAlias()));
02721       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 
02722                 Q.getLocalEndLoc());
02723       break;
02724     }
02725       
02726     case NestedNameSpecifier::Global:
02727       // There is no meaningful transformation that one could perform on the
02728       // global scope.
02729       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
02730       break;
02731       
02732     case NestedNameSpecifier::TypeSpecWithTemplate:
02733     case NestedNameSpecifier::TypeSpec: {
02734       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
02735                                               FirstQualifierInScope, SS);
02736       
02737       if (!TL)
02738         return NestedNameSpecifierLoc();
02739       
02740       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
02741           (SemaRef.getLangOpts().CPlusPlus0x && 
02742            TL.getType()->isEnumeralType())) {
02743         assert(!TL.getType().hasLocalQualifiers() && 
02744                "Can't get cv-qualifiers here");
02745         if (TL.getType()->isEnumeralType())
02746           SemaRef.Diag(TL.getBeginLoc(),
02747                        diag::warn_cxx98_compat_enum_nested_name_spec);
02748         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
02749                   Q.getLocalEndLoc());
02750         break;
02751       }
02752       // If the nested-name-specifier is an invalid type def, don't emit an
02753       // error because a previous error should have already been emitted.
02754       TypedefTypeLoc* TTL = dyn_cast<TypedefTypeLoc>(&TL);
02755       if (!TTL || !TTL->getTypedefNameDecl()->isInvalidDecl()) {
02756         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 
02757           << TL.getType() << SS.getRange();
02758       }
02759       return NestedNameSpecifierLoc();
02760     }
02761     }
02762     
02763     // The qualifier-in-scope and object type only apply to the leftmost entity.
02764     FirstQualifierInScope = 0;
02765     ObjectType = QualType();
02766   }
02767   
02768   // Don't rebuild the nested-name-specifier if we don't have to.
02769   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 
02770       !getDerived().AlwaysRebuild())
02771     return NNS;
02772   
02773   // If we can re-use the source-location data from the original 
02774   // nested-name-specifier, do so.
02775   if (SS.location_size() == NNS.getDataLength() &&
02776       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
02777     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
02778 
02779   // Allocate new nested-name-specifier location information.
02780   return SS.getWithLocInContext(SemaRef.Context);
02781 }
02782 
02783 template<typename Derived>
02784 DeclarationNameInfo
02785 TreeTransform<Derived>
02786 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
02787   DeclarationName Name = NameInfo.getName();
02788   if (!Name)
02789     return DeclarationNameInfo();
02790 
02791   switch (Name.getNameKind()) {
02792   case DeclarationName::Identifier:
02793   case DeclarationName::ObjCZeroArgSelector:
02794   case DeclarationName::ObjCOneArgSelector:
02795   case DeclarationName::ObjCMultiArgSelector:
02796   case DeclarationName::CXXOperatorName:
02797   case DeclarationName::CXXLiteralOperatorName:
02798   case DeclarationName::CXXUsingDirective:
02799     return NameInfo;
02800 
02801   case DeclarationName::CXXConstructorName:
02802   case DeclarationName::CXXDestructorName:
02803   case DeclarationName::CXXConversionFunctionName: {
02804     TypeSourceInfo *NewTInfo;
02805     CanQualType NewCanTy;
02806     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
02807       NewTInfo = getDerived().TransformType(OldTInfo);
02808       if (!NewTInfo)
02809         return DeclarationNameInfo();
02810       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
02811     }
02812     else {
02813       NewTInfo = 0;
02814       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
02815       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
02816       if (NewT.isNull())
02817         return DeclarationNameInfo();
02818       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
02819     }
02820 
02821     DeclarationName NewName
02822       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
02823                                                            NewCanTy);
02824     DeclarationNameInfo NewNameInfo(NameInfo);
02825     NewNameInfo.setName(NewName);
02826     NewNameInfo.setNamedTypeInfo(NewTInfo);
02827     return NewNameInfo;
02828   }
02829   }
02830 
02831   llvm_unreachable("Unknown name kind.");
02832 }
02833 
02834 template<typename Derived>
02835 TemplateName
02836 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
02837                                               TemplateName Name,
02838                                               SourceLocation NameLoc,
02839                                               QualType ObjectType,
02840                                               NamedDecl *FirstQualifierInScope) {
02841   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
02842     TemplateDecl *Template = QTN->getTemplateDecl();
02843     assert(Template && "qualified template name must refer to a template");
02844     
02845     TemplateDecl *TransTemplate
02846       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 
02847                                                               Template));
02848     if (!TransTemplate)
02849       return TemplateName();
02850       
02851     if (!getDerived().AlwaysRebuild() &&
02852         SS.getScopeRep() == QTN->getQualifier() &&
02853         TransTemplate == Template)
02854       return Name;
02855       
02856     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
02857                                             TransTemplate);
02858   }
02859   
02860   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
02861     if (SS.getScopeRep()) {
02862       // These apply to the scope specifier, not the template.
02863       ObjectType = QualType();
02864       FirstQualifierInScope = 0;
02865     }      
02866     
02867     if (!getDerived().AlwaysRebuild() &&
02868         SS.getScopeRep() == DTN->getQualifier() &&
02869         ObjectType.isNull())
02870       return Name;
02871     
02872     if (DTN->isIdentifier()) {
02873       return getDerived().RebuildTemplateName(SS,
02874                                               *DTN->getIdentifier(), 
02875                                               NameLoc,
02876                                               ObjectType,
02877                                               FirstQualifierInScope);
02878     }
02879     
02880     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
02881                                             ObjectType);
02882   }
02883   
02884   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
02885     TemplateDecl *TransTemplate
02886       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 
02887                                                               Template));
02888     if (!TransTemplate)
02889       return TemplateName();
02890     
02891     if (!getDerived().AlwaysRebuild() &&
02892         TransTemplate == Template)
02893       return Name;
02894     
02895     return TemplateName(TransTemplate);
02896   }
02897   
02898   if (SubstTemplateTemplateParmPackStorage *SubstPack
02899       = Name.getAsSubstTemplateTemplateParmPack()) {
02900     TemplateTemplateParmDecl *TransParam
02901     = cast_or_null<TemplateTemplateParmDecl>(
02902             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
02903     if (!TransParam)
02904       return TemplateName();
02905     
02906     if (!getDerived().AlwaysRebuild() &&
02907         TransParam == SubstPack->getParameterPack())
02908       return Name;
02909     
02910     return getDerived().RebuildTemplateName(TransParam, 
02911                                             SubstPack->getArgumentPack());
02912   }
02913   
02914   // These should be getting filtered out before they reach the AST.
02915   llvm_unreachable("overloaded function decl survived to here");
02916 }
02917 
02918 template<typename Derived>
02919 void TreeTransform<Derived>::InventTemplateArgumentLoc(
02920                                          const TemplateArgument &Arg,
02921                                          TemplateArgumentLoc &Output) {
02922   SourceLocation Loc = getDerived().getBaseLocation();
02923   switch (Arg.getKind()) {
02924   case TemplateArgument::Null:
02925     llvm_unreachable("null template argument in TreeTransform");
02926     break;
02927 
02928   case TemplateArgument::Type:
02929     Output = TemplateArgumentLoc(Arg,
02930                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
02931                                             
02932     break;
02933 
02934   case TemplateArgument::Template:
02935   case TemplateArgument::TemplateExpansion: {
02936     NestedNameSpecifierLocBuilder Builder;
02937     TemplateName Template = Arg.getAsTemplate();
02938     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
02939       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
02940     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
02941       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
02942         
02943     if (Arg.getKind() == TemplateArgument::Template)
02944       Output = TemplateArgumentLoc(Arg, 
02945                                    Builder.getWithLocInContext(SemaRef.Context),
02946                                    Loc);
02947     else
02948       Output = TemplateArgumentLoc(Arg, 
02949                                    Builder.getWithLocInContext(SemaRef.Context),
02950                                    Loc, Loc);
02951     
02952     break;
02953   }
02954 
02955   case TemplateArgument::Expression:
02956     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
02957     break;
02958 
02959   case TemplateArgument::Declaration:
02960   case TemplateArgument::Integral:
02961   case TemplateArgument::Pack:
02962     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
02963     break;
02964   }
02965 }
02966 
02967 template<typename Derived>
02968 bool TreeTransform<Derived>::TransformTemplateArgument(
02969                                          const TemplateArgumentLoc &Input,
02970                                          TemplateArgumentLoc &Output) {
02971   const TemplateArgument &Arg = Input.getArgument();
02972   switch (Arg.getKind()) {
02973   case TemplateArgument::Null:
02974   case TemplateArgument::Integral:
02975     Output = Input;
02976     return false;
02977 
02978   case TemplateArgument::Type: {
02979     TypeSourceInfo *DI = Input.getTypeSourceInfo();
02980     if (DI == NULL)
02981       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
02982 
02983     DI = getDerived().TransformType(DI);
02984     if (!DI) return true;
02985 
02986     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
02987     return false;
02988   }
02989 
02990   case TemplateArgument::Declaration: {
02991     // FIXME: we should never have to transform one of these.
02992     DeclarationName Name;
02993     if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
02994       Name = ND->getDeclName();
02995     TemporaryBase Rebase(*this, Input.getLocation(), Name);
02996     Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
02997     if (!D) return true;
02998 
02999     Expr *SourceExpr = Input.getSourceDeclExpression();
03000     if (SourceExpr) {
03001       EnterExpressionEvaluationContext Unevaluated(getSema(),
03002                                                    Sema::ConstantEvaluated);
03003       ExprResult E = getDerived().TransformExpr(SourceExpr);
03004       E = SemaRef.ActOnConstantExpression(E);
03005       SourceExpr = (E.isInvalid() ? 0 : E.take());
03006     }
03007 
03008     Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
03009     return false;
03010   }
03011 
03012   case TemplateArgument::Template: {
03013     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
03014     if (QualifierLoc) {
03015       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
03016       if (!QualifierLoc)
03017         return true;
03018     }
03019     
03020     CXXScopeSpec SS;
03021     SS.Adopt(QualifierLoc);
03022     TemplateName Template
03023       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
03024                                            Input.getTemplateNameLoc());
03025     if (Template.isNull())
03026       return true;
03027     
03028     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
03029                                  Input.getTemplateNameLoc());
03030     return false;
03031   }
03032 
03033   case TemplateArgument::TemplateExpansion:
03034     llvm_unreachable("Caller should expand pack expansions");
03035 
03036   case TemplateArgument::Expression: {
03037     // Template argument expressions are constant expressions.
03038     EnterExpressionEvaluationContext Unevaluated(getSema(),
03039                                                  Sema::ConstantEvaluated);
03040 
03041     Expr *InputExpr = Input.getSourceExpression();
03042     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
03043 
03044     ExprResult E = getDerived().TransformExpr(InputExpr);
03045     E = SemaRef.ActOnConstantExpression(E);
03046     if (E.isInvalid()) return true;
03047     Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take());
03048     return false;
03049   }
03050 
03051   case TemplateArgument::Pack: {
03052     SmallVector<TemplateArgument, 4> TransformedArgs;
03053     TransformedArgs.reserve(Arg.pack_size());
03054     for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
03055                                       AEnd = Arg.pack_end();
03056          A != AEnd; ++A) {
03057 
03058       // FIXME: preserve source information here when we start
03059       // caring about parameter packs.
03060 
03061       TemplateArgumentLoc InputArg;
03062       TemplateArgumentLoc OutputArg;
03063       getDerived().InventTemplateArgumentLoc(*A, InputArg);
03064       if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
03065         return true;
03066 
03067       TransformedArgs.push_back(OutputArg.getArgument());
03068     }
03069 
03070     TemplateArgument *TransformedArgsPtr
03071       = new (getSema().Context) TemplateArgument[TransformedArgs.size()];
03072     std::copy(TransformedArgs.begin(), TransformedArgs.end(),
03073               TransformedArgsPtr);
03074     Output = TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr, 
03075                                                   TransformedArgs.size()), 
03076                                  Input.getLocInfo());
03077     return false;
03078   }
03079   }
03080 
03081   // Work around bogus GCC warning
03082   return true;
03083 }
03084 
03085 /// \brief Iterator adaptor that invents template argument location information
03086 /// for each of the template arguments in its underlying iterator.
03087 template<typename Derived, typename InputIterator>
03088 class TemplateArgumentLocInventIterator {
03089   TreeTransform<Derived> &Self;
03090   InputIterator Iter;
03091   
03092 public:
03093   typedef TemplateArgumentLoc value_type;
03094   typedef TemplateArgumentLoc reference;
03095   typedef typename std::iterator_traits<InputIterator>::difference_type
03096     difference_type;
03097   typedef std::input_iterator_tag iterator_category;
03098   
03099   class pointer {
03100     TemplateArgumentLoc Arg;
03101     
03102   public:
03103     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
03104     
03105     const TemplateArgumentLoc *operator->() const { return &Arg; }
03106   };
03107   
03108   TemplateArgumentLocInventIterator() { }
03109   
03110   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
03111                                              InputIterator Iter)
03112     : Self(Self), Iter(Iter) { }
03113   
03114   TemplateArgumentLocInventIterator &operator++() {
03115     ++Iter;
03116     return *this;
03117   }
03118   
03119   TemplateArgumentLocInventIterator operator++(int) {
03120     TemplateArgumentLocInventIterator Old(*this);
03121     ++(*this);
03122     return Old;
03123   }
03124   
03125   reference operator*() const {
03126     TemplateArgumentLoc Result;
03127     Self.InventTemplateArgumentLoc(*Iter, Result);
03128     return Result;
03129   }
03130   
03131   pointer operator->() const { return pointer(**this); }
03132   
03133   friend bool operator==(const TemplateArgumentLocInventIterator &X,
03134                          const TemplateArgumentLocInventIterator &Y) {
03135     return X.Iter == Y.Iter;
03136   }
03137 
03138   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
03139                          const TemplateArgumentLocInventIterator &Y) {
03140     return X.Iter != Y.Iter;
03141   }
03142 };
03143   
03144 template<typename Derived>
03145 template<typename InputIterator>
03146 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
03147                                                         InputIterator Last,
03148                                             TemplateArgumentListInfo &Outputs) {
03149   for (; First != Last; ++First) {
03150     TemplateArgumentLoc Out;
03151     TemplateArgumentLoc In = *First;
03152     
03153     if (In.getArgument().getKind() == TemplateArgument::Pack) {
03154       // Unpack argument packs, which we translate them into separate
03155       // arguments.
03156       // FIXME: We could do much better if we could guarantee that the
03157       // TemplateArgumentLocInfo for the pack expansion would be usable for
03158       // all of the template arguments in the argument pack.
03159       typedef TemplateArgumentLocInventIterator<Derived, 
03160                                                 TemplateArgument::pack_iterator>
03161         PackLocIterator;
03162       if (TransformTemplateArguments(PackLocIterator(*this, 
03163                                                  In.getArgument().pack_begin()),
03164                                      PackLocIterator(*this,
03165                                                    In.getArgument().pack_end()),
03166                                      Outputs))
03167         return true;
03168       
03169       continue;
03170     }
03171     
03172     if (In.getArgument().isPackExpansion()) {
03173       // We have a pack expansion, for which we will be substituting into
03174       // the pattern.
03175       SourceLocation Ellipsis;
03176       llvm::Optional<unsigned> OrigNumExpansions;
03177       TemplateArgumentLoc Pattern
03178         = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions, 
03179                                      getSema().Context);
03180       
03181       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
03182       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
03183       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
03184       
03185       // Determine whether the set of unexpanded parameter packs can and should
03186       // be expanded.
03187       bool Expand = true;
03188       bool RetainExpansion = false;
03189       llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
03190       if (getDerived().TryExpandParameterPacks(Ellipsis,
03191                                                Pattern.getSourceRange(),
03192                                                Unexpanded,
03193                                                Expand, 
03194                                                RetainExpansion,
03195                                                NumExpansions))
03196         return true;
03197       
03198       if (!Expand) {
03199         // The transform has determined that we should perform a simple
03200         // transformation on the pack expansion, producing another pack 
03201         // expansion.
03202         TemplateArgumentLoc OutPattern;
03203         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
03204         if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
03205           return true;
03206                 
03207         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
03208                                                 NumExpansions);
03209         if (Out.getArgument().isNull())
03210           return true;
03211         
03212         Outputs.addArgument(Out);
03213         continue;
03214       }
03215       
03216       // The transform has determined that we should perform an elementwise
03217       // expansion of the pattern. Do so.
03218       for (unsigned I = 0; I != *NumExpansions; ++I) {
03219         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
03220 
03221         if (getDerived().TransformTemplateArgument(Pattern, Out))
03222           return true;
03223         
03224         if (Out.getArgument().containsUnexpandedParameterPack()) {
03225           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
03226                                                   OrigNumExpansions);
03227           if (Out.getArgument().isNull())
03228             return true;
03229         }
03230           
03231         Outputs.addArgument(Out);
03232       }
03233       
03234       // If we're supposed to retain a pack expansion, do so by temporarily
03235       // forgetting the partially-substituted parameter pack.
03236       if (RetainExpansion) {
03237         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
03238         
03239         if (getDerived().TransformTemplateArgument(Pattern, Out))
03240           return true;
03241         
03242         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
03243                                                 OrigNumExpansions);
03244         if (Out.getArgument().isNull())
03245           return true;
03246         
03247         Outputs.addArgument(Out);
03248       }
03249       
03250       continue;
03251     }
03252     
03253     // The simple case: 
03254     if (getDerived().TransformTemplateArgument(In, Out))
03255       return true;
03256     
03257     Outputs.addArgument(Out);
03258   }
03259   
03260   return false;
03261 
03262 }
03263 
03264 //===----------------------------------------------------------------------===//
03265 // Type transformation
03266 //===----------------------------------------------------------------------===//
03267 
03268 template<typename Derived>
03269 QualType TreeTransform<Derived>::TransformType(QualType T) {
03270   if (getDerived().AlreadyTransformed(T))
03271     return T;
03272 
03273   // Temporary workaround.  All of these transformations should
03274   // eventually turn into transformations on TypeLocs.
03275   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
03276                                                 getDerived().getBaseLocation());
03277   
03278   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
03279 
03280   if (!NewDI)
03281     return QualType();
03282 
03283   return NewDI->getType();
03284 }
03285 
03286 template<typename Derived>
03287 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
03288   // Refine the base location to the type's location.
03289   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
03290                        getDerived().getBaseEntity());
03291   if (getDerived().AlreadyTransformed(DI->getType()))
03292     return DI;
03293 
03294   TypeLocBuilder TLB;
03295 
03296   TypeLoc TL = DI->getTypeLoc();
03297   TLB.reserve(TL.getFullDataSize());
03298 
03299   QualType Result = getDerived().TransformType(TLB, TL);
03300   if (Result.isNull())
03301     return 0;
03302 
03303   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
03304 }
03305 
03306 template<typename Derived>
03307 QualType
03308 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
03309   switch (T.getTypeLocClass()) {
03310 #define ABSTRACT_TYPELOC(CLASS, PARENT)
03311 #define TYPELOC(CLASS, PARENT) \
03312   case TypeLoc::CLASS: \
03313     return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
03314 #include "clang/AST/TypeLocNodes.def"
03315   }
03316 
03317   llvm_unreachable("unhandled type loc!");
03318 }
03319 
03320 /// FIXME: By default, this routine adds type qualifiers only to types
03321 /// that can have qualifiers, and silently suppresses those qualifiers
03322 /// that are not permitted (e.g., qualifiers on reference or function
03323 /// types). This is the right thing for template instantiation, but
03324 /// probably not for other clients.
03325 template<typename Derived>
03326 QualType
03327 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
03328                                                QualifiedTypeLoc T) {
03329   Qualifiers Quals = T.getType().getLocalQualifiers();
03330 
03331   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
03332   if (Result.isNull())
03333     return QualType();
03334 
03335   // Silently suppress qualifiers if the result type can't be qualified.
03336   // FIXME: this is the right thing for template instantiation, but
03337   // probably not for other clients.
03338   if (Result->isFunctionType() || Result->isReferenceType())
03339     return Result;
03340 
03341   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
03342   // resulting type.
03343   if (Quals.hasObjCLifetime()) {
03344     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
03345       Quals.removeObjCLifetime();
03346     else if (Result.getObjCLifetime()) {
03347       // Objective-C ARC: 
03348       //   A lifetime qualifier applied to a substituted template parameter
03349       //   overrides the lifetime qualifier from the template argument.
03350       if (const SubstTemplateTypeParmType *SubstTypeParam 
03351                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
03352         QualType Replacement = SubstTypeParam->getReplacementType();
03353         Qualifiers Qs = Replacement.getQualifiers();
03354         Qs.removeObjCLifetime();
03355         Replacement 
03356           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
03357                                              Qs);
03358         Result = SemaRef.Context.getSubstTemplateTypeParmType(
03359                                         SubstTypeParam->getReplacedParameter(), 
03360                                                               Replacement);
03361         TLB.TypeWasModifiedSafely(Result);
03362       } else {
03363         // Otherwise, complain about the addition of a qualifier to an
03364         // already-qualified type.
03365         SourceRange R = TLB.getTemporaryTypeLoc(Result).getSourceRange();
03366         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
03367           << Result << R;
03368         
03369         Quals.removeObjCLifetime();
03370       }
03371     }
03372   }
03373   if (!Quals.empty()) {
03374     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
03375     TLB.push<QualifiedTypeLoc>(Result);
03376     // No location information to preserve.
03377   }
03378 
03379   return Result;
03380 }
03381 
03382 template<typename Derived>
03383 TypeLoc
03384 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
03385                                                    QualType ObjectType,
03386                                                    NamedDecl *UnqualLookup,
03387                                                    CXXScopeSpec &SS) {
03388   QualType T = TL.getType();
03389   if (getDerived().AlreadyTransformed(T))
03390     return TL;
03391   
03392   TypeLocBuilder TLB;
03393   QualType Result;
03394   
03395   if (isa<TemplateSpecializationType>(T)) {
03396     TemplateSpecializationTypeLoc SpecTL
03397       = cast<TemplateSpecializationTypeLoc>(TL);
03398     
03399     TemplateName Template =
03400       getDerived().TransformTemplateName(SS,
03401                                          SpecTL.getTypePtr()->getTemplateName(),
03402                                          SpecTL.getTemplateNameLoc(),
03403                                          ObjectType, UnqualLookup);
03404     if (Template.isNull()) 
03405       return TypeLoc();
03406     
03407     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 
03408                                                               Template);
03409   } else if (isa<DependentTemplateSpecializationType>(T)) {
03410     DependentTemplateSpecializationTypeLoc SpecTL
03411       = cast<DependentTemplateSpecializationTypeLoc>(TL);
03412     
03413     TemplateName Template
03414       = getDerived().RebuildTemplateName(SS, 
03415                                          *SpecTL.getTypePtr()->getIdentifier(), 
03416                                          SpecTL.getTemplateNameLoc(),
03417                                          ObjectType, UnqualLookup);
03418     if (Template.isNull())
03419       return TypeLoc();
03420     
03421     Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 
03422                                                                        SpecTL,
03423                                                                      Template,
03424                                                                        SS);
03425   } else {
03426     // Nothing special needs to be done for these.
03427     Result = getDerived().TransformType(TLB, TL);
03428   }
03429   
03430   if (Result.isNull()) 
03431     return TypeLoc();
03432   
03433   return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc();
03434 }
03435 
03436 template<typename Derived>
03437 TypeSourceInfo *
03438 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
03439                                                    QualType ObjectType,
03440                                                    NamedDecl *UnqualLookup,
03441                                                    CXXScopeSpec &SS) {
03442   // FIXME: Painfully copy-paste from the above!
03443   
03444   QualType T = TSInfo->getType();
03445   if (getDerived().AlreadyTransformed(T))
03446     return TSInfo;
03447   
03448   TypeLocBuilder TLB;
03449   QualType Result;
03450   
03451   TypeLoc TL = TSInfo->getTypeLoc();
03452   if (isa<TemplateSpecializationType>(T)) {
03453     TemplateSpecializationTypeLoc SpecTL
03454       = cast<TemplateSpecializationTypeLoc>(TL);
03455     
03456     TemplateName Template
03457     = getDerived().TransformTemplateName(SS,
03458                                          SpecTL.getTypePtr()->getTemplateName(),
03459                                          SpecTL.getTemplateNameLoc(),
03460                                          ObjectType, UnqualLookup);
03461     if (Template.isNull()) 
03462       return 0;
03463     
03464     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 
03465                                                               Template);
03466   } else if (isa<DependentTemplateSpecializationType>(T)) {
03467     DependentTemplateSpecializationTypeLoc SpecTL
03468       = cast<DependentTemplateSpecializationTypeLoc>(TL);
03469     
03470     TemplateName Template
03471       = getDerived().RebuildTemplateName(SS, 
03472                                          *SpecTL.getTypePtr()->getIdentifier(), 
03473                                          SpecTL.getTemplateNameLoc(),
03474                                          ObjectType, UnqualLookup);
03475     if (Template.isNull())
03476       return 0;
03477     
03478     Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 
03479                                                                        SpecTL,
03480                                                                        Template,
03481                                                                        SS);
03482   } else {
03483     // Nothing special needs to be done for these.
03484     Result = getDerived().TransformType(TLB, TL);
03485   }
03486   
03487   if (Result.isNull()) 
03488     return 0;
03489   
03490   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
03491 }
03492 
03493 template <class TyLoc> static inline
03494 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
03495   TyLoc NewT = TLB.push<TyLoc>(T.getType());
03496   NewT.setNameLoc(T.getNameLoc());
03497   return T.getType();
03498 }
03499 
03500 template<typename Derived>
03501 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
03502                                                       BuiltinTypeLoc T) {
03503   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
03504   NewT.setBuiltinLoc(T.getBuiltinLoc());
03505   if (T.needsExtraLocalData())
03506     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
03507   return T.getType();
03508 }
03509 
03510 template<typename Derived>
03511 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
03512                                                       ComplexTypeLoc T) {
03513   // FIXME: recurse?
03514   return TransformTypeSpecType(TLB, T);
03515 }
03516 
03517 template<typename Derived>
03518 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
03519                                                       PointerTypeLoc TL) {
03520   QualType PointeeType                                      
03521     = getDerived().TransformType(TLB, TL.getPointeeLoc());  
03522   if (PointeeType.isNull())
03523     return QualType();
03524 
03525   QualType Result = TL.getType();
03526   if (PointeeType->getAs<ObjCObjectType>()) {
03527     // A dependent pointer type 'T *' has is being transformed such
03528     // that an Objective-C class type is being replaced for 'T'. The
03529     // resulting pointer type is an ObjCObjectPointerType, not a
03530     // PointerType.
03531     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
03532     
03533     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
03534     NewT.setStarLoc(TL.getStarLoc());
03535     return Result;
03536   }
03537 
03538   if (getDerived().AlwaysRebuild() ||
03539       PointeeType != TL.getPointeeLoc().getType()) {
03540     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
03541     if (Result.isNull())
03542       return QualType();
03543   }
03544                
03545   // Objective-C ARC can add lifetime qualifiers to the type that we're
03546   // pointing to.
03547   TLB.TypeWasModifiedSafely(Result->getPointeeType());
03548   
03549   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
03550   NewT.setSigilLoc(TL.getSigilLoc());
03551   return Result;  
03552 }
03553 
03554 template<typename Derived>
03555 QualType
03556 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
03557                                                   BlockPointerTypeLoc TL) {
03558   QualType PointeeType
03559     = getDerived().TransformType(TLB, TL.getPointeeLoc());  
03560   if (PointeeType.isNull())                                 
03561     return QualType();                                      
03562   
03563   QualType Result = TL.getType();                           
03564   if (getDerived().AlwaysRebuild() ||                       
03565       PointeeType != TL.getPointeeLoc().getType()) {        
03566     Result = getDerived().RebuildBlockPointerType(PointeeType, 
03567                                                   TL.getSigilLoc());
03568     if (Result.isNull())
03569       return QualType();
03570   }
03571 
03572   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
03573   NewT.setSigilLoc(TL.getSigilLoc());
03574   return Result;
03575 }
03576 
03577 /// Transforms a reference type.  Note that somewhat paradoxically we
03578 /// don't care whether the type itself is an l-value type or an r-value
03579 /// type;  we only care if the type was *written* as an l-value type
03580 /// or an r-value type.
03581 template<typename Derived>
03582 QualType
03583 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
03584                                                ReferenceTypeLoc TL) {
03585   const ReferenceType *T = TL.getTypePtr();
03586 
03587   // Note that this works with the pointee-as-written.
03588   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
03589   if (PointeeType.isNull())
03590     return QualType();
03591 
03592   QualType Result = TL.getType();
03593   if (getDerived().AlwaysRebuild() ||
03594       PointeeType != T->getPointeeTypeAsWritten()) {
03595     Result = getDerived().RebuildReferenceType(PointeeType,
03596                                                T->isSpelledAsLValue(),
03597                                                TL.getSigilLoc());
03598     if (Result.isNull())
03599       return QualType();
03600   }
03601 
03602   // Objective-C ARC can add lifetime qualifiers to the type that we're
03603   // referring to.
03604   TLB.TypeWasModifiedSafely(
03605                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
03606 
03607   // r-value references can be rebuilt as l-value references.
03608   ReferenceTypeLoc NewTL;
03609   if (isa<LValueReferenceType>(Result))
03610     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
03611   else
03612     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
03613   NewTL.setSigilLoc(TL.getSigilLoc());
03614 
03615   return Result;
03616 }
03617 
03618 template<typename Derived>
03619 QualType
03620 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
03621                                                  LValueReferenceTypeLoc TL) {
03622   return TransformReferenceType(TLB, TL);
03623 }
03624 
03625 template<typename Derived>
03626 QualType
03627 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
03628                                                  RValueReferenceTypeLoc TL) {
03629   return TransformReferenceType(TLB, TL);
03630 }
03631 
03632 template<typename Derived>
03633 QualType
03634 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
03635                                                    MemberPointerTypeLoc TL) {
03636   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
03637   if (PointeeType.isNull())
03638     return QualType();
03639 
03640   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
03641   TypeSourceInfo* NewClsTInfo = 0;
03642   if (OldClsTInfo) {
03643     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
03644     if (!NewClsTInfo)
03645       return QualType();
03646   }
03647 
03648   const MemberPointerType *T = TL.getTypePtr();
03649   QualType OldClsType = QualType(T->getClass(), 0);
03650   QualType NewClsType;
03651   if (NewClsTInfo)
03652     NewClsType = NewClsTInfo->getType();
03653   else {
03654     NewClsType = getDerived().TransformType(OldClsType);
03655     if (NewClsType.isNull())
03656       return QualType();
03657   }
03658 
03659   QualType Result = TL.getType();
03660   if (getDerived().AlwaysRebuild() ||
03661       PointeeType != T->getPointeeType() ||
03662       NewClsType != OldClsType) {
03663     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
03664                                                    TL.getStarLoc());
03665     if (Result.isNull())
03666       return QualType();
03667   }
03668 
03669   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
03670   NewTL.setSigilLoc(TL.getSigilLoc());
03671   NewTL.setClassTInfo(NewClsTInfo);
03672 
03673   return Result;
03674 }
03675 
03676 template<typename Derived>
03677 QualType
03678 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
03679                                                    ConstantArrayTypeLoc TL) {
03680   const ConstantArrayType *T = TL.getTypePtr();
03681   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
03682   if (ElementType.isNull())
03683     return QualType();
03684 
03685   QualType Result = TL.getType();
03686   if (getDerived().AlwaysRebuild() ||
03687       ElementType != T->getElementType()) {
03688     Result = getDerived().RebuildConstantArrayType(ElementType,
03689                                                    T->getSizeModifier(),
03690                                                    T->getSize(),
03691                                              T->getIndexTypeCVRQualifiers(),
03692                                                    TL.getBracketsRange());
03693     if (Result.isNull())
03694       return QualType();
03695   }
03696 
03697   // We might have either a ConstantArrayType or a VariableArrayType now:
03698   // a ConstantArrayType is allowed to have an element type which is a
03699   // VariableArrayType if the type is dependent.  Fortunately, all array
03700   // types have the same location layout.
03701   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
03702   NewTL.setLBracketLoc(TL.getLBracketLoc());
03703   NewTL.setRBracketLoc(TL.getRBracketLoc());
03704 
03705   Expr *Size = TL.getSizeExpr();
03706   if (Size) {
03707     EnterExpressionEvaluationContext Unevaluated(SemaRef,
03708                                                  Sema::ConstantEvaluated);
03709     Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
03710     Size = SemaRef.ActOnConstantExpression(Size).take();
03711   }
03712   NewTL.setSizeExpr(Size);
03713 
03714   return Result;
03715 }
03716 
03717 template<typename Derived>
03718 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
03719                                               TypeLocBuilder &TLB,
03720                                               IncompleteArrayTypeLoc TL) {
03721   const IncompleteArrayType *T = TL.getTypePtr();
03722   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
03723   if (ElementType.isNull())
03724     return QualType();
03725 
03726   QualType Result = TL.getType();
03727   if (getDerived().AlwaysRebuild() ||
03728       ElementType != T->getElementType()) {
03729     Result = getDerived().RebuildIncompleteArrayType(ElementType,
03730                                                      T->getSizeModifier(),
03731                                            T->getIndexTypeCVRQualifiers(),
03732                                                      TL.getBracketsRange());
03733     if (Result.isNull())
03734       return QualType();
03735   }
03736   
03737   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
03738   NewTL.setLBracketLoc(TL.getLBracketLoc());
03739   NewTL.setRBracketLoc(TL.getRBracketLoc());
03740   NewTL.setSizeExpr(0);
03741 
03742   return Result;
03743 }
03744 
03745 template<typename Derived>
03746 QualType
03747 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
03748                                                    VariableArrayTypeLoc TL) {
03749   const VariableArrayType *T = TL.getTypePtr();
03750   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
03751   if (ElementType.isNull())
03752     return QualType();
03753 
03754   ExprResult SizeResult
03755     = getDerived().TransformExpr(T->getSizeExpr());
03756   if (SizeResult.isInvalid())
03757     return QualType();
03758 
03759   Expr *Size = SizeResult.take();
03760 
03761   QualType Result = TL.getType();
03762   if (getDerived().AlwaysRebuild() ||
03763       ElementType != T->getElementType() ||
03764       Size != T->getSizeExpr()) {
03765     Result = getDerived().RebuildVariableArrayType(ElementType,
03766                                                    T->getSizeModifier(),
03767                                                    Size,
03768                                              T->getIndexTypeCVRQualifiers(),
03769                                                    TL.getBracketsRange());
03770     if (Result.isNull())
03771       return QualType();
03772   }
03773   
03774   VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
03775   NewTL.setLBracketLoc(TL.getLBracketLoc());
03776   NewTL.setRBracketLoc(TL.getRBracketLoc());
03777   NewTL.setSizeExpr(Size);
03778 
03779   return Result;
03780 }
03781 
03782 template<typename Derived>
03783 QualType
03784 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
03785                                              DependentSizedArrayTypeLoc TL) {
03786   const DependentSizedArrayType *T = TL.getTypePtr();
03787   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
03788   if (ElementType.isNull())
03789     return QualType();
03790 
03791   // Array bounds are constant expressions.
03792   EnterExpressionEvaluationContext Unevaluated(SemaRef,
03793                                                Sema::ConstantEvaluated);
03794 
03795   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
03796   Expr *origSize = TL.getSizeExpr();
03797   if (!origSize) origSize = T->getSizeExpr();
03798 
03799   ExprResult sizeResult
03800     = getDerived().TransformExpr(origSize);
03801   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
03802   if (sizeResult.isInvalid())
03803     return QualType();
03804 
03805   Expr *size = sizeResult.get();
03806 
03807   QualType Result = TL.getType();
03808   if (getDerived().AlwaysRebuild() ||
03809       ElementType != T->getElementType() ||
03810       size != origSize) {
03811     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
03812                                                          T->getSizeModifier(),
03813                                                          size,
03814                                                 T->getIndexTypeCVRQualifiers(),
03815                                                         TL.getBracketsRange());
03816     if (Result.isNull())
03817       return QualType();
03818   }
03819 
03820   // We might have any sort of array type now, but fortunately they
03821   // all have the same location layout.
03822   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
03823   NewTL.setLBracketLoc(TL.getLBracketLoc());
03824   NewTL.setRBracketLoc(TL.getRBracketLoc());
03825   NewTL.setSizeExpr(size);
03826 
03827   return Result;
03828 }
03829 
03830 template<typename Derived>
03831 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
03832                                       TypeLocBuilder &TLB,
03833                                       DependentSizedExtVectorTypeLoc TL) {
03834   const DependentSizedExtVectorType *T = TL.getTypePtr();
03835 
03836   // FIXME: ext vector locs should be nested
03837   QualType ElementType = getDerived().TransformType(T->getElementType());
03838   if (ElementType.isNull())
03839     return QualType();
03840 
03841   // Vector sizes are constant expressions.
03842   EnterExpressionEvaluationContext Unevaluated(SemaRef,
03843                                                Sema::ConstantEvaluated);
03844 
03845   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
03846   Size = SemaRef.ActOnConstantExpression(Size);
03847   if (Size.isInvalid())
03848     return QualType();
03849 
03850   QualType Result = TL.getType();
03851   if (getDerived().AlwaysRebuild() ||
03852       ElementType != T->getElementType() ||
03853       Size.get() != T->getSizeExpr()) {
03854     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
03855                                                              Size.take(),
03856                                                          T->getAttributeLoc());
03857     if (Result.isNull())
03858       return QualType();
03859   }
03860 
03861   // Result might be dependent or not.
03862   if (isa<DependentSizedExtVectorType>(Result)) {
03863     DependentSizedExtVectorTypeLoc NewTL
03864       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
03865     NewTL.setNameLoc(TL.getNameLoc());
03866   } else {
03867     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
03868     NewTL.setNameLoc(TL.getNameLoc());
03869   }
03870 
03871   return Result;
03872 }
03873 
03874 template<typename Derived>
03875 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
03876                                                      VectorTypeLoc TL) {
03877   const VectorType *T = TL.getTypePtr();
03878   QualType ElementType = getDerived().TransformType(T->getElementType());
03879   if (ElementType.isNull())
03880     return QualType();
03881 
03882   QualType Result = TL.getType();
03883   if (getDerived().AlwaysRebuild() ||
03884       ElementType != T->getElementType()) {
03885     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
03886                                             T->getVectorKind());
03887     if (Result.isNull())
03888       return QualType();
03889   }
03890   
03891   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
03892   NewTL.setNameLoc(TL.getNameLoc());
03893 
03894   return Result;
03895 }
03896 
03897 template<typename Derived>
03898 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
03899                                                         ExtVectorTypeLoc TL) {
03900   const VectorType *T = TL.getTypePtr();
03901   QualType ElementType = getDerived().TransformType(T->getElementType());
03902   if (ElementType.isNull())
03903     return QualType();
03904 
03905   QualType Result = TL.getType();
03906   if (getDerived().AlwaysRebuild() ||
03907       ElementType != T->getElementType()) {
03908     Result = getDerived().RebuildExtVectorType(ElementType,
03909                                                T->getNumElements(),
03910                                                /*FIXME*/ SourceLocation());
03911     if (Result.isNull())
03912       return QualType();
03913   }
03914   
03915   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
03916   NewTL.setNameLoc(TL.getNameLoc());
03917 
03918   return Result;
03919 }
03920 
03921 template<typename Derived>
03922 ParmVarDecl *
03923 TreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm,
03924                                                    int indexAdjustment,
03925                                          llvm::Optional<unsigned> NumExpansions,
03926                                                    bool ExpectParameterPack) {
03927   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
03928   TypeSourceInfo *NewDI = 0;
03929   
03930   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
03931     // If we're substituting into a pack expansion type and we know the 
03932     // length we want to expand to, just substitute for the pattern.
03933     TypeLoc OldTL = OldDI->getTypeLoc();
03934     PackExpansionTypeLoc OldExpansionTL = cast<PackExpansionTypeLoc>(OldTL);
03935     
03936     TypeLocBuilder TLB;
03937     TypeLoc NewTL = OldDI->getTypeLoc();
03938     TLB.reserve(NewTL.getFullDataSize());
03939     
03940     QualType Result = getDerived().TransformType(TLB, 
03941                                                OldExpansionTL.getPatternLoc());
03942     if (Result.isNull())
03943       return 0;
03944    
03945     Result = RebuildPackExpansionType(Result, 
03946                                 OldExpansionTL.getPatternLoc().getSourceRange(), 
03947                                       OldExpansionTL.getEllipsisLoc(),
03948                                       NumExpansions);
03949     if (Result.isNull())
03950       return 0;
03951     
03952     PackExpansionTypeLoc NewExpansionTL
03953       = TLB.push<PackExpansionTypeLoc>(Result);
03954     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
03955     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
03956   } else
03957     NewDI = getDerived().TransformType(OldDI);
03958   if (!NewDI)
03959     return 0;
03960 
03961   if (NewDI == OldDI && indexAdjustment == 0)
03962     return OldParm;
03963 
03964   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
03965                                              OldParm->getDeclContext(),
03966                                              OldParm->getInnerLocStart(),
03967                                              OldParm->getLocation(),
03968                                              OldParm->getIdentifier(),
03969                                              NewDI->getType(),
03970                                              NewDI,
03971                                              OldParm->getStorageClass(),
03972                                              OldParm->getStorageClassAsWritten(),
03973                                              /* DefArg */ NULL);
03974   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
03975                         OldParm->getFunctionScopeIndex() + indexAdjustment);
03976   return newParm;
03977 }
03978 
03979 template<typename Derived>
03980 bool TreeTransform<Derived>::
03981   TransformFunctionTypeParams(SourceLocation Loc,
03982                               ParmVarDecl **Params, unsigned NumParams,
03983                               const QualType *ParamTypes,
03984                               SmallVectorImpl<QualType> &OutParamTypes,
03985                               SmallVectorImpl<ParmVarDecl*> *PVars) {
03986   int indexAdjustment = 0;
03987 
03988   for (unsigned i = 0; i != NumParams; ++i) {
03989     if (ParmVarDecl *OldParm = Params[i]) {
03990       assert(OldParm->getFunctionScopeIndex() == i);
03991 
03992       llvm::Optional<unsigned> NumExpansions;
03993       ParmVarDecl *NewParm = 0;
03994       if (OldParm->isParameterPack()) {
03995         // We have a function parameter pack that may need to be expanded.
03996         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
03997 
03998         // Find the parameter packs that could be expanded.
03999         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
04000         PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL);
04001         TypeLoc Pattern = ExpansionTL.getPatternLoc();
04002         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
04003         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
04004 
04005         // Determine whether we should expand the parameter packs.
04006         bool ShouldExpand = false;
04007         bool RetainExpansion = false;
04008         llvm::Optional<unsigned> OrigNumExpansions
04009           = ExpansionTL.getTypePtr()->getNumExpansions();
04010         NumExpansions = OrigNumExpansions;
04011         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
04012                                                  Pattern.getSourceRange(),
04013                                                  Unexpanded, 
04014                                                  ShouldExpand, 
04015                                                  RetainExpansion,
04016                                                  NumExpansions)) {
04017           return true;
04018         }
04019         
04020         if (ShouldExpand) {
04021           // Expand the function parameter pack into multiple, separate
04022           // parameters.
04023           getDerived().ExpandingFunctionParameterPack(OldParm);
04024           for (unsigned I = 0; I != *NumExpansions; ++I) {
04025             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
04026             ParmVarDecl *NewParm 
04027               = getDerived().TransformFunctionTypeParam(OldParm,
04028                                                         indexAdjustment++,
04029                                                         OrigNumExpansions,
04030                                                 /*ExpectParameterPack=*/false);
04031             if (!NewParm)
04032               return true;
04033             
04034             OutParamTypes.push_back(NewParm->getType());
04035             if (PVars)
04036               PVars->push_back(NewParm);
04037           }
04038 
04039           // If we're supposed to retain a pack expansion, do so by temporarily
04040           // forgetting the partially-substituted parameter pack.
04041           if (RetainExpansion) {
04042             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
04043             ParmVarDecl *NewParm 
04044               = getDerived().TransformFunctionTypeParam(OldParm,
04045                                                         indexAdjustment++,
04046                                                         OrigNumExpansions,
04047                                                 /*ExpectParameterPack=*/false);
04048             if (!NewParm)
04049               return true;
04050             
04051             OutParamTypes.push_back(NewParm->getType());
04052             if (PVars)
04053               PVars->push_back(NewParm);
04054           }
04055 
04056           // The next parameter should have the same adjustment as the
04057           // last thing we pushed, but we post-incremented indexAdjustment
04058           // on every push.  Also, if we push nothing, the adjustment should
04059           // go down by one.
04060           indexAdjustment--;
04061 
04062           // We're done with the pack expansion.
04063           continue;
04064         }
04065         
04066         // We'll substitute the parameter now without expanding the pack 
04067         // expansion.
04068         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
04069         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
04070                                                           indexAdjustment,
04071                                                           NumExpansions,
04072                                                   /*ExpectParameterPack=*/true);
04073       } else {
04074         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
04075                                                           indexAdjustment,
04076                                                           llvm::Optional<unsigned>(),
04077                                                 /*ExpectParameterPack=*/false);
04078       }
04079 
04080       if (!NewParm)
04081         return true;
04082       
04083       OutParamTypes.push_back(NewParm->getType());
04084       if (PVars)
04085         PVars->push_back(NewParm);
04086       continue;
04087     }
04088 
04089     // Deal with the possibility that we don't have a parameter
04090     // declaration for this parameter.
04091     QualType OldType = ParamTypes[i];
04092     bool IsPackExpansion = false;
04093     llvm::Optional<unsigned> NumExpansions;
04094     QualType NewType;
04095     if (const PackExpansionType *Expansion 
04096                                        = dyn_cast<PackExpansionType>(OldType)) {
04097       // We have a function parameter pack that may need to be expanded.
04098       QualType Pattern = Expansion->getPattern();
04099       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
04100       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
04101       
04102       // Determine whether we should expand the parameter packs.
04103       bool ShouldExpand = false;
04104       bool RetainExpansion = false;
04105       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
04106                                                Unexpanded, 
04107                                                ShouldExpand, 
04108                                                RetainExpansion,
04109                                                NumExpansions)) {
04110         return true;
04111       }
04112       
04113       if (ShouldExpand) {
04114         // Expand the function parameter pack into multiple, separate 
04115         // parameters.
04116         for (unsigned I = 0; I != *NumExpansions; ++I) {
04117           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
04118           QualType NewType = getDerived().TransformType(Pattern);
04119           if (NewType.isNull())
04120             return true;
04121 
04122           OutParamTypes.push_back(NewType);
04123           if (PVars)
04124             PVars->push_back(0);
04125         }
04126         
04127         // We're done with the pack expansion.
04128         continue;
04129       }
04130       
04131       // If we're supposed to retain a pack expansion, do so by temporarily
04132       // forgetting the partially-substituted parameter pack.
04133       if (RetainExpansion) {
04134         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
04135         QualType NewType = getDerived().TransformType(Pattern);
04136         if (NewType.isNull())
04137           return true;
04138         
04139         OutParamTypes.push_back(NewType);
04140         if (PVars)
04141           PVars->push_back(0);
04142       }
04143 
04144       // We'll substitute the parameter now without expanding the pack 
04145       // expansion.
04146       OldType = Expansion->getPattern();
04147       IsPackExpansion = true;
04148       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
04149       NewType = getDerived().TransformType(OldType);
04150     } else {
04151       NewType = getDerived().TransformType(OldType);
04152     }
04153     
04154     if (NewType.isNull())
04155       return true;
04156 
04157     if (IsPackExpansion)
04158       NewType = getSema().Context.getPackExpansionType(NewType,
04159                                                        NumExpansions);
04160       
04161     OutParamTypes.push_back(NewType);
04162     if (PVars)
04163       PVars->push_back(0);
04164   }
04165 
04166 #ifndef NDEBUG
04167   if (PVars) {
04168     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
04169       if (ParmVarDecl *parm = (*PVars)[i])
04170         assert(parm->getFunctionScopeIndex() == i);
04171   }
04172 #endif
04173 
04174   return false;
04175 }
04176 
04177 template<typename Derived>
04178 QualType
04179 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
04180                                                    FunctionProtoTypeLoc TL) {
04181   return getDerived().TransformFunctionProtoType(TLB, TL, 0, 0);
04182 }
04183 
04184 template<typename Derived>
04185 QualType
04186 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
04187                                                    FunctionProtoTypeLoc TL,
04188                                                    CXXRecordDecl *ThisContext,
04189                                                    unsigned ThisTypeQuals) {
04190   // Transform the parameters and return type.
04191   //
04192   // We are required to instantiate the params and return type in source order.
04193   // When the function has a trailing return type, we instantiate the
04194   // parameters before the return type,  since the return type can then refer
04195   // to the parameters themselves (via decltype, sizeof, etc.).
04196   //
04197   SmallVector<QualType, 4> ParamTypes;
04198   SmallVector<ParmVarDecl*, 4> ParamDecls;
04199   const FunctionProtoType *T = TL.getTypePtr();
04200 
04201   QualType ResultType;
04202 
04203   if (TL.getTrailingReturn()) {
04204     if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 
04205                                                  TL.getParmArray(),
04206                                                  TL.getNumArgs(),
04207                                              TL.getTypePtr()->arg_type_begin(),                                                
04208                                                  ParamTypes, &ParamDecls))
04209       return QualType();
04210 
04211     {
04212       // C++11 [expr.prim.general]p3:
04213       //   If a declaration declares a member function or member function 
04214       //   template of a class X, the expression this is a prvalue of type 
04215       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
04216       //   and the end of the function-definition, member-declarator, or 
04217       //   declarator.
04218       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
04219       
04220       ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
04221       if (ResultType.isNull())
04222         return QualType();
04223     }
04224   }
04225   else {
04226     ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
04227     if (ResultType.isNull())
04228       return QualType();
04229 
04230     if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 
04231                                                  TL.getParmArray(),
04232                                                  TL.getNumArgs(),
04233                                              TL.getTypePtr()->arg_type_begin(),                                                
04234                                                  ParamTypes, &ParamDecls))
04235       return QualType();
04236   }
04237 
04238   // FIXME: Need to transform the exception-specification too.
04239 
04240   QualType Result = TL.getType();
04241   if (getDerived().AlwaysRebuild() ||
04242       ResultType != T->getResultType() ||
04243       T->getNumArgs() != ParamTypes.size() ||
04244       !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
04245     Result = getDerived().RebuildFunctionProtoType(ResultType,
04246                                                    ParamTypes.data(),
04247                                                    ParamTypes.size(),
04248                                                    T->isVariadic(),
04249                                                    T->hasTrailingReturn(),
04250                                                    T->getTypeQuals(),
04251                                                    T->getRefQualifier(),
04252                                                    T->getExtInfo());
04253     if (Result.isNull())
04254       return QualType();
04255   }
04256 
04257   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
04258   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
04259   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
04260   NewTL.setTrailingReturn(TL.getTrailingReturn());
04261   for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
04262     NewTL.setArg(i, ParamDecls[i]);
04263 
04264   return Result;
04265 }
04266 
04267 template<typename Derived>
04268 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
04269                                                  TypeLocBuilder &TLB,
04270                                                  FunctionNoProtoTypeLoc TL) {
04271   const FunctionNoProtoType *T = TL.getTypePtr();
04272   QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
04273   if (ResultType.isNull())
04274     return QualType();
04275 
04276   QualType Result = TL.getType();
04277   if (getDerived().AlwaysRebuild() ||
04278       ResultType != T->getResultType())
04279     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
04280 
04281   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
04282   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
04283   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
04284   NewTL.setTrailingReturn(false);
04285 
04286   return Result;
04287 }
04288 
04289 template<typename Derived> QualType
04290 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
04291                                                  UnresolvedUsingTypeLoc TL) {
04292   const UnresolvedUsingType *T = TL.getTypePtr();
04293   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
04294   if (!D)
04295     return QualType();
04296 
04297   QualType Result = TL.getType();
04298   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
04299     Result = getDerived().RebuildUnresolvedUsingType(D);
04300     if (Result.isNull())
04301       return QualType();
04302   }
04303 
04304   // We might get an arbitrary type spec type back.  We should at
04305   // least always get a type spec type, though.
04306   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
04307   NewTL.setNameLoc(TL.getNameLoc());
04308 
04309   return Result;
04310 }
04311 
04312 template<typename Derived>
04313 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
04314                                                       TypedefTypeLoc TL) {
04315   const TypedefType *T = TL.getTypePtr();
04316   TypedefNameDecl *Typedef
04317     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
04318                                                                T->getDecl()));
04319   if (!Typedef)
04320     return QualType();
04321 
04322   QualType Result = TL.getType();
04323   if (getDerived().AlwaysRebuild() ||
04324       Typedef != T->getDecl()) {
04325     Result = getDerived().RebuildTypedefType(Typedef);
04326     if (Result.isNull())
04327       return QualType();
04328   }
04329 
04330   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
04331   NewTL.setNameLoc(TL.getNameLoc());
04332 
04333   return Result;
04334 }
04335 
04336 template<typename Derived>
04337 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
04338                                                       TypeOfExprTypeLoc TL) {
04339   // typeof expressions are not potentially evaluated contexts
04340   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
04341 
04342   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
04343   if (E.isInvalid())
04344     return QualType();
04345 
04346   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
04347   if (E.isInvalid())
04348     return QualType();
04349 
04350   QualType Result = TL.getType();
04351   if (getDerived().AlwaysRebuild() ||
04352       E.get() != TL.getUnderlyingExpr()) {
04353     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
04354     if (Result.isNull())
04355       return QualType();
04356   }
04357   else E.take();
04358 
04359   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
04360   NewTL.setTypeofLoc(TL.getTypeofLoc());
04361   NewTL.setLParenLoc(TL.getLParenLoc());
04362   NewTL.setRParenLoc(TL.getRParenLoc());
04363 
04364   return Result;
04365 }
04366 
04367 template<typename Derived>
04368 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
04369                                                      TypeOfTypeLoc TL) {
04370   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
04371   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
04372   if (!New_Under_TI)
04373     return QualType();
04374 
04375   QualType Result = TL.getType();
04376   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
04377     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
04378     if (Result.isNull())
04379       return QualType();
04380   }
04381 
04382   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
04383   NewTL.setTypeofLoc(TL.getTypeofLoc());
04384   NewTL.setLParenLoc(TL.getLParenLoc());
04385   NewTL.setRParenLoc(TL.getRParenLoc());
04386   NewTL.setUnderlyingTInfo(New_Under_TI);
04387 
04388   return Result;
04389 }
04390 
04391 template<typename Derived>
04392 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
04393                                                        DecltypeTypeLoc TL) {
04394   const DecltypeType *T = TL.getTypePtr();
04395 
04396   // decltype expressions are not potentially evaluated contexts
04397   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 0,
04398                                                /*IsDecltype=*/ true);
04399 
04400   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
04401   if (E.isInvalid())
04402     return QualType();
04403 
04404   E = getSema().ActOnDecltypeExpression(E.take());
04405   if (E.isInvalid())
04406     return QualType();
04407 
04408   QualType Result = TL.getType();
04409   if (getDerived().AlwaysRebuild() ||
04410       E.get() != T->getUnderlyingExpr()) {
04411     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
04412     if (Result.isNull())
04413       return QualType();
04414   }
04415   else E.take();
04416 
04417   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
04418   NewTL.setNameLoc(TL.getNameLoc());
04419 
04420   return Result;
04421 }
04422 
04423 template<typename Derived>
04424 QualType TreeTransform<Derived>::TransformUnaryTransformType(
04425                                                             TypeLocBuilder &TLB,
04426                                                      UnaryTransformTypeLoc TL) {
04427   QualType Result = TL.getType();
04428   if (Result->isDependentType()) {
04429     const UnaryTransformType *T = TL.getTypePtr();
04430     QualType NewBase =
04431       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
04432     Result = getDerived().RebuildUnaryTransformType(NewBase,
04433                                                     T->getUTTKind(),
04434                                                     TL.getKWLoc());
04435     if (Result.isNull())
04436       return QualType();
04437   }
04438 
04439   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
04440   NewTL.setKWLoc(TL.getKWLoc());
04441   NewTL.setParensRange(TL.getParensRange());
04442   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
04443   return Result;
04444 }
04445 
04446 template<typename Derived>
04447 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
04448                                                    AutoTypeLoc TL) {
04449   const AutoType *T = TL.getTypePtr();
04450   QualType OldDeduced = T->getDeducedType();
04451   QualType NewDeduced;
04452   if (!OldDeduced.isNull()) {
04453     NewDeduced = getDerived().TransformType(OldDeduced);
04454     if (NewDeduced.isNull())
04455       return QualType();
04456   }
04457 
04458   QualType Result = TL.getType();
04459   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced) {
04460     Result = getDerived().RebuildAutoType(NewDeduced);
04461     if (Result.isNull())
04462       return QualType();
04463   }
04464 
04465   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
04466   NewTL.setNameLoc(TL.getNameLoc());
04467 
04468   return Result;
04469 }
04470 
04471 template<typename Derived>
04472 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
04473                                                      RecordTypeLoc TL) {
04474   const RecordType *T = TL.getTypePtr();
04475   RecordDecl *Record
04476     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
04477                                                           T->getDecl()));
04478   if (!Record)
04479     return QualType();
04480 
04481   QualType Result = TL.getType();
04482   if (getDerived().AlwaysRebuild() ||
04483       Record != T->getDecl()) {
04484     Result = getDerived().RebuildRecordType(Record);
04485     if (Result.isNull())
04486       return QualType();
04487   }
04488 
04489   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
04490   NewTL.setNameLoc(TL.getNameLoc());
04491 
04492   return Result;
04493 }
04494 
04495 template<typename Derived>
04496 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
04497                                                    EnumTypeLoc TL) {
04498   const EnumType *T = TL.getTypePtr();
04499   EnumDecl *Enum
04500     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
04501                                                         T->getDecl()));
04502   if (!Enum)
04503     return QualType();
04504 
04505   QualType Result = TL.getType();
04506   if (getDerived().AlwaysRebuild() ||
04507       Enum != T->getDecl()) {
04508     Result = getDerived().RebuildEnumType(Enum);
04509     if (Result.isNull())
04510       return QualType();
04511   }
04512 
04513   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
04514   NewTL.setNameLoc(TL.getNameLoc());
04515 
04516   return Result;
04517 }
04518 
04519 template<typename Derived>
04520 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
04521                                          TypeLocBuilder &TLB,
04522                                          InjectedClassNameTypeLoc TL) {
04523   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
04524                                        TL.getTypePtr()->getDecl());
04525   if (!D) return QualType();
04526 
04527   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
04528   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
04529   return T;
04530 }
04531 
04532 template<typename Derived>
04533 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
04534                                                 TypeLocBuilder &TLB,
04535                                                 TemplateTypeParmTypeLoc TL) {
04536   return TransformTypeSpecType(TLB, TL);
04537 }
04538 
04539 template<typename Derived>
04540 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
04541                                          TypeLocBuilder &TLB,
04542                                          SubstTemplateTypeParmTypeLoc TL) {
04543   const SubstTemplateTypeParmType *T = TL.getTypePtr();
04544   
04545   // Substitute into the replacement type, which itself might involve something
04546   // that needs to be transformed. This only tends to occur with default
04547   // template arguments of template template parameters.
04548   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
04549   QualType Replacement = getDerived().TransformType(T->getReplacementType());
04550   if (Replacement.isNull())
04551     return QualType();
04552   
04553   // Always canonicalize the replacement type.
04554   Replacement = SemaRef.Context.getCanonicalType(Replacement);
04555   QualType Result
04556     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 
04557                                                    Replacement);
04558   
04559   // Propagate type-source information.
04560   SubstTemplateTypeParmTypeLoc NewTL
04561     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
04562   NewTL.setNameLoc(TL.getNameLoc());
04563   return Result;
04564 
04565 }
04566 
04567 template<typename Derived>
04568 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
04569                                           TypeLocBuilder &TLB,
04570                                           SubstTemplateTypeParmPackTypeLoc TL) {
04571   return TransformTypeSpecType(TLB, TL);
04572 }
04573 
04574 template<typename Derived>
04575 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
04576                                                         TypeLocBuilder &TLB,
04577                                            TemplateSpecializationTypeLoc TL) {
04578   const TemplateSpecializationType *T = TL.getTypePtr();
04579 
04580   // The nested-name-specifier never matters in a TemplateSpecializationType,
04581   // because we can't have a dependent nested-name-specifier anyway.
04582   CXXScopeSpec SS;
04583   TemplateName Template
04584     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
04585                                          TL.getTemplateNameLoc());
04586   if (Template.isNull())
04587     return QualType();
04588 
04589   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
04590 }
04591 
04592 template<typename Derived>
04593 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
04594                                                      AtomicTypeLoc TL) {
04595   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
04596   if (ValueType.isNull())
04597     return QualType();
04598 
04599   QualType Result = TL.getType();
04600   if (getDerived().AlwaysRebuild() ||
04601       ValueType != TL.getValueLoc().getType()) {
04602     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
04603     if (Result.isNull())
04604       return QualType();
04605   }
04606 
04607   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
04608   NewTL.setKWLoc(TL.getKWLoc());
04609   NewTL.setLParenLoc(TL.getLParenLoc());
04610   NewTL.setRParenLoc(TL.getRParenLoc());
04611 
04612   return Result;
04613 }
04614 
04615 namespace {
04616   /// \brief Simple iterator that traverses the template arguments in a 
04617   /// container that provides a \c getArgLoc() member function.
04618   ///
04619   /// This iterator is intended to be used with the iterator form of
04620   /// \c TreeTransform<Derived>::TransformTemplateArguments().
04621   template<typename ArgLocContainer>
04622   class TemplateArgumentLocContainerIterator {
04623     ArgLocContainer *Container;
04624     unsigned Index;
04625     
04626   public:
04627     typedef TemplateArgumentLoc value_type;
04628     typedef TemplateArgumentLoc reference;
04629     typedef int difference_type;
04630     typedef std::input_iterator_tag iterator_category;
04631     
04632     class pointer {
04633       TemplateArgumentLoc Arg;
04634       
04635     public:
04636       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
04637       
04638       const TemplateArgumentLoc *operator->() const {
04639         return &Arg;
04640       }
04641     };
04642     
04643     
04644     TemplateArgumentLocContainerIterator() {}
04645     
04646     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
04647                                  unsigned Index)
04648       : Container(&Container), Index(Index) { }
04649     
04650     TemplateArgumentLocContainerIterator &operator++() {
04651       ++Index;
04652       return *this;
04653     }
04654     
04655     TemplateArgumentLocContainerIterator operator++(int) {
04656       TemplateArgumentLocContainerIterator Old(*this);
04657       ++(*this);
04658       return Old;
04659     }
04660     
04661     TemplateArgumentLoc operator*() const {
04662       return Container->getArgLoc(Index);
04663     }
04664     
04665     pointer operator->() const {
04666       return pointer(Container->getArgLoc(Index));
04667     }
04668     
04669     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
04670                            const TemplateArgumentLocContainerIterator &Y) {
04671       return X.Container == Y.Container && X.Index == Y.Index;
04672     }
04673     
04674     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
04675                            const TemplateArgumentLocContainerIterator &Y) {
04676       return !(X == Y);
04677     }
04678   };
04679 }
04680   
04681   
04682 template <typename Derived>
04683 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
04684                                                         TypeLocBuilder &TLB,
04685                                            TemplateSpecializationTypeLoc TL,
04686                                                       TemplateName Template) {
04687   TemplateArgumentListInfo NewTemplateArgs;
04688   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
04689   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
04690   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
04691     ArgIterator;
04692   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 
04693                                               ArgIterator(TL, TL.getNumArgs()),
04694                                               NewTemplateArgs))
04695     return QualType();
04696 
04697   // FIXME: maybe don't rebuild if all the template arguments are the same.
04698 
04699   QualType Result =
04700     getDerived().RebuildTemplateSpecializationType(Template,
04701                                                    TL.getTemplateNameLoc(),
04702                                                    NewTemplateArgs);
04703 
04704   if (!Result.isNull()) {
04705     // Specializations of template template parameters are represented as
04706     // TemplateSpecializationTypes, and substitution of type alias templates
04707     // within a dependent context can transform them into
04708     // DependentTemplateSpecializationTypes.
04709     if (isa<DependentTemplateSpecializationType>(Result)) {
04710       DependentTemplateSpecializationTypeLoc NewTL
04711         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
04712       NewTL.setElaboratedKeywordLoc(SourceLocation());
04713       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
04714       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
04715       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
04716       NewTL.setLAngleLoc(TL.getLAngleLoc());
04717       NewTL.setRAngleLoc(TL.getRAngleLoc());
04718       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
04719         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
04720       return Result;
04721     }
04722 
04723     TemplateSpecializationTypeLoc NewTL
04724       = TLB.push<TemplateSpecializationTypeLoc>(Result);
04725     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
04726     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
04727     NewTL.setLAngleLoc(TL.getLAngleLoc());
04728     NewTL.setRAngleLoc(TL.getRAngleLoc());
04729     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
04730       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
04731   }
04732 
04733   return Result;
04734 }
04735 
04736 template <typename Derived>
04737 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
04738                                      TypeLocBuilder &TLB,
04739                                      DependentTemplateSpecializationTypeLoc TL,
04740                                      TemplateName Template,
04741                                      CXXScopeSpec &SS) {
04742   TemplateArgumentListInfo NewTemplateArgs;
04743   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
04744   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
04745   typedef TemplateArgumentLocContainerIterator<
04746             DependentTemplateSpecializationTypeLoc> ArgIterator;
04747   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 
04748                                               ArgIterator(TL, TL.getNumArgs()),
04749                                               NewTemplateArgs))
04750     return QualType();
04751   
04752   // FIXME: maybe don't rebuild if all the template arguments are the same.
04753   
04754   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
04755     QualType Result
04756       = getSema().Context.getDependentTemplateSpecializationType(
04757                                                 TL.getTypePtr()->getKeyword(),
04758                                                          DTN->getQualifier(),
04759                                                          DTN->getIdentifier(),
04760                                                                NewTemplateArgs);
04761    
04762     DependentTemplateSpecializationTypeLoc NewTL
04763       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
04764     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
04765     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
04766     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
04767     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
04768     NewTL.setLAngleLoc(TL.getLAngleLoc());
04769     NewTL.setRAngleLoc(TL.getRAngleLoc());
04770     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
04771       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
04772     return Result;
04773   }
04774       
04775   QualType Result 
04776     = getDerived().RebuildTemplateSpecializationType(Template,
04777                                                      TL.getTemplateNameLoc(),
04778                                                      NewTemplateArgs);
04779   
04780   if (!Result.isNull()) {
04781     /// FIXME: Wrap this in an elaborated-type-specifier?
04782     TemplateSpecializationTypeLoc NewTL
04783       = TLB.push<TemplateSpecializationTypeLoc>(Result);
04784     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
04785     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
04786     NewTL.setLAngleLoc(TL.getLAngleLoc());
04787     NewTL.setRAngleLoc(TL.getRAngleLoc());
04788     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
04789       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
04790   }
04791   
04792   return Result;
04793 }
04794 
04795 template<typename Derived>
04796 QualType
04797 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
04798                                                 ElaboratedTypeLoc TL) {
04799   const ElaboratedType *T = TL.getTypePtr();
04800 
04801   NestedNameSpecifierLoc QualifierLoc;
04802   // NOTE: the qualifier in an ElaboratedType is optional.
04803   if (TL.getQualifierLoc()) {
04804     QualifierLoc 
04805       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
04806     if (!QualifierLoc)
04807       return QualType();
04808   }
04809 
04810   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
04811   if (NamedT.isNull())
04812     return QualType();
04813 
04814   // C++0x [dcl.type.elab]p2:
04815   //   If the identifier resolves to a typedef-name or the simple-template-id
04816   //   resolves to an alias template specialization, the
04817   //   elaborated-type-specifier is ill-formed.
04818   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
04819     if (const TemplateSpecializationType *TST =
04820           NamedT->getAs<TemplateSpecializationType>()) {
04821       TemplateName Template = TST->getTemplateName();
04822       if (TypeAliasTemplateDecl *TAT =
04823           dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) {
04824         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
04825                      diag::err_tag_reference_non_tag) << 4;
04826         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
04827       }
04828     }
04829   }
04830 
04831   QualType Result = TL.getType();
04832   if (getDerived().AlwaysRebuild() ||
04833       QualifierLoc != TL.getQualifierLoc() ||
04834       NamedT != T->getNamedType()) {
04835     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
04836                                                 T->getKeyword(), 
04837                                                 QualifierLoc, NamedT);
04838     if (Result.isNull())
04839       return QualType();
04840   }
04841 
04842   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
04843   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
04844   NewTL.setQualifierLoc(QualifierLoc);
04845   return Result;
04846 }
04847 
04848 template<typename Derived>
04849 QualType TreeTransform<Derived>::TransformAttributedType(
04850                                                 TypeLocBuilder &TLB,
04851                                                 AttributedTypeLoc TL) {
04852   const AttributedType *oldType = TL.getTypePtr();
04853   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
04854   if (modifiedType.isNull())
04855     return QualType();
04856 
04857   QualType result = TL.getType();
04858 
04859   // FIXME: dependent operand expressions?
04860   if (getDerived().AlwaysRebuild() ||
04861       modifiedType != oldType->getModifiedType()) {
04862     // TODO: this is really lame; we should really be rebuilding the
04863     // equivalent type from first principles.
04864     QualType equivalentType
04865       = getDerived().TransformType(oldType->getEquivalentType());
04866     if (equivalentType.isNull())
04867       return QualType();
04868     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
04869                                                modifiedType,
04870                                                equivalentType);
04871   }
04872 
04873   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
04874   newTL.setAttrNameLoc(TL.getAttrNameLoc());
04875   if (TL.hasAttrOperand())
04876     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
04877   if (TL.hasAttrExprOperand())
04878     newTL.setAttrExprOperand(TL.getAttrExprOperand());
04879   else if (TL.hasAttrEnumOperand())
04880     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
04881 
04882   return result;
04883 }
04884 
04885 template<typename Derived>
04886 QualType
04887 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
04888                                            ParenTypeLoc TL) {
04889   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
04890   if (Inner.isNull())
04891     return QualType();
04892 
04893   QualType Result = TL.getType();
04894   if (getDerived().AlwaysRebuild() ||
04895       Inner != TL.getInnerLoc().getType()) {
04896     Result = getDerived().RebuildParenType(Inner);
04897     if (Result.isNull())
04898       return QualType();
04899   }
04900 
04901   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
04902   NewTL.setLParenLoc(TL.getLParenLoc());
04903   NewTL.setRParenLoc(TL.getRParenLoc());
04904   return Result;
04905 }
04906 
04907 template<typename Derived>
04908 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
04909                                                       DependentNameTypeLoc TL) {
04910   const DependentNameType *T = TL.getTypePtr();
04911 
04912   NestedNameSpecifierLoc QualifierLoc
04913     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
04914   if (!QualifierLoc)
04915     return QualType();
04916 
04917   QualType Result
04918     = getDerived().RebuildDependentNameType(T->getKeyword(),
04919                                             TL.getElaboratedKeywordLoc(),
04920                                             QualifierLoc,
04921                                             T->getIdentifier(),
04922                                             TL.getNameLoc());
04923   if (Result.isNull())
04924     return QualType();
04925 
04926   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
04927     QualType NamedT = ElabT->getNamedType();
04928     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
04929 
04930     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
04931     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
04932     NewTL.setQualifierLoc(QualifierLoc);
04933   } else {
04934     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
04935     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
04936     NewTL.setQualifierLoc(QualifierLoc);
04937     NewTL.setNameLoc(TL.getNameLoc());
04938   }
04939   return Result;
04940 }
04941 
04942 template<typename Derived>
04943 QualType TreeTransform<Derived>::
04944           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
04945                                  DependentTemplateSpecializationTypeLoc TL) {
04946   NestedNameSpecifierLoc QualifierLoc;
04947   if (TL.getQualifierLoc()) {
04948     QualifierLoc
04949       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
04950     if (!QualifierLoc)
04951       return QualType();
04952   }
04953             
04954   return getDerived()
04955            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
04956 }
04957 
04958 template<typename Derived>
04959 QualType TreeTransform<Derived>::
04960 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
04961                                    DependentTemplateSpecializationTypeLoc TL,
04962                                        NestedNameSpecifierLoc QualifierLoc) {
04963   const DependentTemplateSpecializationType *T = TL.getTypePtr();
04964   
04965   TemplateArgumentListInfo NewTemplateArgs;
04966   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
04967   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
04968   
04969   typedef TemplateArgumentLocContainerIterator<
04970   DependentTemplateSpecializationTypeLoc> ArgIterator;
04971   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
04972                                               ArgIterator(TL, TL.getNumArgs()),
04973                                               NewTemplateArgs))
04974     return QualType();
04975   
04976   QualType Result
04977     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
04978                                                               QualifierLoc,
04979                                                             T->getIdentifier(),
04980                                                        TL.getTemplateNameLoc(),
04981                                                             NewTemplateArgs);
04982   if (Result.isNull())
04983     return QualType();
04984   
04985   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
04986     QualType NamedT = ElabT->getNamedType();
04987     
04988     // Copy information relevant to the template specialization.
04989     TemplateSpecializationTypeLoc NamedTL
04990       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
04991     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
04992     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
04993     NamedTL.setLAngleLoc(TL.getLAngleLoc());
04994     NamedTL.setRAngleLoc(TL.getRAngleLoc());
04995     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
04996       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
04997     
04998     // Copy information relevant to the elaborated type.
04999     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
05000     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
05001     NewTL.setQualifierLoc(QualifierLoc);
05002   } else if (isa<DependentTemplateSpecializationType>(Result)) {
05003     DependentTemplateSpecializationTypeLoc SpecTL
05004       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
05005     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
05006     SpecTL.setQualifierLoc(QualifierLoc);
05007     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
05008     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
05009     SpecTL.setLAngleLoc(TL.getLAngleLoc());
05010     SpecTL.setRAngleLoc(TL.getRAngleLoc());
05011     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
05012       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
05013   } else {
05014     TemplateSpecializationTypeLoc SpecTL
05015       = TLB.push<TemplateSpecializationTypeLoc>(Result);
05016     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
05017     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
05018     SpecTL.setLAngleLoc(TL.getLAngleLoc());
05019     SpecTL.setRAngleLoc(TL.getRAngleLoc());
05020     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
05021       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
05022   }
05023   return Result;
05024 }
05025 
05026 template<typename Derived>
05027 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
05028                                                       PackExpansionTypeLoc TL) {
05029   QualType Pattern                                      
05030     = getDerived().TransformType(TLB, TL.getPatternLoc());  
05031   if (Pattern.isNull())
05032     return QualType();
05033   
05034   QualType Result = TL.getType();  
05035   if (getDerived().AlwaysRebuild() ||
05036       Pattern != TL.getPatternLoc().getType()) {
05037     Result = getDerived().RebuildPackExpansionType(Pattern, 
05038                                            TL.getPatternLoc().getSourceRange(),
05039                                                    TL.getEllipsisLoc(),
05040                                            TL.getTypePtr()->getNumExpansions());
05041     if (Result.isNull())
05042       return QualType();
05043   }
05044   
05045   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
05046   NewT.setEllipsisLoc(TL.getEllipsisLoc());
05047   return Result;
05048 }
05049 
05050 template<typename Derived>
05051 QualType
05052 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
05053                                                    ObjCInterfaceTypeLoc TL) {
05054   // ObjCInterfaceType is never dependent.
05055   TLB.pushFullCopy(TL);
05056   return TL.getType();
05057 }
05058 
05059 template<typename Derived>
05060 QualType
05061 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
05062                                                 ObjCObjectTypeLoc TL) {
05063   // ObjCObjectType is never dependent.
05064   TLB.pushFullCopy(TL);
05065   return TL.getType();
05066 }
05067 
05068 template<typename Derived>
05069 QualType
05070 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
05071                                                ObjCObjectPointerTypeLoc TL) {
05072   // ObjCObjectPointerType is never dependent.
05073   TLB.pushFullCopy(TL);
05074   return TL.getType();
05075 }
05076 
05077 //===----------------------------------------------------------------------===//
05078 // Statement transformation
05079 //===----------------------------------------------------------------------===//
05080 template<typename Derived>
05081 StmtResult
05082 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
05083   return SemaRef.Owned(S);
05084 }
05085 
05086 template<typename Derived>
05087 StmtResult
05088 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
05089   return getDerived().TransformCompoundStmt(S, false);
05090 }
05091 
05092 template<typename Derived>
05093 StmtResult
05094 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
05095                                               bool IsStmtExpr) {
05096   Sema::CompoundScopeRAII CompoundScope(getSema());
05097 
05098   bool SubStmtInvalid = false;
05099   bool SubStmtChanged = false;
05100   ASTOwningVector<Stmt*> Statements(getSema());
05101   for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
05102        B != BEnd; ++B) {
05103     StmtResult Result = getDerived().TransformStmt(*B);
05104     if (Result.isInvalid()) {
05105       // Immediately fail if this was a DeclStmt, since it's very
05106       // likely that this will cause problems for future statements.
05107       if (isa<DeclStmt>(*B))
05108         return StmtError();
05109 
05110       // Otherwise, just keep processing substatements and fail later.
05111       SubStmtInvalid = true;
05112       continue;
05113     }
05114 
05115     SubStmtChanged = SubStmtChanged || Result.get() != *B;
05116     Statements.push_back(Result.takeAs<Stmt>());
05117   }
05118 
05119   if (SubStmtInvalid)
05120     return StmtError();
05121 
05122   if (!getDerived().AlwaysRebuild() &&
05123       !SubStmtChanged)
05124     return SemaRef.Owned(S);
05125 
05126   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
05127                                           move_arg(Statements),
05128                                           S->getRBracLoc(),
05129                                           IsStmtExpr);
05130 }
05131 
05132 template<typename Derived>
05133 StmtResult
05134 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
05135   ExprResult LHS, RHS;
05136   {
05137     EnterExpressionEvaluationContext Unevaluated(SemaRef,
05138                                                  Sema::ConstantEvaluated);
05139 
05140     // Transform the left-hand case value.
05141     LHS = getDerived().TransformExpr(S->getLHS());
05142     LHS = SemaRef.ActOnConstantExpression(LHS);
05143     if (LHS.isInvalid())
05144       return StmtError();
05145 
05146     // Transform the right-hand case value (for the GNU case-range extension).
05147     RHS = getDerived().TransformExpr(S->getRHS());
05148     RHS = SemaRef.ActOnConstantExpression(RHS);
05149     if (RHS.isInvalid())
05150       return StmtError();
05151   }
05152 
05153   // Build the case statement.
05154   // Case statements are always rebuilt so that they will attached to their
05155   // transformed switch statement.
05156   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
05157                                                        LHS.get(),
05158                                                        S->getEllipsisLoc(),
05159                                                        RHS.get(),
05160                                                        S->getColonLoc());
05161   if (Case.isInvalid())
05162     return StmtError();
05163 
05164   // Transform the statement following the case
05165   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
05166   if (SubStmt.isInvalid())
05167     return StmtError();
05168 
05169   // Attach the body to the case statement
05170   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
05171 }
05172 
05173 template<typename Derived>
05174 StmtResult
05175 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
05176   // Transform the statement following the default case
05177   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
05178   if (SubStmt.isInvalid())
05179     return StmtError();
05180 
05181   // Default statements are always rebuilt
05182   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
05183                                          SubStmt.get());
05184 }
05185 
05186 template<typename Derived>
05187 StmtResult
05188 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
05189   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
05190   if (SubStmt.isInvalid())
05191     return StmtError();
05192 
05193   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
05194                                         S->getDecl());
05195   if (!LD)
05196     return StmtError();
05197 
05198 
05199   // FIXME: Pass the real colon location in.
05200   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
05201                                        cast<LabelDecl>(LD), SourceLocation(),
05202                                        SubStmt.get());
05203 }
05204 
05205 template<typename Derived>
05206 StmtResult
05207 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
05208   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
05209   if (SubStmt.isInvalid())
05210     return StmtError();
05211 
05212   // TODO: transform attributes
05213   if (SubStmt.get() == S->getSubStmt() /* && attrs are the same */)
05214     return S;
05215 
05216   return getDerived().RebuildAttributedStmt(S->getAttrLoc(),
05217                                             S->getAttrs(),
05218                                             SubStmt.get());
05219 }
05220 
05221 template<typename Derived>
05222 StmtResult
05223 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
05224   // Transform the condition
05225   ExprResult Cond;
05226   VarDecl *ConditionVar = 0;
05227   if (S->getConditionVariable()) {
05228     ConditionVar 
05229       = cast_or_null<VarDecl>(
05230                    getDerived().TransformDefinition(
05231                                       S->getConditionVariable()->getLocation(),
05232                                                     S->getConditionVariable()));
05233     if (!ConditionVar)
05234       return StmtError();
05235   } else {
05236     Cond = getDerived().TransformExpr(S->getCond());
05237   
05238     if (Cond.isInvalid())
05239       return StmtError();
05240     
05241     // Convert the condition to a boolean value.
05242     if (S->getCond()) {
05243       ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(), 
05244                                                          Cond.get());
05245       if (CondE.isInvalid())
05246         return StmtError();
05247     
05248       Cond = CondE.get();
05249     }
05250   }
05251   
05252   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
05253   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
05254     return StmtError();
05255   
05256   // Transform the "then" branch.
05257   StmtResult Then = getDerived().TransformStmt(S->getThen());
05258   if (Then.isInvalid())
05259     return StmtError();
05260 
05261   // Transform the "else" branch.
05262   StmtResult Else = getDerived().TransformStmt(S->getElse());
05263   if (Else.isInvalid())
05264     return StmtError();
05265 
05266   if (!getDerived().AlwaysRebuild() &&
05267       FullCond.get() == S->getCond() &&
05268       ConditionVar == S->getConditionVariable() &&
05269       Then.get() == S->getThen() &&
05270       Else.get() == S->getElse())
05271     return SemaRef.Owned(S);
05272 
05273   return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
05274                                     Then.get(),
05275                                     S->getElseLoc(), Else.get());
05276 }
05277 
05278 template<typename Derived>
05279 StmtResult
05280 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
05281   // Transform the condition.
05282   ExprResult Cond;
05283   VarDecl *ConditionVar = 0;
05284   if (S->getConditionVariable()) {
05285     ConditionVar 
05286       = cast_or_null<VarDecl>(
05287                    getDerived().TransformDefinition(
05288                                       S->getConditionVariable()->getLocation(),
05289                                                     S->getConditionVariable()));
05290     if (!ConditionVar)
05291       return StmtError();
05292   } else {
05293     Cond = getDerived().TransformExpr(S->getCond());
05294     
05295     if (Cond.isInvalid())
05296       return StmtError();
05297   }
05298 
05299   // Rebuild the switch statement.
05300   StmtResult Switch
05301     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
05302                                           ConditionVar);
05303   if (Switch.isInvalid())
05304     return StmtError();
05305 
05306   // Transform the body of the switch statement.
05307   StmtResult Body = getDerived().TransformStmt(S->getBody());
05308   if (Body.isInvalid())
05309     return StmtError();
05310 
05311   // Complete the switch statement.
05312   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
05313                                             Body.get());
05314 }
05315 
05316 template<typename Derived>
05317 StmtResult
05318 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
05319   // Transform the condition
05320   ExprResult Cond;
05321   VarDecl *ConditionVar = 0;
05322   if (S->getConditionVariable()) {
05323     ConditionVar 
05324       = cast_or_null<VarDecl>(
05325                    getDerived().TransformDefinition(
05326                                       S->getConditionVariable()->getLocation(),
05327                                                     S->getConditionVariable()));
05328     if (!ConditionVar)
05329       return StmtError();
05330   } else {
05331     Cond = getDerived().TransformExpr(S->getCond());
05332     
05333     if (Cond.isInvalid())
05334       return StmtError();
05335 
05336     if (S->getCond()) {
05337       // Convert the condition to a boolean value.
05338       ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(), 
05339                                                          Cond.get());
05340       if (CondE.isInvalid())
05341         return StmtError();
05342       Cond = CondE;
05343     }
05344   }
05345 
05346   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
05347   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
05348     return StmtError();
05349 
05350   // Transform the body
05351   StmtResult Body = getDerived().TransformStmt(S->getBody());
05352   if (Body.isInvalid())
05353     return StmtError();
05354 
05355   if (!getDerived().AlwaysRebuild() &&
05356       FullCond.get() == S->getCond() &&
05357       ConditionVar == S->getConditionVariable() &&
05358       Body.get() == S->getBody())
05359     return Owned(S);
05360 
05361   return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
05362                                        ConditionVar, Body.get());
05363 }
05364 
05365 template<typename Derived>
05366 StmtResult
05367 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
05368   // Transform the body
05369   StmtResult Body = getDerived().TransformStmt(S->getBody());
05370   if (Body.isInvalid())
05371     return StmtError();
05372 
05373   // Transform the condition
05374   ExprResult Cond = getDerived().TransformExpr(S->getCond());
05375   if (Cond.isInvalid())
05376     return StmtError();
05377   
05378   if (!getDerived().AlwaysRebuild() &&
05379       Cond.get() == S->getCond() &&
05380       Body.get() == S->getBody())
05381     return SemaRef.Owned(S);
05382 
05383   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
05384                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
05385                                     S->getRParenLoc());
05386 }
05387 
05388 template<typename Derived>
05389 StmtResult
05390 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
05391   // Transform the initialization statement
05392   StmtResult Init = getDerived().TransformStmt(S->getInit());
05393   if (Init.isInvalid())
05394     return StmtError();
05395 
05396   // Transform the condition
05397   ExprResult Cond;
05398   VarDecl *ConditionVar = 0;
05399   if (S->getConditionVariable()) {
05400     ConditionVar 
05401       = cast_or_null<VarDecl>(
05402                    getDerived().TransformDefinition(
05403                                       S->getConditionVariable()->getLocation(),
05404                                                     S->getConditionVariable()));
05405     if (!ConditionVar)
05406       return StmtError();
05407   } else {
05408     Cond = getDerived().TransformExpr(S->getCond());
05409     
05410     if (Cond.isInvalid())
05411       return StmtError();
05412 
05413     if (S->getCond()) {
05414       // Convert the condition to a boolean value.
05415       ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(), 
05416                                                          Cond.get());
05417       if (CondE.isInvalid())
05418         return StmtError();
05419 
05420       Cond = CondE.get();
05421     }
05422   }
05423 
05424   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));  
05425   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
05426     return StmtError();
05427 
05428   // Transform the increment
05429   ExprResult Inc = getDerived().TransformExpr(S->getInc());
05430   if (Inc.isInvalid())
05431     return StmtError();
05432 
05433   Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get()));
05434   if (S->getInc() && !FullInc.get())
05435     return StmtError();
05436 
05437   // Transform the body
05438   StmtResult Body = getDerived().TransformStmt(S->getBody());
05439   if (Body.isInvalid())
05440     return StmtError();
05441 
05442   if (!getDerived().AlwaysRebuild() &&
05443       Init.get() == S->getInit() &&
05444       FullCond.get() == S->getCond() &&
05445       Inc.get() == S->getInc() &&
05446       Body.get() == S->getBody())
05447     return SemaRef.Owned(S);
05448 
05449   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
05450                                      Init.get(), FullCond, ConditionVar,
05451                                      FullInc, S->getRParenLoc(), Body.get());
05452 }
05453 
05454 template<typename Derived>
05455 StmtResult
05456 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
05457   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
05458                                         S->getLabel());
05459   if (!LD)
05460     return StmtError();
05461   
05462   // Goto statements must always be rebuilt, to resolve the label.
05463   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
05464                                       cast<LabelDecl>(LD));
05465 }
05466 
05467 template<typename Derived>
05468 StmtResult
05469 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
05470   ExprResult Target = getDerived().TransformExpr(S->getTarget());
05471   if (Target.isInvalid())
05472     return StmtError();
05473   Target = SemaRef.MaybeCreateExprWithCleanups(Target.take());
05474 
05475   if (!getDerived().AlwaysRebuild() &&
05476       Target.get() == S->getTarget())
05477     return SemaRef.Owned(S);
05478 
05479   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
05480                                               Target.get());
05481 }
05482 
05483 template<typename Derived>
05484 StmtResult
05485 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
05486   return SemaRef.Owned(S);
05487 }
05488 
05489 template<typename Derived>
05490 StmtResult
05491 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
05492   return SemaRef.Owned(S);
05493 }
05494 
05495 template<typename Derived>
05496 StmtResult
05497 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
05498   ExprResult Result = getDerived().TransformExpr(S->getRetValue());
05499   if (Result.isInvalid())
05500     return StmtError();
05501 
05502   // FIXME: We always rebuild the return statement because there is no way
05503   // to tell whether the return type of the function has changed.
05504   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
05505 }
05506 
05507 template<typename Derived>
05508 StmtResult
05509 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
05510   bool DeclChanged = false;
05511   SmallVector<Decl *, 4> Decls;
05512   for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
05513        D != DEnd; ++D) {
05514     Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
05515                                                          *D);
05516     if (!Transformed)
05517       return StmtError();
05518 
05519     if (Transformed != *D)
05520       DeclChanged = true;
05521 
05522     Decls.push_back(Transformed);
05523   }
05524 
05525   if (!getDerived().AlwaysRebuild() && !DeclChanged)
05526     return SemaRef.Owned(S);
05527 
05528   return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
05529                                       S->getStartLoc(), S->getEndLoc());
05530 }
05531 
05532 template<typename Derived>
05533 StmtResult
05534 TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
05535   
05536   ASTOwningVector<Expr*> Constraints(getSema());
05537   ASTOwningVector<Expr*> Exprs(getSema());
05538   SmallVector<IdentifierInfo *, 4> Names;
05539 
05540   ExprResult AsmString;
05541   ASTOwningVector<Expr*> Clobbers(getSema());
05542 
05543   bool ExprsChanged = false;
05544   
05545   // Go through the outputs.
05546   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
05547     Names.push_back(S->getOutputIdentifier(I));
05548     
05549     // No need to transform the constraint literal.
05550     Constraints.push_back(S->getOutputConstraintLiteral(I));
05551     
05552     // Transform the output expr.
05553     Expr *OutputExpr = S->getOutputExpr(I);
05554     ExprResult Result = getDerived().TransformExpr(OutputExpr);
05555     if (Result.isInvalid())
05556       return StmtError();
05557     
05558     ExprsChanged |= Result.get() != OutputExpr;
05559     
05560     Exprs.push_back(Result.get());
05561   }
05562   
05563   // Go through the inputs.
05564   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
05565     Names.push_back(S->getInputIdentifier(I));
05566     
05567     // No need to transform the constraint literal.
05568     Constraints.push_back(S->getInputConstraintLiteral(I));
05569     
05570     // Transform the input expr.
05571     Expr *InputExpr = S->getInputExpr(I);
05572     ExprResult Result = getDerived().TransformExpr(InputExpr);
05573     if (Result.isInvalid())
05574       return StmtError();
05575     
05576     ExprsChanged |= Result.get() != InputExpr;
05577     
05578     Exprs.push_back(Result.get());
05579   }
05580   
05581   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
05582     return SemaRef.Owned(S);
05583 
05584   // Go through the clobbers.
05585   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
05586     Clobbers.push_back(S->getClobber(I));
05587 
05588   // No need to transform the asm string literal.
05589   AsmString = SemaRef.Owned(S->getAsmString());
05590 
05591   return getDerived().RebuildAsmStmt(S->getAsmLoc(),
05592                                      S->isSimple(),
05593                                      S->isVolatile(),
05594                                      S->getNumOutputs(),
05595                                      S->getNumInputs(),
05596                                      Names.data(),
05597                                      move_arg(Constraints),
05598                                      move_arg(Exprs),
05599                                      AsmString.get(),
05600                                      move_arg(Clobbers),
05601                                      S->getRParenLoc(),
05602                                      S->isMSAsm());
05603 }
05604 
05605 
05606 template<typename Derived>
05607 StmtResult
05608 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
05609   // Transform the body of the @try.
05610   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
05611   if (TryBody.isInvalid())
05612     return StmtError();
05613   
05614   // Transform the @catch statements (if present).
05615   bool AnyCatchChanged = false;
05616   ASTOwningVector<Stmt*> CatchStmts(SemaRef);
05617   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
05618     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
05619     if (Catch.isInvalid())
05620       return StmtError();
05621     if (Catch.get() != S->getCatchStmt(I))
05622       AnyCatchChanged = true;
05623     CatchStmts.push_back(Catch.release());
05624   }
05625   
05626   // Transform the @finally statement (if present).
05627   StmtResult Finally;
05628   if (S->getFinallyStmt()) {
05629     Finally = getDerived().TransformStmt(S->getFinallyStmt());
05630     if (Finally.isInvalid())
05631       return StmtError();
05632   }
05633 
05634   // If nothing changed, just retain this statement.
05635   if (!getDerived().AlwaysRebuild() &&
05636       TryBody.get() == S->getTryBody() &&
05637       !AnyCatchChanged &&
05638       Finally.get() == S->getFinallyStmt())
05639     return SemaRef.Owned(S);
05640   
05641   // Build a new statement.
05642   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
05643                                            move_arg(CatchStmts), Finally.get());
05644 }
05645 
05646 template<typename Derived>
05647 StmtResult
05648 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
05649   // Transform the @catch parameter, if there is one.
05650   VarDecl *Var = 0;
05651   if (VarDecl *FromVar = S->getCatchParamDecl()) {
05652     TypeSourceInfo *TSInfo = 0;
05653     if (FromVar->getTypeSourceInfo()) {
05654       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
05655       if (!TSInfo)
05656         return StmtError();
05657     }
05658     
05659     QualType T;
05660     if (TSInfo)
05661       T = TSInfo->getType();
05662     else {
05663       T = getDerived().TransformType(FromVar->getType());
05664       if (T.isNull())
05665         return StmtError();        
05666     }
05667     
05668     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
05669     if (!Var)
05670       return StmtError();
05671   }
05672   
05673   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
05674   if (Body.isInvalid())
05675     return StmtError();
05676   
05677   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 
05678                                              S->getRParenLoc(),
05679                                              Var, Body.get());
05680 }
05681 
05682 template<typename Derived>
05683 StmtResult
05684 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
05685   // Transform the body.
05686   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
05687   if (Body.isInvalid())
05688     return StmtError();
05689   
05690   // If nothing changed, just retain this statement.
05691   if (!getDerived().AlwaysRebuild() &&
05692       Body.get() == S->getFinallyBody())
05693     return SemaRef.Owned(S);
05694 
05695   // Build a new statement.
05696   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
05697                                                Body.get());
05698 }
05699 
05700 template<typename Derived>
05701 StmtResult
05702 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
05703   ExprResult Operand;
05704   if (S->getThrowExpr()) {
05705     Operand = getDerived().TransformExpr(S->getThrowExpr());
05706     if (Operand.isInvalid())
05707       return StmtError();
05708   }
05709   
05710   if (!getDerived().AlwaysRebuild() &&
05711       Operand.get() == S->getThrowExpr())
05712     return getSema().Owned(S);
05713     
05714   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
05715 }
05716 
05717 template<typename Derived>
05718 StmtResult
05719 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
05720                                                   ObjCAtSynchronizedStmt *S) {
05721   // Transform the object we are locking.
05722   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
05723   if (Object.isInvalid())
05724     return StmtError();
05725   Object =
05726     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
05727                                                   Object.get());
05728   if (Object.isInvalid())
05729     return StmtError();
05730   
05731   // Transform the body.
05732   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
05733   if (Body.isInvalid())
05734     return StmtError();
05735   
05736   // If nothing change, just retain the current statement.
05737   if (!getDerived().AlwaysRebuild() &&
05738       Object.get() == S->getSynchExpr() &&
05739       Body.get() == S->getSynchBody())
05740     return SemaRef.Owned(S);
05741 
05742   // Build a new statement.
05743   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
05744                                                     Object.get(), Body.get());
05745 }
05746 
05747 template<typename Derived>
05748 StmtResult
05749 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
05750                                               ObjCAutoreleasePoolStmt *S) {
05751   // Transform the body.
05752   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
05753   if (Body.isInvalid())
05754     return StmtError();
05755   
05756   // If nothing changed, just retain this statement.
05757   if (!getDerived().AlwaysRebuild() &&
05758       Body.get() == S->getSubStmt())
05759     return SemaRef.Owned(S);
05760 
05761   // Build a new statement.
05762   return getDerived().RebuildObjCAutoreleasePoolStmt(
05763                         S->getAtLoc(), Body.get());
05764 }
05765 
05766 template<typename Derived>
05767 StmtResult
05768 TreeTransform<Derived>::TransformObjCForCollectionStmt(
05769                                                   ObjCForCollectionStmt *S) {
05770   // Transform the element statement.
05771   StmtResult Element = getDerived().TransformStmt(S->getElement());
05772   if (Element.isInvalid())
05773     return StmtError();
05774   
05775   // Transform the collection expression.
05776   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
05777   if (Collection.isInvalid())
05778     return StmtError();
05779   Collection = getDerived().RebuildObjCForCollectionOperand(S->getForLoc(),
05780                                                             Collection.take());
05781   if (Collection.isInvalid())
05782     return StmtError();
05783   
05784   // Transform the body.
05785   StmtResult Body = getDerived().TransformStmt(S->getBody());
05786   if (Body.isInvalid())
05787     return StmtError();
05788   
05789   // If nothing changed, just retain this statement.
05790   if (!getDerived().AlwaysRebuild() &&
05791       Element.get() == S->getElement() &&
05792       Collection.get() == S->getCollection() &&
05793       Body.get() == S->getBody())
05794     return SemaRef.Owned(S);
05795   
05796   // Build a new statement.
05797   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
05798                                                    /*FIXME:*/S->getForLoc(),
05799                                                    Element.get(),
05800                                                    Collection.get(),
05801                                                    S->getRParenLoc(),
05802                                                    Body.get());
05803 }
05804 
05805 
05806 template<typename Derived>
05807 StmtResult
05808 TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
05809   // Transform the exception declaration, if any.
05810   VarDecl *Var = 0;
05811   if (S->getExceptionDecl()) {
05812     VarDecl *ExceptionDecl = S->getExceptionDecl();
05813     TypeSourceInfo *T = getDerived().TransformType(
05814                                             ExceptionDecl->getTypeSourceInfo());
05815     if (!T)
05816       return StmtError();
05817 
05818     Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T,
05819                                             ExceptionDecl->getInnerLocStart(),
05820                                             ExceptionDecl->getLocation(),
05821                                             ExceptionDecl->getIdentifier());
05822     if (!Var || Var->isInvalidDecl())
05823       return StmtError();
05824   }
05825 
05826   // Transform the actual exception handler.
05827   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
05828   if (Handler.isInvalid())
05829     return StmtError();
05830 
05831   if (!getDerived().AlwaysRebuild() &&
05832       !Var &&
05833       Handler.get() == S->getHandlerBlock())
05834     return SemaRef.Owned(S);
05835 
05836   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
05837                                           Var,
05838                                           Handler.get());
05839 }
05840 
05841 template<typename Derived>
05842 StmtResult
05843 TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
05844   // Transform the try block itself.
05845   StmtResult TryBlock
05846     = getDerived().TransformCompoundStmt(S->getTryBlock());
05847   if (TryBlock.isInvalid())
05848     return StmtError();
05849 
05850   // Transform the handlers.
05851   bool HandlerChanged = false;
05852   ASTOwningVector<Stmt*> Handlers(SemaRef);
05853   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
05854     StmtResult Handler
05855       = getDerived().TransformCXXCatchStmt(S->getHandler(I));
05856     if (Handler.isInvalid())
05857       return StmtError();
05858 
05859     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
05860     Handlers.push_back(Handler.takeAs<Stmt>());
05861   }
05862 
05863   if (!getDerived().AlwaysRebuild() &&
05864       TryBlock.get() == S->getTryBlock() &&
05865       !HandlerChanged)
05866     return SemaRef.Owned(S);
05867 
05868   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
05869                                         move_arg(Handlers));
05870 }
05871 
05872 template<typename Derived>
05873 StmtResult
05874 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
05875   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
05876   if (Range.isInvalid())
05877     return StmtError();
05878 
05879   StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt());
05880   if (BeginEnd.isInvalid())
05881     return StmtError();
05882 
05883   ExprResult Cond = getDerived().TransformExpr(S->getCond());
05884   if (Cond.isInvalid())
05885     return StmtError();
05886   if (Cond.get())
05887     Cond = SemaRef.CheckBooleanCondition(Cond.take(), S->getColonLoc());
05888   if (Cond.isInvalid())
05889     return StmtError();
05890   if (Cond.get())
05891     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.take());
05892 
05893   ExprResult Inc = getDerived().TransformExpr(S->getInc());
05894   if (Inc.isInvalid())
05895     return StmtError();
05896   if (Inc.get())
05897     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.take());
05898 
05899   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
05900   if (LoopVar.isInvalid())
05901     return StmtError();
05902 
05903   StmtResult NewStmt = S;
05904   if (getDerived().AlwaysRebuild() ||
05905       Range.get() != S->getRangeStmt() ||
05906       BeginEnd.get() != S->getBeginEndStmt() ||
05907       Cond.get() != S->getCond() ||
05908       Inc.get() != S->getInc() ||
05909       LoopVar.get() != S->getLoopVarStmt())
05910     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
05911                                                   S->getColonLoc(), Range.get(),
05912                                                   BeginEnd.get(), Cond.get(),
05913                                                   Inc.get(), LoopVar.get(),
05914                                                   S->getRParenLoc());
05915 
05916   StmtResult Body = getDerived().TransformStmt(S->getBody());
05917   if (Body.isInvalid())
05918     return StmtError();
05919 
05920   // Body has changed but we didn't rebuild the for-range statement. Rebuild
05921   // it now so we have a new statement to attach the body to.
05922   if (Body.get() != S->getBody() && NewStmt.get() == S)
05923     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
05924                                                   S->getColonLoc(), Range.get(),
05925                                                   BeginEnd.get(), Cond.get(),
05926                                                   Inc.get(), LoopVar.get(),
05927                                                   S->getRParenLoc());
05928 
05929   if (NewStmt.get() == S)
05930     return SemaRef.Owned(S);
05931 
05932   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
05933 }
05934 
05935 template<typename Derived>
05936 StmtResult
05937 TreeTransform<Derived>::TransformMSDependentExistsStmt(
05938                                                     MSDependentExistsStmt *S) {
05939   // Transform the nested-name-specifier, if any.
05940   NestedNameSpecifierLoc QualifierLoc;
05941   if (S->getQualifierLoc()) {
05942     QualifierLoc 
05943       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
05944     if (!QualifierLoc)
05945       return StmtError();
05946   }
05947 
05948   // Transform the declaration name.
05949   DeclarationNameInfo NameInfo = S->getNameInfo();
05950   if (NameInfo.getName()) {
05951     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
05952     if (!NameInfo.getName())
05953       return StmtError();
05954   }
05955 
05956   // Check whether anything changed.
05957   if (!getDerived().AlwaysRebuild() &&
05958       QualifierLoc == S->getQualifierLoc() &&
05959       NameInfo.getName() == S->getNameInfo().getName())
05960     return S;
05961   
05962   // Determine whether this name exists, if we can.
05963   CXXScopeSpec SS;
05964   SS.Adopt(QualifierLoc);
05965   bool Dependent = false;
05966   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/0, SS, NameInfo)) {
05967   case Sema::IER_Exists:
05968     if (S->isIfExists())
05969       break;
05970       
05971     return new (getSema().Context) NullStmt(S->getKeywordLoc());
05972 
05973   case Sema::IER_DoesNotExist:
05974     if (S->isIfNotExists())
05975       break;
05976     
05977     return new (getSema().Context) NullStmt(S->getKeywordLoc());
05978       
05979   case Sema::IER_Dependent:
05980     Dependent = true;
05981     break;
05982       
05983   case Sema::IER_Error:
05984     return StmtError();
05985   }
05986   
05987   // We need to continue with the instantiation, so do so now.
05988   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
05989   if (SubStmt.isInvalid())
05990     return StmtError();
05991   
05992   // If we have resolved the name, just transform to the substatement.
05993   if (!Dependent)
05994     return SubStmt;
05995   
05996   // The name is still dependent, so build a dependent expression again.
05997   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
05998                                                    S->isIfExists(),
05999                                                    QualifierLoc,
06000                                                    NameInfo,
06001                                                    SubStmt.get());
06002 }
06003 
06004 template<typename Derived>
06005 StmtResult
06006 TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
06007   StmtResult TryBlock; //  = getDerived().TransformCompoundStmt(S->getTryBlock());
06008   if(TryBlock.isInvalid()) return StmtError();
06009 
06010   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
06011   if(!getDerived().AlwaysRebuild() &&
06012      TryBlock.get() == S->getTryBlock() &&
06013      Handler.get() == S->getHandler())
06014     return SemaRef.Owned(S);
06015 
06016   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(),
06017                                         S->getTryLoc(),
06018                                         TryBlock.take(),
06019                                         Handler.take());
06020 }
06021 
06022 template<typename Derived>
06023 StmtResult
06024 TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
06025   StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());
06026   if(Block.isInvalid()) return StmtError();
06027 
06028   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(),
06029                                             Block.take());
06030 }
06031 
06032 template<typename Derived>
06033 StmtResult
06034 TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
06035   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
06036   if(FilterExpr.isInvalid()) return StmtError();
06037 
06038   StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());
06039   if(Block.isInvalid()) return StmtError();
06040 
06041   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(),
06042                                            FilterExpr.take(),
06043                                            Block.take());
06044 }
06045 
06046 template<typename Derived>
06047 StmtResult
06048 TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
06049   if(isa<SEHFinallyStmt>(Handler))
06050     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
06051   else
06052     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
06053 }
06054 
06055 //===----------------------------------------------------------------------===//
06056 // Expression transformation
06057 //===----------------------------------------------------------------------===//
06058 template<typename Derived>
06059 ExprResult
06060 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
06061   return SemaRef.Owned(E);
06062 }
06063 
06064 template<typename Derived>
06065 ExprResult
06066 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
06067   NestedNameSpecifierLoc QualifierLoc;
06068   if (E->getQualifierLoc()) {
06069     QualifierLoc
06070       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
06071     if (!QualifierLoc)
06072       return ExprError();
06073   }
06074 
06075   ValueDecl *ND
06076     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
06077                                                          E->getDecl()));
06078   if (!ND)
06079     return ExprError();
06080 
06081   DeclarationNameInfo NameInfo = E->getNameInfo();
06082   if (NameInfo.getName()) {
06083     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
06084     if (!NameInfo.getName())
06085       return ExprError();
06086   }
06087 
06088   if (!getDerived().AlwaysRebuild() &&
06089       QualifierLoc == E->getQualifierLoc() &&
06090       ND == E->getDecl() &&
06091       NameInfo.getName() == E->getDecl()->getDeclName() &&
06092       !E->hasExplicitTemplateArgs()) {
06093 
06094     // Mark it referenced in the new context regardless.
06095     // FIXME: this is a bit instantiation-specific.
06096     SemaRef.MarkDeclRefReferenced(E);
06097 
06098     return SemaRef.Owned(E);
06099   }
06100 
06101   TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
06102   if (E->hasExplicitTemplateArgs()) {
06103     TemplateArgs = &TransArgs;
06104     TransArgs.setLAngleLoc(E->getLAngleLoc());
06105     TransArgs.setRAngleLoc(E->getRAngleLoc());
06106     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
06107                                                 E->getNumTemplateArgs(),
06108                                                 TransArgs))
06109       return ExprError();
06110   }
06111 
06112   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 
06113                                          TemplateArgs);
06114 }
06115 
06116 template<typename Derived>
06117 ExprResult
06118 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
06119   return SemaRef.Owned(E);
06120 }
06121 
06122 template<typename Derived>
06123 ExprResult
06124 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
06125   return SemaRef.Owned(E);
06126 }
06127 
06128 template<typename Derived>
06129 ExprResult
06130 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
06131   return SemaRef.Owned(E);
06132 }
06133 
06134 template<typename Derived>
06135 ExprResult
06136 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
06137   return SemaRef.Owned(E);
06138 }
06139 
06140 template<typename Derived>
06141 ExprResult
06142 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
06143   return SemaRef.Owned(E);
06144 }
06145 
06146 template<typename Derived>
06147 ExprResult
06148 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
06149   return SemaRef.MaybeBindToTemporary(E);
06150 }
06151 
06152 template<typename Derived>
06153 ExprResult
06154 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
06155   ExprResult ControllingExpr =
06156     getDerived().TransformExpr(E->getControllingExpr());
06157   if (ControllingExpr.isInvalid())
06158     return ExprError();
06159 
06160   SmallVector<Expr *, 4> AssocExprs;
06161   SmallVector<TypeSourceInfo *, 4> AssocTypes;
06162   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
06163     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
06164     if (TS) {
06165       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
06166       if (!AssocType)
06167         return ExprError();
06168       AssocTypes.push_back(AssocType);
06169     } else {
06170       AssocTypes.push_back(0);
06171     }
06172 
06173     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
06174     if (AssocExpr.isInvalid())
06175       return ExprError();
06176     AssocExprs.push_back(AssocExpr.release());
06177   }
06178 
06179   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
06180                                                   E->getDefaultLoc(),
06181                                                   E->getRParenLoc(),
06182                                                   ControllingExpr.release(),
06183                                                   AssocTypes.data(),
06184                                                   AssocExprs.data(),
06185                                                   E->getNumAssocs());
06186 }
06187 
06188 template<typename Derived>
06189 ExprResult
06190 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
06191   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
06192   if (SubExpr.isInvalid())
06193     return ExprError();
06194 
06195   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
06196     return SemaRef.Owned(E);
06197 
06198   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
06199                                        E->getRParen());
06200 }
06201 
06202 template<typename Derived>
06203 ExprResult
06204 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
06205   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
06206   if (SubExpr.isInvalid())
06207     return ExprError();
06208 
06209   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
06210     return SemaRef.Owned(E);
06211 
06212   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
06213                                            E->getOpcode(),
06214                                            SubExpr.get());
06215 }
06216 
06217 template<typename Derived>
06218 ExprResult
06219 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
06220   // Transform the type.
06221   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
06222   if (!Type)
06223     return ExprError();
06224   
06225   // Transform all of the components into components similar to what the
06226   // parser uses.
06227   // FIXME: It would be slightly more efficient in the non-dependent case to 
06228   // just map FieldDecls, rather than requiring the rebuilder to look for 
06229   // the fields again. However, __builtin_offsetof is rare enough in 
06230   // template code that we don't care.
06231   bool ExprChanged = false;
06232   typedef Sema::OffsetOfComponent Component;
06233   typedef OffsetOfExpr::OffsetOfNode Node;
06234   SmallVector<Component, 4> Components;
06235   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
06236     const Node &ON = E->getComponent(I);
06237     Component Comp;
06238     Comp.isBrackets = true;
06239     Comp.LocStart = ON.getSourceRange().getBegin();
06240     Comp.LocEnd = ON.getSourceRange().getEnd();
06241     switch (ON.getKind()) {
06242     case Node::Array: {
06243       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
06244       ExprResult Index = getDerived().TransformExpr(FromIndex);
06245       if (Index.isInvalid())
06246         return ExprError();
06247       
06248       ExprChanged = ExprChanged || Index.get() != FromIndex;
06249       Comp.isBrackets = true;
06250       Comp.U.E = Index.get();
06251       break;
06252     }
06253         
06254     case Node::Field:
06255     case Node::Identifier:
06256       Comp.isBrackets = false;
06257       Comp.U.IdentInfo = ON.getFieldName();
06258       if (!Comp.U.IdentInfo)
06259         continue;
06260         
06261       break;
06262         
06263     case Node::Base:
06264       // Will be recomputed during the rebuild.
06265       continue;
06266     }
06267     
06268     Components.push_back(Comp);
06269   }
06270   
06271   // If nothing changed, retain the existing expression.
06272   if (!getDerived().AlwaysRebuild() &&
06273       Type == E->getTypeSourceInfo() &&
06274       !ExprChanged)
06275     return SemaRef.Owned(E);
06276   
06277   // Build a new offsetof expression.
06278   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
06279                                           Components.data(), Components.size(),
06280                                           E->getRParenLoc());
06281 }
06282 
06283 template<typename Derived>
06284 ExprResult
06285 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
06286   assert(getDerived().AlreadyTransformed(E->getType()) &&
06287          "opaque value expression requires transformation");
06288   return SemaRef.Owned(E);
06289 }
06290 
06291 template<typename Derived>
06292 ExprResult
06293 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
06294   // Rebuild the syntactic form.  The original syntactic form has
06295   // opaque-value expressions in it, so strip those away and rebuild
06296   // the result.  This is a really awful way of doing this, but the
06297   // better solution (rebuilding the semantic expressions and
06298   // rebinding OVEs as necessary) doesn't work; we'd need
06299   // TreeTransform to not strip away implicit conversions.
06300   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
06301   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
06302   if (result.isInvalid()) return ExprError();
06303 
06304   // If that gives us a pseudo-object result back, the pseudo-object
06305   // expression must have been an lvalue-to-rvalue conversion which we
06306   // should reapply.
06307   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
06308     result = SemaRef.checkPseudoObjectRValue(result.take());
06309 
06310   return result;
06311 }
06312 
06313 template<typename Derived>
06314 ExprResult
06315 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
06316                                                 UnaryExprOrTypeTraitExpr *E) {
06317   if (E->isArgumentType()) {
06318     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
06319 
06320     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
06321     if (!NewT)
06322       return ExprError();
06323 
06324     if (!getDerived().AlwaysRebuild() && OldT == NewT)
06325       return SemaRef.Owned(E);
06326 
06327     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
06328                                                     E->getKind(),
06329                                                     E->getSourceRange());
06330   }
06331 
06332   // C++0x [expr.sizeof]p1:
06333   //   The operand is either an expression, which is an unevaluated operand
06334   //   [...]
06335   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
06336 
06337   ExprResult SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
06338   if (SubExpr.isInvalid())
06339     return ExprError();
06340 
06341   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
06342     return SemaRef.Owned(E);
06343 
06344   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
06345                                                   E->getOperatorLoc(),
06346                                                   E->getKind(),
06347                                                   E->getSourceRange());
06348 }
06349 
06350 template<typename Derived>
06351 ExprResult
06352 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
06353   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
06354   if (LHS.isInvalid())
06355     return ExprError();
06356 
06357   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
06358   if (RHS.isInvalid())
06359     return ExprError();
06360 
06361 
06362   if (!getDerived().AlwaysRebuild() &&
06363       LHS.get() == E->getLHS() &&
06364       RHS.get() == E->getRHS())
06365     return SemaRef.Owned(E);
06366 
06367   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
06368                                            /*FIXME:*/E->getLHS()->getLocStart(),
06369                                                 RHS.get(),
06370                                                 E->getRBracketLoc());
06371 }
06372 
06373 template<typename Derived>
06374 ExprResult
06375 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
06376   // Transform the callee.
06377   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
06378   if (Callee.isInvalid())
06379     return ExprError();
06380 
06381   // Transform arguments.
06382   bool ArgChanged = false;
06383   ASTOwningVector<Expr*> Args(SemaRef);
06384   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 
06385                                   &ArgChanged))
06386     return ExprError();
06387   
06388   if (!getDerived().AlwaysRebuild() &&
06389       Callee.get() == E->getCallee() &&
06390       !ArgChanged)
06391     return SemaRef.MaybeBindToTemporary(E);;
06392 
06393   // FIXME: Wrong source location information for the '('.
06394   SourceLocation FakeLParenLoc
06395     = ((Expr *)Callee.get())->getSourceRange().getBegin();
06396   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
06397                                       move_arg(Args),
06398                                       E->getRParenLoc());
06399 }
06400 
06401 template<typename Derived>
06402 ExprResult
06403 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
06404   ExprResult Base = getDerived().TransformExpr(E->getBase());
06405   if (Base.isInvalid())
06406     return ExprError();
06407 
06408   NestedNameSpecifierLoc QualifierLoc;
06409   if (E->hasQualifier()) {
06410     QualifierLoc
06411       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
06412     
06413     if (!QualifierLoc)
06414       return ExprError();
06415   }
06416   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
06417 
06418   ValueDecl *Member
06419     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
06420                                                          E->getMemberDecl()));
06421   if (!Member)
06422     return ExprError();
06423 
06424   NamedDecl *FoundDecl = E->getFoundDecl();
06425   if (FoundDecl == E->getMemberDecl()) {
06426     FoundDecl = Member;
06427   } else {
06428     FoundDecl = cast_or_null<NamedDecl>(
06429                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
06430     if (!FoundDecl)
06431       return ExprError();
06432   }
06433 
06434   if (!getDerived().AlwaysRebuild() &&
06435       Base.get() == E->getBase() &&
06436       QualifierLoc == E->getQualifierLoc() &&
06437       Member == E->getMemberDecl() &&
06438       FoundDecl == E->getFoundDecl() &&
06439       !E->hasExplicitTemplateArgs()) {
06440     
06441     // Mark it referenced in the new context regardless.
06442     // FIXME: this is a bit instantiation-specific.
06443     SemaRef.MarkMemberReferenced(E);
06444 
06445     return SemaRef.Owned(E);
06446   }
06447 
06448   TemplateArgumentListInfo TransArgs;
06449   if (E->hasExplicitTemplateArgs()) {
06450     TransArgs.setLAngleLoc(E->getLAngleLoc());
06451     TransArgs.setRAngleLoc(E->getRAngleLoc());
06452     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
06453                                                 E->getNumTemplateArgs(),
06454                                                 TransArgs))
06455       return ExprError();
06456   }
06457   
06458   // FIXME: Bogus source location for the operator
06459   SourceLocation FakeOperatorLoc
06460     = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
06461 
06462   // FIXME: to do this check properly, we will need to preserve the
06463   // first-qualifier-in-scope here, just in case we had a dependent
06464   // base (and therefore couldn't do the check) and a
06465   // nested-name-qualifier (and therefore could do the lookup).
06466   NamedDecl *FirstQualifierInScope = 0;
06467 
06468   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
06469                                         E->isArrow(),
06470                                         QualifierLoc,
06471                                         TemplateKWLoc,
06472                                         E->getMemberNameInfo(),
06473                                         Member,
06474                                         FoundDecl,
06475                                         (E->hasExplicitTemplateArgs()
06476                                            ? &TransArgs : 0),
06477                                         FirstQualifierInScope);
06478 }
06479 
06480 template<typename Derived>
06481 ExprResult
06482 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
06483   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
06484   if (LHS.isInvalid())
06485     return ExprError();
06486 
06487   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
06488   if (RHS.isInvalid())
06489     return ExprError();
06490 
06491   if (!getDerived().AlwaysRebuild() &&
06492       LHS.get() == E->getLHS() &&
06493       RHS.get() == E->getRHS())
06494     return SemaRef.Owned(E);
06495 
06496   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
06497                                             LHS.get(), RHS.get());
06498 }
06499 
06500 template<typename Derived>
06501 ExprResult
06502 TreeTransform<Derived>::TransformCompoundAssignOperator(
06503                                                       CompoundAssignOperator *E) {
06504   return getDerived().TransformBinaryOperator(E);
06505 }
06506 
06507 template<typename Derived>
06508 ExprResult TreeTransform<Derived>::
06509 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
06510   // Just rebuild the common and RHS expressions and see whether we
06511   // get any changes.
06512 
06513   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
06514   if (commonExpr.isInvalid())
06515     return ExprError();
06516 
06517   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
06518   if (rhs.isInvalid())
06519     return ExprError();
06520 
06521   if (!getDerived().AlwaysRebuild() &&
06522       commonExpr.get() == e->getCommon() &&
06523       rhs.get() == e->getFalseExpr())
06524     return SemaRef.Owned(e);
06525 
06526   return getDerived().RebuildConditionalOperator(commonExpr.take(),
06527                                                  e->getQuestionLoc(),
06528                                                  0,
06529                                                  e->getColonLoc(),
06530                                                  rhs.get());
06531 }
06532 
06533 template<typename Derived>
06534 ExprResult
06535 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
06536   ExprResult Cond = getDerived().TransformExpr(E->getCond());
06537   if (Cond.isInvalid())
06538     return ExprError();
06539 
06540   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
06541   if (LHS.isInvalid())
06542     return ExprError();
06543 
06544   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
06545   if (RHS.isInvalid())
06546     return ExprError();
06547 
06548   if (!getDerived().AlwaysRebuild() &&
06549       Cond.get() == E->getCond() &&
06550       LHS.get() == E->getLHS() &&
06551       RHS.get() == E->getRHS())
06552     return SemaRef.Owned(E);
06553 
06554   return getDerived().RebuildConditionalOperator(Cond.get(),
06555                                                  E->getQuestionLoc(),
06556                                                  LHS.get(),
06557                                                  E->getColonLoc(),
06558                                                  RHS.get());
06559 }
06560 
06561 template<typename Derived>
06562 ExprResult
06563 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
06564   // Implicit casts are eliminated during transformation, since they
06565   // will be recomputed by semantic analysis after transformation.
06566   return getDerived().TransformExpr(E->getSubExprAsWritten());
06567 }
06568 
06569 template<typename Derived>
06570 ExprResult
06571 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
06572   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
06573   if (!Type)
06574     return ExprError();
06575   
06576   ExprResult SubExpr
06577     = getDerived().TransformExpr(E->getSubExprAsWritten());
06578   if (SubExpr.isInvalid())
06579     return ExprError();
06580 
06581   if (!getDerived().AlwaysRebuild() &&
06582       Type == E->getTypeInfoAsWritten() &&
06583       SubExpr.get() == E->getSubExpr())
06584     return SemaRef.Owned(E);
06585 
06586   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
06587                                             Type,
06588                                             E->getRParenLoc(),
06589                                             SubExpr.get());
06590 }
06591 
06592 template<typename Derived>
06593 ExprResult
06594 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
06595   TypeSourceInfo *OldT = E->getTypeSourceInfo();
06596   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
06597   if (!NewT)
06598     return ExprError();
06599 
06600   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
06601   if (Init.isInvalid())
06602     return ExprError();
06603 
06604   if (!getDerived().AlwaysRebuild() &&
06605       OldT == NewT &&
06606       Init.get() == E->getInitializer())
06607     return SemaRef.MaybeBindToTemporary(E);
06608 
06609   // Note: the expression type doesn't necessarily match the
06610   // type-as-written, but that's okay, because it should always be
06611   // derivable from the initializer.
06612 
06613   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
06614                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
06615                                                  Init.get());
06616 }
06617 
06618 template<typename Derived>
06619 ExprResult
06620 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
06621   ExprResult Base = getDerived().TransformExpr(E->getBase());
06622   if (Base.isInvalid())
06623     return ExprError();
06624 
06625   if (!getDerived().AlwaysRebuild() &&
06626       Base.get() == E->getBase())
06627     return SemaRef.Owned(E);
06628 
06629   // FIXME: Bad source location
06630   SourceLocation FakeOperatorLoc
06631     = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
06632   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
06633                                                   E->getAccessorLoc(),
06634                                                   E->getAccessor());
06635 }
06636 
06637 template<typename Derived>
06638 ExprResult
06639 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
06640   bool InitChanged = false;
06641 
06642   ASTOwningVector<Expr*, 4> Inits(SemaRef);
06643   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 
06644                                   Inits, &InitChanged))
06645     return ExprError();
06646   
06647   if (!getDerived().AlwaysRebuild() && !InitChanged)
06648     return SemaRef.Owned(E);
06649 
06650   return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
06651                                       E->getRBraceLoc(), E->getType());
06652 }
06653 
06654 template<typename Derived>
06655 ExprResult
06656 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
06657   Designation Desig;
06658 
06659   // transform the initializer value
06660   ExprResult Init = getDerived().TransformExpr(E->getInit());
06661   if (Init.isInvalid())
06662     return ExprError();
06663 
06664   // transform the designators.
06665   ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef);
06666   bool ExprChanged = false;
06667   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
06668                                              DEnd = E->designators_end();
06669        D != DEnd; ++D) {
06670     if (D->isFieldDesignator()) {
06671       Desig.AddDesignator(Designator::getField(D->getFieldName(),
06672                                                D->getDotLoc(),
06673                                                D->getFieldLoc()));
06674       continue;
06675     }
06676 
06677     if (D->isArrayDesignator()) {
06678       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
06679       if (Index.isInvalid())
06680         return ExprError();
06681 
06682       Desig.AddDesignator(Designator::getArray(Index.get(),
06683                                                D->getLBracketLoc()));
06684 
06685       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
06686       ArrayExprs.push_back(Index.release());
06687       continue;
06688     }
06689 
06690     assert(D->isArrayRangeDesignator() && "New kind of designator?");
06691     ExprResult Start
06692       = getDerived().TransformExpr(E->getArrayRangeStart(*D));
06693     if (Start.isInvalid())
06694       return ExprError();
06695 
06696     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
06697     if (End.isInvalid())
06698       return ExprError();
06699 
06700     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
06701                                                   End.get(),
06702                                                   D->getLBracketLoc(),
06703                                                   D->getEllipsisLoc()));
06704 
06705     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
06706       End.get() != E->getArrayRangeEnd(*D);
06707 
06708     ArrayExprs.push_back(Start.release());
06709     ArrayExprs.push_back(End.release());
06710   }
06711 
06712   if (!getDerived().AlwaysRebuild() &&
06713       Init.get() == E->getInit() &&
06714       !ExprChanged)
06715     return SemaRef.Owned(E);
06716 
06717   return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
06718                                                 E->getEqualOrColonLoc(),
06719                                                 E->usesGNUSyntax(), Init.get());
06720 }
06721 
06722 template<typename Derived>
06723 ExprResult
06724 TreeTransform<Derived>::TransformImplicitValueInitExpr(
06725                                                      ImplicitValueInitExpr *E) {
06726   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
06727   
06728   // FIXME: Will we ever have proper type location here? Will we actually
06729   // need to transform the type?
06730   QualType T = getDerived().TransformType(E->getType());
06731   if (T.isNull())
06732     return ExprError();
06733 
06734   if (!getDerived().AlwaysRebuild() &&
06735       T == E->getType())
06736     return SemaRef.Owned(E);
06737 
06738   return getDerived().RebuildImplicitValueInitExpr(T);
06739 }
06740 
06741 template<typename Derived>
06742 ExprResult
06743 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
06744   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
06745   if (!TInfo)
06746     return ExprError();
06747 
06748   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
06749   if (SubExpr.isInvalid())
06750     return ExprError();
06751 
06752   if (!getDerived().AlwaysRebuild() &&
06753       TInfo == E->getWrittenTypeInfo() &&
06754       SubExpr.get() == E->getSubExpr())
06755     return SemaRef.Owned(E);
06756 
06757   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
06758                                        TInfo, E->getRParenLoc());
06759 }
06760 
06761 template<typename Derived>
06762 ExprResult
06763 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
06764   bool ArgumentChanged = false;
06765   ASTOwningVector<Expr*, 4> Inits(SemaRef);
06766   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
06767                      &ArgumentChanged))
06768     return ExprError();
06769   
06770   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
06771                                            move_arg(Inits),
06772                                            E->getRParenLoc());
06773 }
06774 
06775 /// \brief Transform an address-of-label expression.
06776 ///
06777 /// By default, the transformation of an address-of-label expression always
06778 /// rebuilds the expression, so that the label identifier can be resolved to
06779 /// the corresponding label statement by semantic analysis.
06780 template<typename Derived>
06781 ExprResult
06782 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
06783   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
06784                                         E->getLabel());
06785   if (!LD)
06786     return ExprError();
06787   
06788   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
06789                                            cast<LabelDecl>(LD));
06790 }
06791 
06792 template<typename Derived>
06793 ExprResult 
06794 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
06795   SemaRef.ActOnStartStmtExpr();
06796   StmtResult SubStmt
06797     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
06798   if (SubStmt.isInvalid()) {
06799     SemaRef.ActOnStmtExprError();
06800     return ExprError();
06801   }
06802 
06803   if (!getDerived().AlwaysRebuild() &&
06804       SubStmt.get() == E->getSubStmt()) {
06805     // Calling this an 'error' is unintuitive, but it does the right thing.
06806     SemaRef.ActOnStmtExprError();
06807     return SemaRef.MaybeBindToTemporary(E);
06808   }
06809 
06810   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
06811                                       SubStmt.get(),
06812                                       E->getRParenLoc());
06813 }
06814 
06815 template<typename Derived>
06816 ExprResult
06817 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
06818   ExprResult Cond = getDerived().TransformExpr(E->getCond());
06819   if (Cond.isInvalid())
06820     return ExprError();
06821 
06822   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
06823   if (LHS.isInvalid())
06824     return ExprError();
06825 
06826   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
06827   if (RHS.isInvalid())
06828     return ExprError();
06829 
06830   if (!getDerived().AlwaysRebuild() &&
06831       Cond.get() == E->getCond() &&
06832       LHS.get() == E->getLHS() &&
06833       RHS.get() == E->getRHS())
06834     return SemaRef.Owned(E);
06835 
06836   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
06837                                         Cond.get(), LHS.get(), RHS.get(),
06838                                         E->getRParenLoc());
06839 }
06840 
06841 template<typename Derived>
06842 ExprResult
06843 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
06844   return SemaRef.Owned(E);
06845 }
06846 
06847 template<typename Derived>
06848 ExprResult
06849 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
06850   switch (E->getOperator()) {
06851   case OO_New:
06852   case OO_Delete:
06853   case OO_Array_New:
06854   case OO_Array_Delete:
06855     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
06856     
06857   case OO_Call: {
06858     // This is a call to an object's operator().
06859     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
06860 
06861     // Transform the object itself.
06862     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
06863     if (Object.isInvalid())
06864       return ExprError();
06865 
06866     // FIXME: Poor location information
06867     SourceLocation FakeLParenLoc
06868       = SemaRef.PP.getLocForEndOfToken(
06869                               static_cast<Expr *>(Object.get())->getLocEnd());
06870 
06871     // Transform the call arguments.
06872     ASTOwningVector<Expr*> Args(SemaRef);
06873     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 
06874                                     Args))
06875       return ExprError();
06876 
06877     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
06878                                         move_arg(Args),
06879                                         E->getLocEnd());
06880   }
06881 
06882 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
06883   case OO_##Name:
06884 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
06885 #include "clang/Basic/OperatorKinds.def"
06886   case OO_Subscript:
06887     // Handled below.
06888     break;
06889 
06890   case OO_Conditional:
06891     llvm_unreachable("conditional operator is not actually overloadable");
06892 
06893   case OO_None:
06894   case NUM_OVERLOADED_OPERATORS:
06895     llvm_unreachable("not an overloaded operator?");
06896   }
06897 
06898   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
06899   if (Callee.isInvalid())
06900     return ExprError();
06901 
06902   ExprResult First = getDerived().TransformExpr(E->getArg(0));
06903   if (First.isInvalid())
06904     return ExprError();
06905 
06906   ExprResult Second;
06907   if (E->getNumArgs() == 2) {
06908     Second = getDerived().TransformExpr(E->getArg(1));
06909     if (Second.isInvalid())
06910       return ExprError();
06911   }
06912 
06913   if (!getDerived().AlwaysRebuild() &&
06914       Callee.get() == E->getCallee() &&
06915       First.get() == E->getArg(0) &&
06916       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
06917     return SemaRef.MaybeBindToTemporary(E);
06918 
06919   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
06920                                                  E->getOperatorLoc(),
06921                                                  Callee.get(),
06922                                                  First.get(),
06923                                                  Second.get());
06924 }
06925 
06926 template<typename Derived>
06927 ExprResult
06928 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
06929   return getDerived().TransformCallExpr(E);
06930 }
06931 
06932 template<typename Derived>
06933 ExprResult
06934 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
06935   // Transform the callee.
06936   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
06937   if (Callee.isInvalid())
06938     return ExprError();
06939 
06940   // Transform exec config.
06941   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
06942   if (EC.isInvalid())
06943     return ExprError();
06944 
06945   // Transform arguments.
06946   bool ArgChanged = false;
06947   ASTOwningVector<Expr*> Args(SemaRef);
06948   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 
06949                                   &ArgChanged))
06950     return ExprError();
06951 
06952   if (!getDerived().AlwaysRebuild() &&
06953       Callee.get() == E->getCallee() &&
06954       !ArgChanged)
06955     return SemaRef.MaybeBindToTemporary(E);
06956 
06957   // FIXME: Wrong source location information for the '('.
06958   SourceLocation FakeLParenLoc
06959     = ((Expr *)Callee.get())->getSourceRange().getBegin();
06960   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
06961                                       move_arg(Args),
06962                                       E->getRParenLoc(), EC.get());
06963 }
06964 
06965 template<typename Derived>
06966 ExprResult
06967 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
06968   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
06969   if (!Type)
06970     return ExprError();
06971   
06972   ExprResult SubExpr
06973     = getDerived().TransformExpr(E->getSubExprAsWritten());
06974   if (SubExpr.isInvalid())
06975     return ExprError();
06976 
06977   if (!getDerived().AlwaysRebuild() &&
06978       Type == E->getTypeInfoAsWritten() &&
06979       SubExpr.get() == E->getSubExpr())
06980     return SemaRef.Owned(E);
06981 
06982   // FIXME: Poor source location information here.
06983   SourceLocation FakeLAngleLoc
06984     = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
06985   SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
06986   SourceLocation FakeRParenLoc
06987     = SemaRef.PP.getLocForEndOfToken(
06988                                   E->getSubExpr()->getSourceRange().getEnd());
06989   return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
06990                                               E->getStmtClass(),
06991                                               FakeLAngleLoc,
06992                                               Type,
06993                                               FakeRAngleLoc,
06994                                               FakeRAngleLoc,
06995                                               SubExpr.get(),
06996                                               FakeRParenLoc);
06997 }
06998 
06999 template<typename Derived>
07000 ExprResult
07001 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
07002   return getDerived().TransformCXXNamedCastExpr(E);
07003 }
07004 
07005 template<typename Derived>
07006 ExprResult
07007 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
07008   return getDerived().TransformCXXNamedCastExpr(E);
07009 }
07010 
07011 template<typename Derived>
07012 ExprResult
07013 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
07014                                                       CXXReinterpretCastExpr *E) {
07015   return getDerived().TransformCXXNamedCastExpr(E);
07016 }
07017 
07018 template<typename Derived>
07019 ExprResult
07020 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
07021   return getDerived().TransformCXXNamedCastExpr(E);
07022 }
07023 
07024 template<typename Derived>
07025 ExprResult
07026 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
07027                                                      CXXFunctionalCastExpr *E) {
07028   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
07029   if (!Type)
07030     return ExprError();
07031 
07032   ExprResult SubExpr
07033     = getDerived().TransformExpr(E->getSubExprAsWritten());
07034   if (SubExpr.isInvalid())
07035     return ExprError();
07036 
07037   if (!getDerived().AlwaysRebuild() &&
07038       Type == E->getTypeInfoAsWritten() &&
07039       SubExpr.get() == E->getSubExpr())
07040     return SemaRef.Owned(E);
07041 
07042   return getDerived().RebuildCXXFunctionalCastExpr(Type,
07043                                       /*FIXME:*/E->getSubExpr()->getLocStart(),
07044                                                    SubExpr.get(),
07045                                                    E->getRParenLoc());
07046 }
07047 
07048 template<typename Derived>
07049 ExprResult
07050 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
07051   if (E->isTypeOperand()) {
07052     TypeSourceInfo *TInfo
07053       = getDerived().TransformType(E->getTypeOperandSourceInfo());
07054     if (!TInfo)
07055       return ExprError();
07056 
07057     if (!getDerived().AlwaysRebuild() &&
07058         TInfo == E->getTypeOperandSourceInfo())
07059       return SemaRef.Owned(E);
07060 
07061     return getDerived().RebuildCXXTypeidExpr(E->getType(),
07062                                              E->getLocStart(),
07063                                              TInfo,
07064                                              E->getLocEnd());
07065   }
07066 
07067   // We don't know whether the subexpression is potentially evaluated until
07068   // after we perform semantic analysis.  We speculatively assume it is
07069   // unevaluated; it will get fixed later if the subexpression is in fact
07070   // potentially evaluated.
07071   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
07072 
07073   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
07074   if (SubExpr.isInvalid())
07075     return ExprError();
07076 
07077   if (!getDerived().AlwaysRebuild() &&
07078       SubExpr.get() == E->getExprOperand())
07079     return SemaRef.Owned(E);
07080 
07081   return getDerived().RebuildCXXTypeidExpr(E->getType(),
07082                                            E->getLocStart(),
07083                                            SubExpr.get(),
07084                                            E->getLocEnd());
07085 }
07086 
07087 template<typename Derived>
07088 ExprResult
07089 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
07090   if (E->isTypeOperand()) {
07091     TypeSourceInfo *TInfo
07092       = getDerived().TransformType(E->getTypeOperandSourceInfo());
07093     if (!TInfo)
07094       return ExprError();
07095 
07096     if (!getDerived().AlwaysRebuild() &&
07097         TInfo == E->getTypeOperandSourceInfo())
07098       return SemaRef.Owned(E);
07099 
07100     return getDerived().RebuildCXXUuidofExpr(E->getType(),
07101                                              E->getLocStart(),
07102                                              TInfo,
07103                                              E->getLocEnd());
07104   }
07105 
07106   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
07107 
07108   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
07109   if (SubExpr.isInvalid())
07110     return ExprError();
07111 
07112   if (!getDerived().AlwaysRebuild() &&
07113       SubExpr.get() == E->getExprOperand())
07114     return SemaRef.Owned(E);
07115 
07116   return getDerived().RebuildCXXUuidofExpr(E->getType(),
07117                                            E->getLocStart(),
07118                                            SubExpr.get(),
07119                                            E->getLocEnd());
07120 }
07121 
07122 template<typename Derived>
07123 ExprResult
07124 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
07125   return SemaRef.Owned(E);
07126 }
07127 
07128 template<typename Derived>
07129 ExprResult
07130 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
07131                                                      CXXNullPtrLiteralExpr *E) {
07132   return SemaRef.Owned(E);
07133 }
07134 
07135 template<typename Derived>
07136 ExprResult
07137 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
07138   DeclContext *DC = getSema().getFunctionLevelDeclContext();
07139   QualType T;
07140   if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC))
07141     T = MD->getThisType(getSema().Context);
07142   else
07143     T = getSema().Context.getPointerType(
07144       getSema().Context.getRecordType(cast<CXXRecordDecl>(DC)));
07145 
07146   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
07147     // Make sure that we capture 'this'.
07148     getSema().CheckCXXThisCapture(E->getLocStart());
07149     return SemaRef.Owned(E);
07150   }
07151   
07152   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
07153 }
07154 
07155 template<typename Derived>
07156 ExprResult
07157 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
07158   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
07159   if (SubExpr.isInvalid())
07160     return ExprError();
07161 
07162   if (!getDerived().AlwaysRebuild() &&
07163       SubExpr.get() == E->getSubExpr())
07164     return SemaRef.Owned(E);
07165 
07166   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
07167                                           E->isThrownVariableInScope());
07168 }
07169 
07170 template<typename Derived>
07171 ExprResult
07172 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
07173   ParmVarDecl *Param
07174     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
07175                                                            E->getParam()));
07176   if (!Param)
07177     return ExprError();
07178 
07179   if (!getDerived().AlwaysRebuild() &&
07180       Param == E->getParam())
07181     return SemaRef.Owned(E);
07182 
07183   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
07184 }
07185 
07186 template<typename Derived>
07187 ExprResult
07188 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
07189                                                     CXXScalarValueInitExpr *E) {
07190   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
07191   if (!T)
07192     return ExprError();
07193   
07194   if (!getDerived().AlwaysRebuild() &&
07195       T == E->getTypeSourceInfo())
07196     return SemaRef.Owned(E);
07197 
07198   return getDerived().RebuildCXXScalarValueInitExpr(T, 
07199                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
07200                                                     E->getRParenLoc());
07201 }
07202 
07203 template<typename Derived>
07204 ExprResult
07205 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
07206   // Transform the type that we're allocating
07207   TypeSourceInfo *AllocTypeInfo
07208     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
07209   if (!AllocTypeInfo)
07210     return ExprError();
07211 
07212   // Transform the size of the array we're allocating (if any).
07213   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
07214   if (ArraySize.isInvalid())
07215     return ExprError();
07216 
07217   // Transform the placement arguments (if any).
07218   bool ArgumentChanged = false;
07219   ASTOwningVector<Expr*> PlacementArgs(SemaRef);
07220   if (getDerived().TransformExprs(E->getPlacementArgs(), 
07221                                   E->getNumPlacementArgs(), true,
07222                                   PlacementArgs, &ArgumentChanged))
07223     return ExprError();
07224 
07225   // Transform the initializer (if any).
07226   Expr *OldInit = E->getInitializer();
07227   ExprResult NewInit;
07228   if (OldInit)
07229     NewInit = getDerived().TransformExpr(OldInit);
07230   if (NewInit.isInvalid())
07231     return ExprError();
07232 
07233   // Transform new operator and delete operator.
07234   FunctionDecl *OperatorNew = 0;
07235   if (E->getOperatorNew()) {
07236     OperatorNew = cast_or_null<FunctionDecl>(
07237                                  getDerived().TransformDecl(E->getLocStart(),
07238                                                          E->getOperatorNew()));
07239     if (!OperatorNew)
07240       return ExprError();
07241   }
07242 
07243   FunctionDecl *OperatorDelete = 0;
07244   if (E->getOperatorDelete()) {
07245     OperatorDelete = cast_or_null<FunctionDecl>(
07246                                    getDerived().TransformDecl(E->getLocStart(),
07247                                                        E->getOperatorDelete()));
07248     if (!OperatorDelete)
07249       return ExprError();
07250   }
07251   
07252   if (!getDerived().AlwaysRebuild() &&
07253       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
07254       ArraySize.get() == E->getArraySize() &&
07255       NewInit.get() == OldInit &&
07256       OperatorNew == E->getOperatorNew() &&
07257       OperatorDelete == E->getOperatorDelete() &&
07258       !ArgumentChanged) {
07259     // Mark any declarations we need as referenced.
07260     // FIXME: instantiation-specific.
07261     if (OperatorNew)
07262       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
07263     if (OperatorDelete)
07264       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
07265     
07266     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
07267       QualType ElementType
07268         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
07269       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
07270         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
07271         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
07272           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
07273         }
07274       }
07275     }
07276 
07277     return SemaRef.Owned(E);
07278   }
07279 
07280   QualType AllocType = AllocTypeInfo->getType();
07281   if (!ArraySize.get()) {
07282     // If no array size was specified, but the new expression was
07283     // instantiated with an array type (e.g., "new T" where T is
07284     // instantiated with "int[4]"), extract the outer bound from the
07285     // array type as our array size. We do this with constant and
07286     // dependently-sized array types.
07287     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
07288     if (!ArrayT) {
07289       // Do nothing
07290     } else if (const ConstantArrayType *ConsArrayT
07291                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
07292       ArraySize 
07293         = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context,
07294                                                ConsArrayT->getSize(), 
07295                                                SemaRef.Context.getSizeType(),
07296                                                /*FIXME:*/E->getLocStart()));
07297       AllocType = ConsArrayT->getElementType();
07298     } else if (const DependentSizedArrayType *DepArrayT
07299                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
07300       if (DepArrayT->getSizeExpr()) {
07301         ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr());
07302         AllocType = DepArrayT->getElementType();
07303       }
07304     }
07305   }
07306 
07307   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
07308                                         E->isGlobalNew(),
07309                                         /*FIXME:*/E->getLocStart(),
07310                                         move_arg(PlacementArgs),
07311                                         /*FIXME:*/E->getLocStart(),
07312                                         E->getTypeIdParens(),
07313                                         AllocType,
07314                                         AllocTypeInfo,
07315                                         ArraySize.get(),
07316                                         E->getDirectInitRange(),
07317                                         NewInit.take());
07318 }
07319 
07320 template<typename Derived>
07321 ExprResult
07322 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
07323   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
07324   if (Operand.isInvalid())
07325     return ExprError();
07326 
07327   // Transform the delete operator, if known.
07328   FunctionDecl *OperatorDelete = 0;
07329   if (E->getOperatorDelete()) {
07330     OperatorDelete = cast_or_null<FunctionDecl>(
07331                                    getDerived().TransformDecl(E->getLocStart(),
07332                                                        E->getOperatorDelete()));
07333     if (!OperatorDelete)
07334       return ExprError();
07335   }
07336   
07337   if (!getDerived().AlwaysRebuild() &&
07338       Operand.get() == E->getArgument() &&
07339       OperatorDelete == E->getOperatorDelete()) {
07340     // Mark any declarations we need as referenced.
07341     // FIXME: instantiation-specific.
07342     if (OperatorDelete)
07343       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
07344     
07345     if (!E->getArgument()->isTypeDependent()) {
07346       QualType Destroyed = SemaRef.Context.getBaseElementType(
07347                                                          E->getDestroyedType());
07348       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
07349         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
07350         SemaRef.MarkFunctionReferenced(E->getLocStart(), 
07351                                        SemaRef.LookupDestructor(Record));
07352       }
07353     }
07354     
07355     return SemaRef.Owned(E);
07356   }
07357 
07358   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
07359                                            E->isGlobalDelete(),
07360                                            E->isArrayForm(),
07361                                            Operand.get());
07362 }
07363 
07364 template<typename Derived>
07365 ExprResult
07366 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
07367                                                      CXXPseudoDestructorExpr *E) {
07368   ExprResult Base = getDerived().TransformExpr(E->getBase());
07369   if (Base.isInvalid())
07370     return ExprError();
07371 
07372   ParsedType ObjectTypePtr;
07373   bool MayBePseudoDestructor = false;
07374   Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 
07375                                               E->getOperatorLoc(),
07376                                         E->isArrow()? tok::arrow : tok::period,
07377                                               ObjectTypePtr,
07378                                               MayBePseudoDestructor);
07379   if (Base.isInvalid())
07380     return ExprError();
07381                                               
07382   QualType ObjectType = ObjectTypePtr.get();
07383   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
07384   if (QualifierLoc) {
07385     QualifierLoc
07386       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
07387     if (!QualifierLoc)
07388       return ExprError();
07389   }
07390   CXXScopeSpec SS;
07391   SS.Adopt(QualifierLoc);
07392 
07393   PseudoDestructorTypeStorage Destroyed;
07394   if (E->getDestroyedTypeInfo()) {
07395     TypeSourceInfo *DestroyedTypeInfo
07396       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
07397                                                 ObjectType, 0, SS);
07398     if (!DestroyedTypeInfo)
07399       return ExprError();
07400     Destroyed = DestroyedTypeInfo;
07401   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
07402     // We aren't likely to be able to resolve the identifier down to a type
07403     // now anyway, so just retain the identifier.
07404     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
07405                                             E->getDestroyedTypeLoc());
07406   } else {
07407     // Look for a destructor known with the given name.
07408     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
07409                                               *E->getDestroyedTypeIdentifier(),
07410                                                 E->getDestroyedTypeLoc(),
07411                                                 /*Scope=*/0,
07412                                                 SS, ObjectTypePtr,
07413                                                 false);
07414     if (!T)
07415       return ExprError();
07416     
07417     Destroyed
07418       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
07419                                                  E->getDestroyedTypeLoc());
07420   }
07421 
07422   TypeSourceInfo *ScopeTypeInfo = 0;
07423   if (E->getScopeTypeInfo()) {
07424     ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo());
07425     if (!ScopeTypeInfo)
07426       return ExprError();
07427   }
07428   
07429   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
07430                                                      E->getOperatorLoc(),
07431                                                      E->isArrow(),
07432                                                      SS,
07433                                                      ScopeTypeInfo,
07434                                                      E->getColonColonLoc(),
07435                                                      E->getTildeLoc(),
07436                                                      Destroyed);
07437 }
07438 
07439 template<typename Derived>
07440 ExprResult
07441 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
07442                                                   UnresolvedLookupExpr *Old) {
07443   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
07444                  Sema::LookupOrdinaryName);
07445 
07446   // Transform all the decls.
07447   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
07448          E = Old->decls_end(); I != E; ++I) {
07449     NamedDecl *InstD = static_cast<NamedDecl*>(
07450                                  getDerived().TransformDecl(Old->getNameLoc(),
07451                                                             *I));
07452     if (!InstD) {
07453       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
07454       // This can happen because of dependent hiding.
07455       if (isa<UsingShadowDecl>(*I))
07456         continue;
07457       else
07458         return ExprError();
07459     }
07460 
07461     // Expand using declarations.
07462     if (isa<UsingDecl>(InstD)) {
07463       UsingDecl *UD = cast<UsingDecl>(InstD);
07464       for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
07465              E = UD->shadow_end(); I != E; ++I)
07466         R.addDecl(*I);
07467       continue;
07468     }
07469 
07470     R.addDecl(InstD);
07471   }
07472 
07473   // Resolve a kind, but don't do any further analysis.  If it's
07474   // ambiguous, the callee needs to deal with it.
07475   R.resolveKind();
07476 
07477   // Rebuild the nested-name qualifier, if present.
07478   CXXScopeSpec SS;
07479   if (Old->getQualifierLoc()) {
07480     NestedNameSpecifierLoc QualifierLoc
07481       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
07482     if (!QualifierLoc)
07483       return ExprError();
07484     
07485     SS.Adopt(QualifierLoc);
07486   } 
07487   
07488   if (Old->getNamingClass()) {
07489     CXXRecordDecl *NamingClass
07490       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
07491                                                             Old->getNameLoc(),
07492                                                         Old->getNamingClass()));
07493     if (!NamingClass)
07494       return ExprError();
07495     
07496     R.setNamingClass(NamingClass);
07497   }
07498 
07499   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
07500 
07501   // If we have neither explicit template arguments, nor the template keyword,
07502   // it's a normal declaration name.
07503   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
07504     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
07505 
07506   // If we have template arguments, rebuild them, then rebuild the
07507   // templateid expression.
07508   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
07509   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
07510                                               Old->getNumTemplateArgs(),
07511                                               TransArgs))
07512     return ExprError();
07513 
07514   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
07515                                             Old->requiresADL(), &TransArgs);
07516 }
07517 
07518 template<typename Derived>
07519 ExprResult
07520 TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
07521   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
07522   if (!T)
07523     return ExprError();
07524 
07525   if (!getDerived().AlwaysRebuild() &&
07526       T == E->getQueriedTypeSourceInfo())
07527     return SemaRef.Owned(E);
07528 
07529   return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
07530                                             E->getLocStart(),
07531                                             T,
07532                                             E->getLocEnd());
07533 }
07534 
07535 template<typename Derived>
07536 ExprResult
07537 TreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
07538   TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo());
07539   if (!LhsT)
07540     return ExprError();
07541 
07542   TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo());
07543   if (!RhsT)
07544     return ExprError();
07545 
07546   if (!getDerived().AlwaysRebuild() &&
07547       LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo())
07548     return SemaRef.Owned(E);
07549 
07550   return getDerived().RebuildBinaryTypeTrait(E->getTrait(),
07551                                             E->getLocStart(),
07552                                             LhsT, RhsT,
07553                                             E->getLocEnd());
07554 }
07555 
07556 template<typename Derived>
07557 ExprResult
07558 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
07559   bool ArgChanged = false;
07560   llvm::SmallVector<TypeSourceInfo *, 4> Args;
07561   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
07562     TypeSourceInfo *From = E->getArg(I);
07563     TypeLoc FromTL = From->getTypeLoc();
07564     if (!isa<PackExpansionTypeLoc>(FromTL)) {
07565       TypeLocBuilder TLB;
07566       TLB.reserve(FromTL.getFullDataSize());
07567       QualType To = getDerived().TransformType(TLB, FromTL);
07568       if (To.isNull())
07569         return ExprError();
07570       
07571       if (To == From->getType())
07572         Args.push_back(From);
07573       else {
07574         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
07575         ArgChanged = true;
07576       }
07577       continue;
07578     }
07579     
07580     ArgChanged = true;
07581     
07582     // We have a pack expansion. Instantiate it.
07583     PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(FromTL);      
07584     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
07585     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
07586     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
07587     
07588     // Determine whether the set of unexpanded parameter packs can and should
07589     // be expanded.
07590     bool Expand = true;
07591     bool RetainExpansion = false;
07592     llvm::Optional<unsigned> OrigNumExpansions
07593       = ExpansionTL.getTypePtr()->getNumExpansions();
07594     llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
07595     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
07596                                              PatternTL.getSourceRange(),
07597                                              Unexpanded,
07598                                              Expand, RetainExpansion,
07599                                              NumExpansions))
07600       return ExprError();
07601     
07602     if (!Expand) {
07603       // The transform has determined that we should perform a simple
07604       // transformation on the pack expansion, producing another pack 
07605       // expansion.
07606       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
07607       
07608       TypeLocBuilder TLB;
07609       TLB.reserve(From->getTypeLoc().getFullDataSize());
07610 
07611       QualType To = getDerived().TransformType(TLB, PatternTL);
07612       if (To.isNull())
07613         return ExprError();
07614 
07615       To = getDerived().RebuildPackExpansionType(To, 
07616                                                  PatternTL.getSourceRange(),
07617                                                  ExpansionTL.getEllipsisLoc(),
07618                                                  NumExpansions);
07619       if (To.isNull())
07620         return ExprError();
07621       
07622       PackExpansionTypeLoc ToExpansionTL
07623         = TLB.push<PackExpansionTypeLoc>(To);
07624       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
07625       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
07626       continue;
07627     }
07628 
07629     // Expand the pack expansion by substituting for each argument in the
07630     // pack(s).
07631     for (unsigned I = 0; I != *NumExpansions; ++I) {
07632       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
07633       TypeLocBuilder TLB;
07634       TLB.reserve(PatternTL.getFullDataSize());
07635       QualType To = getDerived().TransformType(TLB, PatternTL);
07636       if (To.isNull())
07637         return ExprError();
07638 
07639       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
07640     }
07641     
07642     if (!RetainExpansion)
07643       continue;
07644     
07645     // If we're supposed to retain a pack expansion, do so by temporarily
07646     // forgetting the partially-substituted parameter pack.
07647     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
07648 
07649     TypeLocBuilder TLB;
07650     TLB.reserve(From->getTypeLoc().getFullDataSize());
07651     
07652     QualType To = getDerived().TransformType(TLB, PatternTL);
07653     if (To.isNull())
07654       return ExprError();
07655     
07656     To = getDerived().RebuildPackExpansionType(To, 
07657                                                PatternTL.getSourceRange(),
07658                                                ExpansionTL.getEllipsisLoc(),
07659                                                NumExpansions);
07660     if (To.isNull())
07661       return ExprError();
07662     
07663     PackExpansionTypeLoc ToExpansionTL
07664       = TLB.push<PackExpansionTypeLoc>(To);
07665     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
07666     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
07667   }
07668   
07669   if (!getDerived().AlwaysRebuild() && !ArgChanged)
07670     return SemaRef.Owned(E);
07671 
07672   return getDerived().RebuildTypeTrait(E->getTrait(),
07673                                        E->getLocStart(),
07674                                        Args,
07675                                        E->getLocEnd());
07676 }
07677 
07678 template<typename Derived>
07679 ExprResult
07680 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
07681   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
07682   if (!T)
07683     return ExprError();
07684 
07685   if (!getDerived().AlwaysRebuild() &&
07686       T == E->getQueriedTypeSourceInfo())
07687     return SemaRef.Owned(E);
07688 
07689   ExprResult SubExpr;
07690   {
07691     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
07692     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
07693     if (SubExpr.isInvalid())
07694       return ExprError();
07695 
07696     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
07697       return SemaRef.Owned(E);
07698   }
07699 
07700   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
07701                                             E->getLocStart(),
07702                                             T,
07703                                             SubExpr.get(),
07704                                             E->getLocEnd());
07705 }
07706 
07707 template<typename Derived>
07708 ExprResult
07709 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
07710   ExprResult SubExpr;
07711   {
07712     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
07713     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
07714     if (SubExpr.isInvalid())
07715       return ExprError();
07716 
07717     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
07718       return SemaRef.Owned(E);
07719   }
07720 
07721   return getDerived().RebuildExpressionTrait(
07722       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
07723 }
07724 
07725 template<typename Derived>
07726 ExprResult
07727 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
07728                                                DependentScopeDeclRefExpr *E) {
07729   NestedNameSpecifierLoc QualifierLoc
07730   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
07731   if (!QualifierLoc)
07732     return ExprError();
07733   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
07734 
07735   // TODO: If this is a conversion-function-id, verify that the
07736   // destination type name (if present) resolves the same way after
07737   // instantiation as it did in the local scope.
07738 
07739   DeclarationNameInfo NameInfo
07740     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
07741   if (!NameInfo.getName())
07742     return ExprError();
07743 
07744   if (!E->hasExplicitTemplateArgs()) {
07745     if (!getDerived().AlwaysRebuild() &&
07746         QualifierLoc == E->getQualifierLoc() &&
07747         // Note: it is sufficient to compare the Name component of NameInfo:
07748         // if name has not changed, DNLoc has not changed either.
07749         NameInfo.getName() == E->getDeclName())
07750       return SemaRef.Owned(E);
07751 
07752     return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
07753                                                          TemplateKWLoc,
07754                                                          NameInfo,
07755                                                          /*TemplateArgs*/ 0);
07756   }
07757 
07758   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
07759   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
07760                                               E->getNumTemplateArgs(),
07761                                               TransArgs))
07762     return ExprError();
07763 
07764   return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
07765                                                        TemplateKWLoc,
07766                                                        NameInfo,
07767                                                        &TransArgs);
07768 }
07769 
07770 template<typename Derived>
07771 ExprResult
07772 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
07773   // CXXConstructExprs are always implicit, so when we have a
07774   // 1-argument construction we just transform that argument.
07775   if (E->getNumArgs() == 1 ||
07776       (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
07777     return getDerived().TransformExpr(E->getArg(0));
07778 
07779   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
07780 
07781   QualType T = getDerived().TransformType(E->getType());
07782   if (T.isNull())
07783     return ExprError();
07784 
07785   CXXConstructorDecl *Constructor
07786     = cast_or_null<CXXConstructorDecl>(
07787                                 getDerived().TransformDecl(E->getLocStart(),
07788                                                          E->getConstructor()));
07789   if (!Constructor)
07790     return ExprError();
07791 
07792   bool ArgumentChanged = false;
07793   ASTOwningVector<Expr*> Args(SemaRef);
07794   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 
07795                                   &ArgumentChanged))
07796     return ExprError();
07797   
07798   if (!getDerived().AlwaysRebuild() &&
07799       T == E->getType() &&
07800       Constructor == E->getConstructor() &&
07801       !ArgumentChanged) {
07802     // Mark the constructor as referenced.
07803     // FIXME: Instantiation-specific
07804     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
07805     return SemaRef.Owned(E);
07806   }
07807 
07808   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
07809                                               Constructor, E->isElidable(),
07810                                               move_arg(Args),
07811                                               E->hadMultipleCandidates(),
07812                                               E->requiresZeroInitialization(),
07813                                               E->getConstructionKind(),
07814                                               E->getParenRange());
07815 }
07816 
07817 /// \brief Transform a C++ temporary-binding expression.
07818 ///
07819 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
07820 /// transform the subexpression and return that.
07821 template<typename Derived>
07822 ExprResult
07823 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
07824   return getDerived().TransformExpr(E->getSubExpr());
07825 }
07826 
07827 /// \brief Transform a C++ expression that contains cleanups that should
07828 /// be run after the expression is evaluated.
07829 ///
07830 /// Since ExprWithCleanups nodes are implicitly generated, we
07831 /// just transform the subexpression and return that.
07832 template<typename Derived>
07833 ExprResult
07834 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
07835   return getDerived().TransformExpr(E->getSubExpr());
07836 }
07837 
07838 template<typename Derived>
07839 ExprResult
07840 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
07841                                                     CXXTemporaryObjectExpr *E) {
07842   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
07843   if (!T)
07844     return ExprError();
07845 
07846   CXXConstructorDecl *Constructor
07847     = cast_or_null<CXXConstructorDecl>(
07848                                   getDerived().TransformDecl(E->getLocStart(), 
07849                                                          E->getConstructor()));
07850   if (!Constructor)
07851     return ExprError();
07852 
07853   bool ArgumentChanged = false;
07854   ASTOwningVector<Expr*> Args(SemaRef);
07855   Args.reserve(E->getNumArgs());
07856   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 
07857                      &ArgumentChanged))
07858     return ExprError();
07859 
07860   if (!getDerived().AlwaysRebuild() &&
07861       T == E->getTypeSourceInfo() &&
07862       Constructor == E->getConstructor() &&
07863       !ArgumentChanged) {
07864     // FIXME: Instantiation-specific
07865     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
07866     return SemaRef.MaybeBindToTemporary(E);
07867   }
07868   
07869   return getDerived().RebuildCXXTemporaryObjectExpr(T,
07870                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
07871                                                     move_arg(Args),
07872                                                     E->getLocEnd());
07873 }
07874 
07875 template<typename Derived>
07876 ExprResult
07877 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
07878   // Create the local class that will describe the lambda.
07879   CXXRecordDecl *Class
07880     = getSema().createLambdaClosureType(E->getIntroducerRange(),
07881                                         /*KnownDependent=*/false);
07882   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
07883   
07884   // Transform the type of the lambda parameters and start the definition of
07885   // the lambda itself.
07886   TypeSourceInfo *MethodTy
07887     = TransformType(E->getCallOperator()->getTypeSourceInfo());  
07888   if (!MethodTy)
07889     return ExprError();
07890 
07891   // Transform lambda parameters.
07892   bool Invalid = false;
07893   llvm::SmallVector<QualType, 4> ParamTypes;
07894   llvm::SmallVector<ParmVarDecl *, 4> Params;
07895   if (getDerived().TransformFunctionTypeParams(E->getLocStart(),
07896         E->getCallOperator()->param_begin(),
07897         E->getCallOperator()->param_size(),
07898         0, ParamTypes, &Params))
07899     Invalid = true;  
07900 
07901   // Build the call operator.
07902   // Note: Once a lambda mangling number and context declaration have been
07903   // assigned, they never change.
07904   unsigned ManglingNumber = E->getLambdaClass()->getLambdaManglingNumber();
07905   Decl *ContextDecl = E->getLambdaClass()->getLambdaContextDecl();  
07906   CXXMethodDecl *CallOperator
07907     = getSema().startLambdaDefinition(Class, E->getIntroducerRange(),
07908                                       MethodTy, 
07909                                       E->getCallOperator()->getLocEnd(),
07910                                       Params, ManglingNumber, ContextDecl);
07911   getDerived().transformAttrs(E->getCallOperator(), CallOperator);
07912   
07913   // FIXME: Instantiation-specific.
07914   CallOperator->setInstantiationOfMemberFunction(E->getCallOperator(), 
07915                                                  TSK_ImplicitInstantiation);
07916 
07917   // Introduce the context of the call operator.
07918   Sema::ContextRAII SavedContext(getSema(), CallOperator);
07919 
07920   // Enter the scope of the lambda.
07921   sema::LambdaScopeInfo *LSI
07922     = getSema().enterLambdaScope(CallOperator, E->getIntroducerRange(),
07923                                  E->getCaptureDefault(),
07924                                  E->hasExplicitParameters(),
07925                                  E->hasExplicitResultType(),
07926                                  E->isMutable());
07927   
07928   // Transform captures.
07929   bool FinishedExplicitCaptures = false;
07930   for (LambdaExpr::capture_iterator C = E->capture_begin(), 
07931                                  CEnd = E->capture_end();
07932        C != CEnd; ++C) {
07933     // When we hit the first implicit capture, tell Sema that we've finished
07934     // the list of explicit captures.
07935     if (!FinishedExplicitCaptures && C->isImplicit()) {
07936       getSema().finishLambdaExplicitCaptures(LSI);
07937       FinishedExplicitCaptures = true;
07938     }
07939     
07940     // Capturing 'this' is trivial.
07941     if (C->capturesThis()) {
07942       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit());
07943       continue;
07944     }
07945     
07946     // Determine the capture kind for Sema.
07947     Sema::TryCaptureKind Kind
07948       = C->isImplicit()? Sema::TryCapture_Implicit
07949                        : C->getCaptureKind() == LCK_ByCopy
07950                            ? Sema::TryCapture_ExplicitByVal
07951                            : Sema::TryCapture_ExplicitByRef;
07952     SourceLocation EllipsisLoc;
07953     if (C->isPackExpansion()) {
07954       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
07955       bool ShouldExpand = false;
07956       bool RetainExpansion = false;
07957       llvm::Optional<unsigned> NumExpansions;
07958       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 
07959                                                C->getLocation(), 
07960                                                Unexpanded,
07961                                                ShouldExpand, RetainExpansion,
07962                                                NumExpansions))
07963         return ExprError();
07964       
07965       if (ShouldExpand) {
07966         // The transform has determined that we should perform an expansion;
07967         // transform and capture each of the arguments.
07968         // expansion of the pattern. Do so.
07969         VarDecl *Pack = C->getCapturedVar();
07970         for (unsigned I = 0; I != *NumExpansions; ++I) {
07971           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
07972           VarDecl *CapturedVar
07973             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 
07974                                                                Pack));
07975           if (!CapturedVar) {
07976             Invalid = true;
07977             continue;
07978           }
07979           
07980           // Capture the transformed variable.
07981           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);          
07982         }          
07983         continue;
07984       }
07985       
07986       EllipsisLoc = C->getEllipsisLoc();
07987     }
07988     
07989     // Transform the captured variable.
07990     VarDecl *CapturedVar
07991       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 
07992                                                          C->getCapturedVar()));
07993     if (!CapturedVar) {
07994       Invalid = true;
07995       continue;
07996     }
07997   
07998     // Capture the transformed variable.
07999     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
08000   }
08001   if (!FinishedExplicitCaptures)
08002     getSema().finishLambdaExplicitCaptures(LSI);
08003 
08004 
08005   // Enter a new evaluation context to insulate the lambda from any
08006   // cleanups from the enclosing full-expression.
08007   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);  
08008 
08009   if (Invalid) {
08010     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 
08011                                /*IsInstantiation=*/true);
08012     return ExprError();
08013   }
08014 
08015   // Instantiate the body of the lambda expression.
08016   StmtResult Body = getDerived().TransformStmt(E->getBody());
08017   if (Body.isInvalid()) {
08018     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 
08019                                /*IsInstantiation=*/true);
08020     return ExprError();    
08021   }
08022 
08023   return getSema().ActOnLambdaExpr(E->getLocStart(), Body.take(), 
08024                                    /*CurScope=*/0, /*IsInstantiation=*/true);
08025 }
08026 
08027 template<typename Derived>
08028 ExprResult
08029 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
08030                                                   CXXUnresolvedConstructExpr *E) {
08031   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
08032   if (!T)
08033     return ExprError();
08034 
08035   bool ArgumentChanged = false;
08036   ASTOwningVector<Expr*> Args(SemaRef);
08037   Args.reserve(E->arg_size());
08038   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 
08039                                   &ArgumentChanged))
08040     return ExprError();
08041   
08042   if (!getDerived().AlwaysRebuild() &&
08043       T == E->getTypeSourceInfo() &&
08044       !ArgumentChanged)
08045     return SemaRef.Owned(E);
08046 
08047   // FIXME: we're faking the locations of the commas
08048   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
08049                                                         E->getLParenLoc(),
08050                                                         move_arg(Args),
08051                                                         E->getRParenLoc());
08052 }
08053 
08054 template<typename Derived>
08055 ExprResult
08056 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
08057                                              CXXDependentScopeMemberExpr *E) {
08058   // Transform the base of the expression.
08059   ExprResult Base((Expr*) 0);
08060   Expr *OldBase;
08061   QualType BaseType;
08062   QualType ObjectType;
08063   if (!E->isImplicitAccess()) {
08064     OldBase = E->getBase();
08065     Base = getDerived().TransformExpr(OldBase);
08066     if (Base.isInvalid())
08067       return ExprError();
08068 
08069     // Start the member reference and compute the object's type.
08070     ParsedType ObjectTy;
08071     bool MayBePseudoDestructor = false;
08072     Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
08073                                                 E->getOperatorLoc(),
08074                                       E->isArrow()? tok::arrow : tok::period,
08075                                                 ObjectTy,
08076                                                 MayBePseudoDestructor);
08077     if (Base.isInvalid())
08078       return ExprError();
08079 
08080     ObjectType = ObjectTy.get();
08081     BaseType = ((Expr*) Base.get())->getType();
08082   } else {
08083     OldBase = 0;
08084     BaseType = getDerived().TransformType(E->getBaseType());
08085     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
08086   }
08087 
08088   // Transform the first part of the nested-name-specifier that qualifies
08089   // the member name.
08090   NamedDecl *FirstQualifierInScope
08091     = getDerived().TransformFirstQualifierInScope(
08092                                             E->getFirstQualifierFoundInScope(),
08093                                             E->getQualifierLoc().getBeginLoc());
08094 
08095   NestedNameSpecifierLoc QualifierLoc;
08096   if (E->getQualifier()) {
08097     QualifierLoc
08098       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
08099                                                      ObjectType,
08100                                                      FirstQualifierInScope);
08101     if (!QualifierLoc)
08102       return ExprError();
08103   }
08104 
08105   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
08106 
08107   // TODO: If this is a conversion-function-id, verify that the
08108   // destination type name (if present) resolves the same way after
08109   // instantiation as it did in the local scope.
08110 
08111   DeclarationNameInfo NameInfo
08112     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
08113   if (!NameInfo.getName())
08114     return ExprError();
08115 
08116   if (!E->hasExplicitTemplateArgs()) {
08117     // This is a reference to a member without an explicitly-specified
08118     // template argument list. Optimize for this common case.
08119     if (!getDerived().AlwaysRebuild() &&
08120         Base.get() == OldBase &&
08121         BaseType == E->getBaseType() &&
08122         QualifierLoc == E->getQualifierLoc() &&
08123         NameInfo.getName() == E->getMember() &&
08124         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
08125       return SemaRef.Owned(E);
08126 
08127     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
08128                                                        BaseType,
08129                                                        E->isArrow(),
08130                                                        E->getOperatorLoc(),
08131                                                        QualifierLoc,
08132                                                        TemplateKWLoc,
08133                                                        FirstQualifierInScope,
08134                                                        NameInfo,
08135                                                        /*TemplateArgs*/ 0);
08136   }
08137 
08138   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
08139   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
08140                                               E->getNumTemplateArgs(),
08141                                               TransArgs))
08142     return ExprError();
08143 
08144   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
08145                                                      BaseType,
08146                                                      E->isArrow(),
08147                                                      E->getOperatorLoc(),
08148                                                      QualifierLoc,
08149                                                      TemplateKWLoc,
08150                                                      FirstQualifierInScope,
08151                                                      NameInfo,
08152                                                      &TransArgs);
08153 }
08154 
08155 template<typename Derived>
08156 ExprResult
08157 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
08158   // Transform the base of the expression.
08159   ExprResult Base((Expr*) 0);
08160   QualType BaseType;
08161   if (!Old->isImplicitAccess()) {
08162     Base = getDerived().TransformExpr(Old->getBase());
08163     if (Base.isInvalid())
08164       return ExprError();
08165     Base = getSema().PerformMemberExprBaseConversion(Base.take(),
08166                                                      Old->isArrow());
08167     if (Base.isInvalid())
08168       return ExprError();
08169     BaseType = Base.get()->getType();
08170   } else {
08171     BaseType = getDerived().TransformType(Old->getBaseType());
08172   }
08173 
08174   NestedNameSpecifierLoc QualifierLoc;
08175   if (Old->getQualifierLoc()) {
08176     QualifierLoc
08177     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
08178     if (!QualifierLoc)
08179       return ExprError();
08180   }
08181 
08182   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
08183 
08184   LookupResult R(SemaRef, Old->getMemberNameInfo(),
08185                  Sema::LookupOrdinaryName);
08186 
08187   // Transform all the decls.
08188   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
08189          E = Old->decls_end(); I != E; ++I) {
08190     NamedDecl *InstD = static_cast<NamedDecl*>(
08191                                 getDerived().TransformDecl(Old->getMemberLoc(),
08192                                                            *I));
08193     if (!InstD) {
08194       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
08195       // This can happen because of dependent hiding.
08196       if (isa<UsingShadowDecl>(*I))
08197         continue;
08198       else {
08199         R.clear();
08200         return ExprError();
08201       }
08202     }
08203 
08204     // Expand using declarations.
08205     if (isa<UsingDecl>(InstD)) {
08206       UsingDecl *UD = cast<UsingDecl>(InstD);
08207       for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
08208              E = UD->shadow_end(); I != E; ++I)
08209         R.addDecl(*I);
08210       continue;
08211     }
08212 
08213     R.addDecl(InstD);
08214   }
08215 
08216   R.resolveKind();
08217 
08218   // Determine the naming class.
08219   if (Old->getNamingClass()) {
08220     CXXRecordDecl *NamingClass 
08221       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
08222                                                           Old->getMemberLoc(),
08223                                                         Old->getNamingClass()));
08224     if (!NamingClass)
08225       return ExprError();
08226     
08227     R.setNamingClass(NamingClass);
08228   }
08229   
08230   TemplateArgumentListInfo TransArgs;
08231   if (Old->hasExplicitTemplateArgs()) {
08232     TransArgs.setLAngleLoc(Old->getLAngleLoc());
08233     TransArgs.setRAngleLoc(Old->getRAngleLoc());
08234     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
08235                                                 Old->getNumTemplateArgs(),
08236                                                 TransArgs))
08237       return ExprError();
08238   }
08239 
08240   // FIXME: to do this check properly, we will need to preserve the
08241   // first-qualifier-in-scope here, just in case we had a dependent
08242   // base (and therefore couldn't do the check) and a
08243   // nested-name-qualifier (and therefore could do the lookup).
08244   NamedDecl *FirstQualifierInScope = 0;
08245   
08246   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
08247                                                   BaseType,
08248                                                   Old->getOperatorLoc(),
08249                                                   Old->isArrow(),
08250                                                   QualifierLoc,
08251                                                   TemplateKWLoc,
08252                                                   FirstQualifierInScope,
08253                                                   R,
08254                                               (Old->hasExplicitTemplateArgs()
08255                                                   ? &TransArgs : 0));
08256 }
08257 
08258 template<typename Derived>
08259 ExprResult
08260 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
08261   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
08262   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
08263   if (SubExpr.isInvalid())
08264     return ExprError();
08265 
08266   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
08267     return SemaRef.Owned(E);
08268 
08269   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
08270 }
08271 
08272 template<typename Derived>
08273 ExprResult
08274 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
08275   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
08276   if (Pattern.isInvalid())
08277     return ExprError();
08278   
08279   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
08280     return SemaRef.Owned(E);
08281 
08282   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
08283                                            E->getNumExpansions());
08284 }
08285 
08286 template<typename Derived>
08287 ExprResult
08288 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
08289   // If E is not value-dependent, then nothing will change when we transform it.
08290   // Note: This is an instantiation-centric view.
08291   if (!E->isValueDependent())
08292     return SemaRef.Owned(E);
08293 
08294   // Note: None of the implementations of TryExpandParameterPacks can ever
08295   // produce a diagnostic when given only a single unexpanded parameter pack,
08296   // so 
08297   UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
08298   bool ShouldExpand = false;
08299   bool RetainExpansion = false;
08300   llvm::Optional<unsigned> NumExpansions;
08301   if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 
08302                                            Unexpanded,
08303                                            ShouldExpand, RetainExpansion,
08304                                            NumExpansions))
08305     return ExprError();
08306   
08307   if (RetainExpansion)
08308     return SemaRef.Owned(E);
08309     
08310   NamedDecl *Pack = E->getPack();
08311   if (!ShouldExpand) {
08312     Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(), 
08313                                                               Pack));
08314     if (!Pack)
08315       return ExprError();
08316   }
08317 
08318   
08319   // We now know the length of the parameter pack, so build a new expression
08320   // that stores that length.
08321   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 
08322                                             E->getPackLoc(), E->getRParenLoc(), 
08323                                             NumExpansions);
08324 }
08325 
08326 template<typename Derived>
08327 ExprResult
08328 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
08329                                           SubstNonTypeTemplateParmPackExpr *E) {
08330   // Default behavior is to do nothing with this transformation.
08331   return SemaRef.Owned(E);
08332 }
08333 
08334 template<typename Derived>
08335 ExprResult
08336 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
08337                                           SubstNonTypeTemplateParmExpr *E) {
08338   // Default behavior is to do nothing with this transformation.
08339   return SemaRef.Owned(E);
08340 }
08341 
08342 template<typename Derived>
08343 ExprResult
08344 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
08345                                                   MaterializeTemporaryExpr *E) {
08346   return getDerived().TransformExpr(E->GetTemporaryExpr());
08347 }
08348   
08349 template<typename Derived>
08350 ExprResult
08351 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
08352   return SemaRef.MaybeBindToTemporary(E);
08353 }
08354 
08355 template<typename Derived>
08356 ExprResult
08357 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
08358   return SemaRef.Owned(E);
08359 }
08360 
08361 template<typename Derived>
08362 ExprResult
08363 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
08364   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
08365   if (SubExpr.isInvalid())
08366     return ExprError();
08367 
08368   if (!getDerived().AlwaysRebuild() &&
08369       SubExpr.get() == E->getSubExpr())
08370     return SemaRef.Owned(E);
08371 
08372   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
08373 }
08374 
08375 template<typename Derived>
08376 ExprResult
08377 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
08378   // Transform each of the elements.
08379   llvm::SmallVector<Expr *, 8> Elements;
08380   bool ArgChanged = false;
08381   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 
08382                                   /*IsCall=*/false, Elements, &ArgChanged))
08383     return ExprError();
08384   
08385   if (!getDerived().AlwaysRebuild() && !ArgChanged)
08386     return SemaRef.MaybeBindToTemporary(E);
08387   
08388   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
08389                                               Elements.data(),
08390                                               Elements.size());
08391 }
08392 
08393 template<typename Derived>
08394 ExprResult
08395 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
08396                                                     ObjCDictionaryLiteral *E) {  
08397   // Transform each of the elements.
08398   llvm::SmallVector<ObjCDictionaryElement, 8> Elements;
08399   bool ArgChanged = false;
08400   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
08401     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
08402     
08403     if (OrigElement.isPackExpansion()) {
08404       // This key/value element is a pack expansion.
08405       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
08406       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
08407       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
08408       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
08409 
08410       // Determine whether the set of unexpanded parameter packs can
08411       // and should be expanded.
08412       bool Expand = true;
08413       bool RetainExpansion = false;
08414       llvm::Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
08415       llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
08416       SourceRange PatternRange(OrigElement.Key->getLocStart(),
08417                                OrigElement.Value->getLocEnd());
08418      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
08419                                                PatternRange,
08420                                                Unexpanded,
08421                                                Expand, RetainExpansion,
08422                                                NumExpansions))
08423         return ExprError();
08424 
08425       if (!Expand) {
08426         // The transform has determined that we should perform a simple
08427         // transformation on the pack expansion, producing another pack 
08428         // expansion.
08429         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
08430         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
08431         if (Key.isInvalid())
08432           return ExprError();
08433 
08434         if (Key.get() != OrigElement.Key)
08435           ArgChanged = true;
08436 
08437         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
08438         if (Value.isInvalid())
08439           return ExprError();
08440         
08441         if (Value.get() != OrigElement.Value)
08442           ArgChanged = true;
08443 
08444         ObjCDictionaryElement Expansion = { 
08445           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
08446         };
08447         Elements.push_back(Expansion);
08448         continue;
08449       }
08450 
08451       // Record right away that the argument was changed.  This needs
08452       // to happen even if the array expands to nothing.
08453       ArgChanged = true;
08454       
08455       // The transform has determined that we should perform an elementwise
08456       // expansion of the pattern. Do so.
08457       for (unsigned I = 0; I != *NumExpansions; ++I) {
08458         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
08459         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
08460         if (Key.isInvalid())
08461           return ExprError();
08462 
08463         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
08464         if (Value.isInvalid())
08465           return ExprError();
08466 
08467         ObjCDictionaryElement Element = { 
08468           Key.get(), Value.get(), SourceLocation(), NumExpansions
08469         };
08470 
08471         // If any unexpanded parameter packs remain, we still have a
08472         // pack expansion.
08473         if (Key.get()->containsUnexpandedParameterPack() ||
08474             Value.get()->containsUnexpandedParameterPack())
08475           Element.EllipsisLoc = OrigElement.EllipsisLoc;
08476           
08477         Elements.push_back(Element);
08478       }
08479 
08480       // We've finished with this pack expansion.
08481       continue;
08482     }
08483 
08484     // Transform and check key.
08485     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
08486     if (Key.isInvalid())
08487       return ExprError();
08488     
08489     if (Key.get() != OrigElement.Key)
08490       ArgChanged = true;
08491     
08492     // Transform and check value.
08493     ExprResult Value
08494       = getDerived().TransformExpr(OrigElement.Value);
08495     if (Value.isInvalid())
08496       return ExprError();
08497     
08498     if (Value.get() != OrigElement.Value)
08499       ArgChanged = true;
08500     
08501     ObjCDictionaryElement Element = { 
08502       Key.get(), Value.get(), SourceLocation(), llvm::Optional<unsigned>()
08503     };
08504     Elements.push_back(Element);
08505   }
08506   
08507   if (!getDerived().AlwaysRebuild() && !ArgChanged)
08508     return SemaRef.MaybeBindToTemporary(E);
08509 
08510   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
08511                                                    Elements.data(),
08512                                                    Elements.size());
08513 }
08514 
08515 template<typename Derived>
08516 ExprResult
08517 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
08518   TypeSourceInfo *EncodedTypeInfo
08519     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
08520   if (!EncodedTypeInfo)
08521     return ExprError();
08522 
08523   if (!getDerived().AlwaysRebuild() &&
08524       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
08525     return SemaRef.Owned(E);
08526 
08527   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
08528                                             EncodedTypeInfo,
08529                                             E->getRParenLoc());
08530 }
08531 
08532 template<typename Derived>
08533 ExprResult TreeTransform<Derived>::
08534 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
08535   ExprResult result = getDerived().TransformExpr(E->getSubExpr());
08536   if (result.isInvalid()) return ExprError();
08537   Expr *subExpr = result.take();
08538 
08539   if (!getDerived().AlwaysRebuild() &&
08540       subExpr == E->getSubExpr())
08541     return SemaRef.Owned(E);
08542 
08543   return SemaRef.Owned(new(SemaRef.Context)
08544       ObjCIndirectCopyRestoreExpr(subExpr, E->getType(), E->shouldCopy()));
08545 }
08546 
08547 template<typename Derived>
08548 ExprResult TreeTransform<Derived>::
08549 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
08550   TypeSourceInfo *TSInfo 
08551     = getDerived().TransformType(E->getTypeInfoAsWritten());
08552   if (!TSInfo)
08553     return ExprError();
08554   
08555   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
08556   if (Result.isInvalid()) 
08557     return ExprError();
08558   
08559   if (!getDerived().AlwaysRebuild() &&
08560       TSInfo == E->getTypeInfoAsWritten() &&
08561       Result.get() == E->getSubExpr())
08562     return SemaRef.Owned(E);
08563   
08564   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
08565                                       E->getBridgeKeywordLoc(), TSInfo, 
08566                                       Result.get());
08567 }
08568 
08569 template<typename Derived>
08570 ExprResult
08571 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
08572   // Transform arguments.
08573   bool ArgChanged = false;
08574   ASTOwningVector<Expr*> Args(SemaRef);
08575   Args.reserve(E->getNumArgs());
08576   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 
08577                                   &ArgChanged))
08578     return ExprError();
08579   
08580   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
08581     // Class message: transform the receiver type.
08582     TypeSourceInfo *ReceiverTypeInfo
08583       = getDerived().TransformType(E->getClassReceiverTypeInfo());
08584     if (!ReceiverTypeInfo)
08585       return ExprError();
08586     
08587     // If nothing changed, just retain the existing message send.
08588     if (!getDerived().AlwaysRebuild() &&
08589         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
08590       return SemaRef.MaybeBindToTemporary(E);
08591 
08592     // Build a new class message send.
08593     SmallVector<SourceLocation, 16> SelLocs;
08594     E->getSelectorLocs(SelLocs);
08595     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
08596                                                E->getSelector(),
08597                                                SelLocs,
08598                                                E->getMethodDecl(),
08599                                                E->getLeftLoc(),
08600                                                move_arg(Args),
08601                                                E->getRightLoc());
08602   }
08603 
08604   // Instance message: transform the receiver
08605   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
08606          "Only class and instance messages may be instantiated");
08607   ExprResult Receiver
08608     = getDerived().TransformExpr(E->getInstanceReceiver());
08609   if (Receiver.isInvalid())
08610     return ExprError();
08611 
08612   // If nothing changed, just retain the existing message send.
08613   if (!getDerived().AlwaysRebuild() &&
08614       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
08615     return SemaRef.MaybeBindToTemporary(E);
08616   
08617   // Build a new instance message send.
08618   SmallVector<SourceLocation, 16> SelLocs;
08619   E->getSelectorLocs(SelLocs);
08620   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
08621                                              E->getSelector(),
08622                                              SelLocs,
08623                                              E->getMethodDecl(),
08624                                              E->getLeftLoc(),
08625                                              move_arg(Args),
08626                                              E->getRightLoc());
08627 }
08628 
08629 template<typename Derived>
08630 ExprResult
08631 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
08632   return SemaRef.Owned(E);
08633 }
08634 
08635 template<typename Derived>
08636 ExprResult
08637 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
08638   return SemaRef.Owned(E);
08639 }
08640 
08641 template<typename Derived>
08642 ExprResult
08643 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
08644   // Transform the base expression.
08645   ExprResult Base = getDerived().TransformExpr(E->getBase());
08646   if (Base.isInvalid())
08647     return ExprError();
08648 
08649   // We don't need to transform the ivar; it will never change.
08650   
08651   // If nothing changed, just retain the existing expression.
08652   if (!getDerived().AlwaysRebuild() &&
08653       Base.get() == E->getBase())
08654     return SemaRef.Owned(E);
08655   
08656   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
08657                                              E->getLocation(),
08658                                              E->isArrow(), E->isFreeIvar());
08659 }
08660 
08661 template<typename Derived>
08662 ExprResult
08663 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
08664   // 'super' and types never change. Property never changes. Just
08665   // retain the existing expression.
08666   if (!E->isObjectReceiver())
08667     return SemaRef.Owned(E);
08668   
08669   // Transform the base expression.
08670   ExprResult Base = getDerived().TransformExpr(E->getBase());
08671   if (Base.isInvalid())
08672     return ExprError();
08673   
08674   // We don't need to transform the property; it will never change.
08675   
08676   // If nothing changed, just retain the existing expression.
08677   if (!getDerived().AlwaysRebuild() &&
08678       Base.get() == E->getBase())
08679     return SemaRef.Owned(E);
08680 
08681   if (E->isExplicitProperty())
08682     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
08683                                                    E->getExplicitProperty(),
08684                                                    E->getLocation());
08685 
08686   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
08687                                                  SemaRef.Context.PseudoObjectTy,
08688                                                  E->getImplicitPropertyGetter(),
08689                                                  E->getImplicitPropertySetter(),
08690                                                  E->getLocation());
08691 }
08692 
08693 template<typename Derived>
08694 ExprResult
08695 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
08696   // Transform the base expression.
08697   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
08698   if (Base.isInvalid())
08699     return ExprError();
08700 
08701   // Transform the key expression.
08702   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
08703   if (Key.isInvalid())
08704     return ExprError();
08705 
08706   // If nothing changed, just retain the existing expression.
08707   if (!getDerived().AlwaysRebuild() &&
08708       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
08709     return SemaRef.Owned(E);
08710 
08711   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 
08712                                                   Base.get(), Key.get(),
08713                                                   E->getAtIndexMethodDecl(),
08714                                                   E->setAtIndexMethodDecl());
08715 }
08716 
08717 template<typename Derived>
08718 ExprResult
08719 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
08720   // Transform the base expression.
08721   ExprResult Base = getDerived().TransformExpr(E->getBase());
08722   if (Base.isInvalid())
08723     return ExprError();
08724   
08725   // If nothing changed, just retain the existing expression.
08726   if (!getDerived().AlwaysRebuild() &&
08727       Base.get() == E->getBase())
08728     return SemaRef.Owned(E);
08729   
08730   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
08731                                          E->isArrow());
08732 }
08733 
08734 template<typename Derived>
08735 ExprResult
08736 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
08737   bool ArgumentChanged = false;
08738   ASTOwningVector<Expr*> SubExprs(SemaRef);
08739   SubExprs.reserve(E->getNumSubExprs());
08740   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 
08741                                   SubExprs, &ArgumentChanged))
08742     return ExprError();
08743 
08744   if (!getDerived().AlwaysRebuild() &&
08745       !ArgumentChanged)
08746     return SemaRef.Owned(E);
08747 
08748   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
08749                                                move_arg(SubExprs),
08750                                                E->getRParenLoc());
08751 }
08752 
08753 template<typename Derived>
08754 ExprResult
08755 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
08756   BlockDecl *oldBlock = E->getBlockDecl();
08757   
08758   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0);
08759   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
08760 
08761   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
08762   blockScope->TheDecl->setBlockMissingReturnType(
08763                          oldBlock->blockMissingReturnType());
08764   
08765   SmallVector<ParmVarDecl*, 4> params;
08766   SmallVector<QualType, 4> paramTypes;
08767   
08768   // Parameter substitution.
08769   if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
08770                                                oldBlock->param_begin(),
08771                                                oldBlock->param_size(),
08772                                                0, paramTypes, &params)) {
08773     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0);
08774     return ExprError();
08775   }
08776 
08777   const FunctionType *exprFunctionType = E->getFunctionType();
08778   QualType exprResultType =
08779       getDerived().TransformType(exprFunctionType->getResultType());
08780 
08781   // Don't allow returning a objc interface by value.
08782   if (exprResultType->isObjCObjectType()) {
08783     getSema().Diag(E->getCaretLocation(), 
08784                    diag::err_object_cannot_be_passed_returned_by_value) 
08785       << 0 << exprResultType;
08786     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0);
08787     return ExprError();
08788   }
08789 
08790   QualType functionType = getDerived().RebuildFunctionProtoType(
08791                                                         exprResultType,
08792                                                         paramTypes.data(),
08793                                                         paramTypes.size(),
08794                                                         oldBlock->isVariadic(),
08795                                                         false, 0, RQ_None,
08796                                                exprFunctionType->getExtInfo());
08797   blockScope->FunctionType = functionType;
08798 
08799   // Set the parameters on the block decl.
08800   if (!params.empty())
08801     blockScope->TheDecl->setParams(params);
08802 
08803   if (!oldBlock->blockMissingReturnType()) {
08804     blockScope->HasImplicitReturnType = false;
08805     blockScope->ReturnType = exprResultType;
08806   }
08807   
08808   // Transform the body
08809   StmtResult body = getDerived().TransformStmt(E->getBody());
08810   if (body.isInvalid()) {
08811     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0);
08812     return ExprError();
08813   }
08814 
08815 #ifndef NDEBUG
08816   // In builds with assertions, make sure that we captured everything we
08817   // captured before.
08818   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
08819     for (BlockDecl::capture_iterator i = oldBlock->capture_begin(),
08820            e = oldBlock->capture_end(); i != e; ++i) {
08821       VarDecl *oldCapture = i->getVariable();
08822 
08823       // Ignore parameter packs.
08824       if (isa<ParmVarDecl>(oldCapture) &&
08825           cast<ParmVarDecl>(oldCapture)->isParameterPack())
08826         continue;
08827 
08828       VarDecl *newCapture =
08829         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
08830                                                  oldCapture));
08831       assert(blockScope->CaptureMap.count(newCapture));
08832     }
08833     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
08834   }
08835 #endif
08836 
08837   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
08838                                     /*Scope=*/0);
08839 }
08840 
08841 template<typename Derived>
08842 ExprResult
08843 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
08844   llvm_unreachable("Cannot transform asType expressions yet");
08845 }
08846 
08847 template<typename Derived>
08848 ExprResult
08849 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
08850   QualType RetTy = getDerived().TransformType(E->getType());
08851   bool ArgumentChanged = false;
08852   ASTOwningVector<Expr*> SubExprs(SemaRef);
08853   SubExprs.reserve(E->getNumSubExprs());
08854   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
08855                                   SubExprs, &ArgumentChanged))
08856     return ExprError();
08857 
08858   if (!getDerived().AlwaysRebuild() &&
08859       !ArgumentChanged)
08860     return SemaRef.Owned(E);
08861 
08862   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), move_arg(SubExprs),
08863                                         RetTy, E->getOp(), E->getRParenLoc());
08864 }
08865   
08866 //===----------------------------------------------------------------------===//
08867 // Type reconstruction
08868 //===----------------------------------------------------------------------===//
08869 
08870 template<typename Derived>
08871 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
08872                                                     SourceLocation Star) {
08873   return SemaRef.BuildPointerType(PointeeType, Star,
08874                                   getDerived().getBaseEntity());
08875 }
08876 
08877 template<typename Derived>
08878 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
08879                                                          SourceLocation Star) {
08880   return SemaRef.BuildBlockPointerType(PointeeType, Star,
08881                                        getDerived().getBaseEntity());
08882 }
08883 
08884 template<typename Derived>
08885 QualType
08886 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
08887                                              bool WrittenAsLValue,
08888                                              SourceLocation Sigil) {
08889   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
08890                                     Sigil, getDerived().getBaseEntity());
08891 }
08892 
08893 template<typename Derived>
08894 QualType
08895 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
08896                                                  QualType ClassType,
08897                                                  SourceLocation Sigil) {
08898   return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
08899                                         Sigil, getDerived().getBaseEntity());
08900 }
08901 
08902 template<typename Derived>
08903 QualType
08904 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
08905                                          ArrayType::ArraySizeModifier SizeMod,
08906                                          const llvm::APInt *Size,
08907                                          Expr *SizeExpr,
08908                                          unsigned IndexTypeQuals,
08909                                          SourceRange BracketsRange) {
08910   if (SizeExpr || !Size)
08911     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
08912                                   IndexTypeQuals, BracketsRange,
08913                                   getDerived().getBaseEntity());
08914 
08915   QualType Types[] = {
08916     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
08917     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
08918     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
08919   };
08920   const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
08921   QualType SizeType;
08922   for (unsigned I = 0; I != NumTypes; ++I)
08923     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
08924       SizeType = Types[I];
08925       break;
08926     }
08927 
08928   // Note that we can return a VariableArrayType here in the case where
08929   // the element type was a dependent VariableArrayType.
08930   IntegerLiteral *ArraySize
08931       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
08932                                /*FIXME*/BracketsRange.getBegin());
08933   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
08934                                 IndexTypeQuals, BracketsRange,
08935                                 getDerived().getBaseEntity());
08936 }
08937 
08938 template<typename Derived>
08939 QualType
08940 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
08941                                                  ArrayType::ArraySizeModifier SizeMod,
08942                                                  const llvm::APInt &Size,
08943                                                  unsigned IndexTypeQuals,
08944                                                  SourceRange BracketsRange) {
08945   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
08946                                         IndexTypeQuals, BracketsRange);
08947 }
08948 
08949 template<typename Derived>
08950 QualType
08951 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
08952                                           ArrayType::ArraySizeModifier SizeMod,
08953                                                  unsigned IndexTypeQuals,
08954                                                    SourceRange BracketsRange) {
08955   return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
08956                                        IndexTypeQuals, BracketsRange);
08957 }
08958 
08959 template<typename Derived>
08960 QualType
08961 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
08962                                           ArrayType::ArraySizeModifier SizeMod,
08963                                                  Expr *SizeExpr,
08964                                                  unsigned IndexTypeQuals,
08965                                                  SourceRange BracketsRange) {
08966   return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
08967                                        SizeExpr,
08968                                        IndexTypeQuals, BracketsRange);
08969 }
08970 
08971 template<typename Derived>
08972 QualType
08973 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
08974                                           ArrayType::ArraySizeModifier SizeMod,
08975                                                        Expr *SizeExpr,
08976                                                        unsigned IndexTypeQuals,
08977                                                    SourceRange BracketsRange) {
08978   return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
08979                                        SizeExpr,
08980                                        IndexTypeQuals, BracketsRange);
08981 }
08982 
08983 template<typename Derived>
08984 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
08985                                                unsigned NumElements,
08986                                                VectorType::VectorKind VecKind) {
08987   // FIXME: semantic checking!
08988   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
08989 }
08990 
08991 template<typename Derived>
08992 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
08993                                                       unsigned NumElements,
08994                                                  SourceLocation AttributeLoc) {
08995   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
08996                           NumElements, true);
08997   IntegerLiteral *VectorSize
08998     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
08999                              AttributeLoc);
09000   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
09001 }
09002 
09003 template<typename Derived>
09004 QualType
09005 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
09006                                                            Expr *SizeExpr,
09007                                                   SourceLocation AttributeLoc) {
09008   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
09009 }
09010 
09011 template<typename Derived>
09012 QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
09013                                                           QualType *ParamTypes,
09014                                                         unsigned NumParamTypes,
09015                                                           bool Variadic,
09016                                                          bool HasTrailingReturn,
09017                                                           unsigned Quals,
09018                                                   RefQualifierKind RefQualifier,
09019                                             const FunctionType::ExtInfo &Info) {
09020   return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
09021                                    HasTrailingReturn, Quals, RefQualifier,
09022                                    getDerived().getBaseLocation(),
09023                                    getDerived().getBaseEntity(),
09024                                    Info);
09025 }
09026 
09027 template<typename Derived>
09028 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
09029   return SemaRef.Context.getFunctionNoProtoType(T);
09030 }
09031 
09032 template<typename Derived>
09033 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
09034   assert(D && "no decl found");
09035   if (D->isInvalidDecl()) return QualType();
09036 
09037   // FIXME: Doesn't account for ObjCInterfaceDecl!
09038   TypeDecl *Ty;
09039   if (isa<UsingDecl>(D)) {
09040     UsingDecl *Using = cast<UsingDecl>(D);
09041     assert(Using->isTypeName() &&
09042            "UnresolvedUsingTypenameDecl transformed to non-typename using");
09043 
09044     // A valid resolved using typename decl points to exactly one type decl.
09045     assert(++Using->shadow_begin() == Using->shadow_end());
09046     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
09047     
09048   } else {
09049     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
09050            "UnresolvedUsingTypenameDecl transformed to non-using decl");
09051     Ty = cast<UnresolvedUsingTypenameDecl>(D);
09052   }
09053 
09054   return SemaRef.Context.getTypeDeclType(Ty);
09055 }
09056 
09057 template<typename Derived>
09058 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
09059                                                        SourceLocation Loc) {
09060   return SemaRef.BuildTypeofExprType(E, Loc);
09061 }
09062 
09063 template<typename Derived>
09064 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
09065   return SemaRef.Context.getTypeOfType(Underlying);
09066 }
09067 
09068 template<typename Derived>
09069 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
09070                                                      SourceLocation Loc) {
09071   return SemaRef.BuildDecltypeType(E, Loc);
09072 }
09073 
09074 template<typename Derived>
09075 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
09076                                             UnaryTransformType::UTTKind UKind,
09077                                             SourceLocation Loc) {
09078   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
09079 }
09080 
09081 template<typename Derived>
09082 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
09083                                                       TemplateName Template,
09084                                              SourceLocation TemplateNameLoc,
09085                                      TemplateArgumentListInfo &TemplateArgs) {
09086   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
09087 }
09088 
09089 template<typename Derived>
09090 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
09091                                                    SourceLocation KWLoc) {
09092   return SemaRef.BuildAtomicType(ValueType, KWLoc);
09093 }
09094 
09095 template<typename Derived>
09096 TemplateName
09097 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
09098                                             bool TemplateKW,
09099                                             TemplateDecl *Template) {
09100   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
09101                                                   Template);
09102 }
09103 
09104 template<typename Derived>
09105 TemplateName
09106 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
09107                                             const IdentifierInfo &Name,
09108                                             SourceLocation NameLoc,
09109                                             QualType ObjectType,
09110                                             NamedDecl *FirstQualifierInScope) {
09111   UnqualifiedId TemplateName;
09112   TemplateName.setIdentifier(&Name, NameLoc);
09113   Sema::TemplateTy Template;
09114   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
09115   getSema().ActOnDependentTemplateName(/*Scope=*/0,
09116                                        SS, TemplateKWLoc, TemplateName,
09117                                        ParsedType::make(ObjectType),
09118                                        /*EnteringContext=*/false,
09119                                        Template);
09120   return Template.get();
09121 }
09122 
09123 template<typename Derived>
09124 TemplateName
09125 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
09126                                             OverloadedOperatorKind Operator,
09127                                             SourceLocation NameLoc,
09128                                             QualType ObjectType) {
09129   UnqualifiedId Name;
09130   // FIXME: Bogus location information.
09131   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
09132   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
09133   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
09134   Sema::TemplateTy Template;
09135   getSema().ActOnDependentTemplateName(/*Scope=*/0,
09136                                        SS, TemplateKWLoc, Name,
09137                                        ParsedType::make(ObjectType),
09138                                        /*EnteringContext=*/false,
09139                                        Template);
09140   return Template.template getAsVal<TemplateName>();
09141 }
09142   
09143 template<typename Derived>
09144 ExprResult
09145 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
09146                                                    SourceLocation OpLoc,
09147                                                    Expr *OrigCallee,
09148                                                    Expr *First,
09149                                                    Expr *Second) {
09150   Expr *Callee = OrigCallee->IgnoreParenCasts();
09151   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
09152 
09153   // Determine whether this should be a builtin operation.
09154   if (Op == OO_Subscript) {
09155     if (!First->getType()->isOverloadableType() &&
09156         !Second->getType()->isOverloadableType())
09157       return getSema().CreateBuiltinArraySubscriptExpr(First,
09158                                                        Callee->getLocStart(),
09159                                                        Second, OpLoc);
09160   } else if (Op == OO_Arrow) {
09161     // -> is never a builtin operation.
09162     return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc);
09163   } else if (Second == 0 || isPostIncDec) {
09164     if (!First->getType()->isOverloadableType()) {
09165       // The argument is not of overloadable type, so try to create a
09166       // built-in unary operation.
09167       UnaryOperatorKind Opc
09168         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
09169 
09170       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
09171     }
09172   } else {
09173     if (!First->getType()->isOverloadableType() &&
09174         !Second->getType()->isOverloadableType()) {
09175       // Neither of the arguments is an overloadable type, so try to
09176       // create a built-in binary operation.
09177       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
09178       ExprResult Result
09179         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
09180       if (Result.isInvalid())
09181         return ExprError();
09182 
09183       return move(Result);
09184     }
09185   }
09186 
09187   // Compute the transformed set of functions (and function templates) to be
09188   // used during overload resolution.
09189   UnresolvedSet<16> Functions;
09190 
09191   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
09192     assert(ULE->requiresADL());
09193 
09194     // FIXME: Do we have to check
09195     // IsAcceptableNonMemberOperatorCandidate for each of these?
09196     Functions.append(ULE->decls_begin(), ULE->decls_end());
09197   } else {
09198     Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl());
09199   }
09200 
09201   // Add any functions found via argument-dependent lookup.
09202   Expr *Args[2] = { First, Second };
09203   unsigned NumArgs = 1 + (Second != 0);
09204 
09205   // Create the overloaded operator invocation for unary operators.
09206   if (NumArgs == 1 || isPostIncDec) {
09207     UnaryOperatorKind Opc
09208       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
09209     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
09210   }
09211 
09212   if (Op == OO_Subscript) {
09213     SourceLocation LBrace;
09214     SourceLocation RBrace;
09215 
09216     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
09217         DeclarationNameLoc &NameLoc = DRE->getNameInfo().getInfo();
09218         LBrace = SourceLocation::getFromRawEncoding(
09219                     NameLoc.CXXOperatorName.BeginOpNameLoc);
09220         RBrace = SourceLocation::getFromRawEncoding(
09221                     NameLoc.CXXOperatorName.EndOpNameLoc);
09222     } else {
09223         LBrace = Callee->getLocStart();
09224         RBrace = OpLoc;
09225     }
09226 
09227     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
09228                                                       First, Second);
09229   }
09230 
09231   // Create the overloaded operator invocation for binary operators.
09232   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
09233   ExprResult Result
09234     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
09235   if (Result.isInvalid())
09236     return ExprError();
09237 
09238   return move(Result);
09239 }
09240 
09241 template<typename Derived>
09242 ExprResult 
09243 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
09244                                                      SourceLocation OperatorLoc,
09245                                                        bool isArrow,
09246                                                        CXXScopeSpec &SS,
09247                                                      TypeSourceInfo *ScopeType,
09248                                                        SourceLocation CCLoc,
09249                                                        SourceLocation TildeLoc,
09250                                         PseudoDestructorTypeStorage Destroyed) {
09251   QualType BaseType = Base->getType();
09252   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
09253       (!isArrow && !BaseType->getAs<RecordType>()) ||
09254       (isArrow && BaseType->getAs<PointerType>() && 
09255        !BaseType->getAs<PointerType>()->getPointeeType()
09256                                               ->template getAs<RecordType>())){
09257     // This pseudo-destructor expression is still a pseudo-destructor.
09258     return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
09259                                              isArrow? tok::arrow : tok::period,
09260                                              SS, ScopeType, CCLoc, TildeLoc,
09261                                              Destroyed,
09262                                              /*FIXME?*/true);
09263   }
09264 
09265   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
09266   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
09267                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
09268   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
09269   NameInfo.setNamedTypeInfo(DestroyedType);
09270 
09271   // The scope type is now known to be a valid nested name specifier
09272   // component. Tack it on to the end of the nested name specifier.
09273   if (ScopeType)
09274     SS.Extend(SemaRef.Context, SourceLocation(),
09275               ScopeType->getTypeLoc(), CCLoc);
09276 
09277   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
09278   return getSema().BuildMemberReferenceExpr(Base, BaseType,
09279                                             OperatorLoc, isArrow,
09280                                             SS, TemplateKWLoc,
09281                                             /*FIXME: FirstQualifier*/ 0,
09282                                             NameInfo,
09283                                             /*TemplateArgs*/ 0);
09284 }
09285 
09286 } // end namespace clang
09287 
09288 #endif // LLVM_CLANG_SEMA_TREETRANSFORM_H