• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements a semantic tree transformation that takes a given
10 //  AST and rebuilds it, possibly transforming some nodes in the process.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
15 #define LLVM_CLANG_SEMA_TREETRANSFORM_H
16 
17 #include "clang/Sema/SemaInternal.h"
18 #include "clang/Sema/Lookup.h"
19 #include "clang/Sema/ParsedTemplate.h"
20 #include "clang/Sema/SemaDiagnostic.h"
21 #include "clang/Sema/ScopeInfo.h"
22 #include "clang/AST/Decl.h"
23 #include "clang/AST/DeclObjC.h"
24 #include "clang/AST/DeclTemplate.h"
25 #include "clang/AST/Expr.h"
26 #include "clang/AST/ExprCXX.h"
27 #include "clang/AST/ExprObjC.h"
28 #include "clang/AST/Stmt.h"
29 #include "clang/AST/StmtCXX.h"
30 #include "clang/AST/StmtObjC.h"
31 #include "clang/Sema/Ownership.h"
32 #include "clang/Sema/Designator.h"
33 #include "clang/Lex/Preprocessor.h"
34 #include "llvm/Support/ErrorHandling.h"
35 #include "TypeLocBuilder.h"
36 #include <algorithm>
37 
38 namespace clang {
39 using namespace sema;
40 
41 /// \brief A semantic tree transformation that allows one to transform one
42 /// abstract syntax tree into another.
43 ///
44 /// A new tree transformation is defined by creating a new subclass \c X of
45 /// \c TreeTransform<X> and then overriding certain operations to provide
46 /// behavior specific to that transformation. For example, template
47 /// instantiation is implemented as a tree transformation where the
48 /// transformation of TemplateTypeParmType nodes involves substituting the
49 /// template arguments for their corresponding template parameters; a similar
50 /// transformation is performed for non-type template parameters and
51 /// template template parameters.
52 ///
53 /// This tree-transformation template uses static polymorphism to allow
54 /// subclasses to customize any of its operations. Thus, a subclass can
55 /// override any of the transformation or rebuild operators by providing an
56 /// operation with the same signature as the default implementation. The
57 /// overridding function should not be virtual.
58 ///
59 /// Semantic tree transformations are split into two stages, either of which
60 /// can be replaced by a subclass. The "transform" step transforms an AST node
61 /// or the parts of an AST node using the various transformation functions,
62 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
63 /// node of the appropriate kind from the pieces. The default transformation
64 /// routines recursively transform the operands to composite AST nodes (e.g.,
65 /// the pointee type of a PointerType node) and, if any of those operand nodes
66 /// were changed by the transformation, invokes the rebuild operation to create
67 /// a new AST node.
68 ///
69 /// Subclasses can customize the transformation at various levels. The
70 /// most coarse-grained transformations involve replacing TransformType(),
71 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
72 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
73 /// new implementations.
74 ///
75 /// For more fine-grained transformations, subclasses can replace any of the
76 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
77 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
78 /// replacing TransformTemplateTypeParmType() allows template instantiation
79 /// to substitute template arguments for their corresponding template
80 /// parameters. Additionally, subclasses can override the \c RebuildXXX
81 /// functions to control how AST nodes are rebuilt when their operands change.
82 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
83 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
84 /// be able to use more efficient rebuild steps.
85 ///
86 /// There are a handful of other functions that can be overridden, allowing one
87 /// to avoid traversing nodes that don't need any transformation
88 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
89 /// operands have not changed (\c AlwaysRebuild()), and customize the
90 /// default locations and entity names used for type-checking
91 /// (\c getBaseLocation(), \c getBaseEntity()).
92 template<typename Derived>
93 class TreeTransform {
94   /// \brief Private RAII object that helps us forget and then re-remember
95   /// the template argument corresponding to a partially-substituted parameter
96   /// pack.
97   class ForgetPartiallySubstitutedPackRAII {
98     Derived &Self;
99     TemplateArgument Old;
100 
101   public:
ForgetPartiallySubstitutedPackRAII(Derived & Self)102     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
103       Old = Self.ForgetPartiallySubstitutedPack();
104     }
105 
~ForgetPartiallySubstitutedPackRAII()106     ~ForgetPartiallySubstitutedPackRAII() {
107       Self.RememberPartiallySubstitutedPack(Old);
108     }
109   };
110 
111 protected:
112   Sema &SemaRef;
113 
114 public:
115   /// \brief Initializes a new tree transformer.
TreeTransform(Sema & SemaRef)116   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
117 
118   /// \brief Retrieves a reference to the derived class.
getDerived()119   Derived &getDerived() { return static_cast<Derived&>(*this); }
120 
121   /// \brief Retrieves a reference to the derived class.
getDerived()122   const Derived &getDerived() const {
123     return static_cast<const Derived&>(*this);
124   }
125 
Owned(Expr * E)126   static inline ExprResult Owned(Expr *E) { return E; }
Owned(Stmt * S)127   static inline StmtResult Owned(Stmt *S) { return S; }
128 
129   /// \brief Retrieves a reference to the semantic analysis object used for
130   /// this tree transform.
getSema()131   Sema &getSema() const { return SemaRef; }
132 
133   /// \brief Whether the transformation should always rebuild AST nodes, even
134   /// if none of the children have changed.
135   ///
136   /// Subclasses may override this function to specify when the transformation
137   /// should rebuild all AST nodes.
AlwaysRebuild()138   bool AlwaysRebuild() { return false; }
139 
140   /// \brief Returns the location of the entity being transformed, if that
141   /// information was not available elsewhere in the AST.
142   ///
143   /// By default, returns no source-location information. Subclasses can
144   /// provide an alternative implementation that provides better location
145   /// information.
getBaseLocation()146   SourceLocation getBaseLocation() { return SourceLocation(); }
147 
148   /// \brief Returns the name of the entity being transformed, if that
149   /// information was not available elsewhere in the AST.
150   ///
151   /// By default, returns an empty name. Subclasses can provide an alternative
152   /// implementation with a more precise name.
getBaseEntity()153   DeclarationName getBaseEntity() { return DeclarationName(); }
154 
155   /// \brief Sets the "base" location and entity when that
156   /// information is known based on another transformation.
157   ///
158   /// By default, the source location and entity are ignored. Subclasses can
159   /// override this function to provide a customized implementation.
setBase(SourceLocation Loc,DeclarationName Entity)160   void setBase(SourceLocation Loc, DeclarationName Entity) { }
161 
162   /// \brief RAII object that temporarily sets the base location and entity
163   /// used for reporting diagnostics in types.
164   class TemporaryBase {
165     TreeTransform &Self;
166     SourceLocation OldLocation;
167     DeclarationName OldEntity;
168 
169   public:
TemporaryBase(TreeTransform & Self,SourceLocation Location,DeclarationName Entity)170     TemporaryBase(TreeTransform &Self, SourceLocation Location,
171                   DeclarationName Entity) : Self(Self) {
172       OldLocation = Self.getDerived().getBaseLocation();
173       OldEntity = Self.getDerived().getBaseEntity();
174 
175       if (Location.isValid())
176         Self.getDerived().setBase(Location, Entity);
177     }
178 
~TemporaryBase()179     ~TemporaryBase() {
180       Self.getDerived().setBase(OldLocation, OldEntity);
181     }
182   };
183 
184   /// \brief Determine whether the given type \p T has already been
185   /// transformed.
186   ///
187   /// Subclasses can provide an alternative implementation of this routine
188   /// to short-circuit evaluation when it is known that a given type will
189   /// not change. For example, template instantiation need not traverse
190   /// non-dependent types.
AlreadyTransformed(QualType T)191   bool AlreadyTransformed(QualType T) {
192     return T.isNull();
193   }
194 
195   /// \brief Determine whether the given call argument should be dropped, e.g.,
196   /// because it is a default argument.
197   ///
198   /// Subclasses can provide an alternative implementation of this routine to
199   /// determine which kinds of call arguments get dropped. By default,
200   /// CXXDefaultArgument nodes are dropped (prior to transformation).
DropCallArgument(Expr * E)201   bool DropCallArgument(Expr *E) {
202     return E->isDefaultArgument();
203   }
204 
205   /// \brief Determine whether we should expand a pack expansion with the
206   /// given set of parameter packs into separate arguments by repeatedly
207   /// transforming the pattern.
208   ///
209   /// By default, the transformer never tries to expand pack expansions.
210   /// Subclasses can override this routine to provide different behavior.
211   ///
212   /// \param EllipsisLoc The location of the ellipsis that identifies the
213   /// pack expansion.
214   ///
215   /// \param PatternRange The source range that covers the entire pattern of
216   /// the pack expansion.
217   ///
218   /// \param Unexpanded The set of unexpanded parameter packs within the
219   /// pattern.
220   ///
221   /// \param NumUnexpanded The number of unexpanded parameter packs in
222   /// \p Unexpanded.
223   ///
224   /// \param ShouldExpand Will be set to \c true if the transformer should
225   /// expand the corresponding pack expansions into separate arguments. When
226   /// set, \c NumExpansions must also be set.
227   ///
228   /// \param RetainExpansion Whether the caller should add an unexpanded
229   /// pack expansion after all of the expanded arguments. This is used
230   /// when extending explicitly-specified template argument packs per
231   /// C++0x [temp.arg.explicit]p9.
232   ///
233   /// \param NumExpansions The number of separate arguments that will be in
234   /// the expanded form of the corresponding pack expansion. This is both an
235   /// input and an output parameter, which can be set by the caller if the
236   /// number of expansions is known a priori (e.g., due to a prior substitution)
237   /// and will be set by the callee when the number of expansions is known.
238   /// The callee must set this value when \c ShouldExpand is \c true; it may
239   /// set this value in other cases.
240   ///
241   /// \returns true if an error occurred (e.g., because the parameter packs
242   /// are to be instantiated with arguments of different lengths), false
243   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
244   /// must be set.
TryExpandParameterPacks(SourceLocation EllipsisLoc,SourceRange PatternRange,const UnexpandedParameterPack * Unexpanded,unsigned NumUnexpanded,bool & ShouldExpand,bool & RetainExpansion,llvm::Optional<unsigned> & NumExpansions)245   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
246                                SourceRange PatternRange,
247                                const UnexpandedParameterPack *Unexpanded,
248                                unsigned NumUnexpanded,
249                                bool &ShouldExpand,
250                                bool &RetainExpansion,
251                                llvm::Optional<unsigned> &NumExpansions) {
252     ShouldExpand = false;
253     return false;
254   }
255 
256   /// \brief "Forget" about the partially-substituted pack template argument,
257   /// when performing an instantiation that must preserve the parameter pack
258   /// use.
259   ///
260   /// This routine is meant to be overridden by the template instantiator.
ForgetPartiallySubstitutedPack()261   TemplateArgument ForgetPartiallySubstitutedPack() {
262     return TemplateArgument();
263   }
264 
265   /// \brief "Remember" the partially-substituted pack template argument
266   /// after performing an instantiation that must preserve the parameter pack
267   /// use.
268   ///
269   /// This routine is meant to be overridden by the template instantiator.
RememberPartiallySubstitutedPack(TemplateArgument Arg)270   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
271 
272   /// \brief Note to the derived class when a function parameter pack is
273   /// being expanded.
ExpandingFunctionParameterPack(ParmVarDecl * Pack)274   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
275 
276   /// \brief Transforms the given type into another type.
277   ///
278   /// By default, this routine transforms a type by creating a
279   /// TypeSourceInfo for it and delegating to the appropriate
280   /// function.  This is expensive, but we don't mind, because
281   /// this method is deprecated anyway;  all users should be
282   /// switched to storing TypeSourceInfos.
283   ///
284   /// \returns the transformed type.
285   QualType TransformType(QualType T);
286 
287   /// \brief Transforms the given type-with-location into a new
288   /// type-with-location.
289   ///
290   /// By default, this routine transforms a type by delegating to the
291   /// appropriate TransformXXXType to build a new type.  Subclasses
292   /// may override this function (to take over all type
293   /// transformations) or some set of the TransformXXXType functions
294   /// to alter the transformation.
295   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
296 
297   /// \brief Transform the given type-with-location into a new
298   /// type, collecting location information in the given builder
299   /// as necessary.
300   ///
301   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
302 
303   /// \brief Transform the given statement.
304   ///
305   /// By default, this routine transforms a statement by delegating to the
306   /// appropriate TransformXXXStmt function to transform a specific kind of
307   /// statement or the TransformExpr() function to transform an expression.
308   /// Subclasses may override this function to transform statements using some
309   /// other mechanism.
310   ///
311   /// \returns the transformed statement.
312   StmtResult TransformStmt(Stmt *S);
313 
314   /// \brief Transform the given expression.
315   ///
316   /// By default, this routine transforms an expression by delegating to the
317   /// appropriate TransformXXXExpr function to build a new expression.
318   /// Subclasses may override this function to transform expressions using some
319   /// other mechanism.
320   ///
321   /// \returns the transformed expression.
322   ExprResult TransformExpr(Expr *E);
323 
324   /// \brief Transform the given list of expressions.
325   ///
326   /// This routine transforms a list of expressions by invoking
327   /// \c TransformExpr() for each subexpression. However, it also provides
328   /// support for variadic templates by expanding any pack expansions (if the
329   /// derived class permits such expansion) along the way. When pack expansions
330   /// are present, the number of outputs may not equal the number of inputs.
331   ///
332   /// \param Inputs The set of expressions to be transformed.
333   ///
334   /// \param NumInputs The number of expressions in \c Inputs.
335   ///
336   /// \param IsCall If \c true, then this transform is being performed on
337   /// function-call arguments, and any arguments that should be dropped, will
338   /// be.
339   ///
340   /// \param Outputs The transformed input expressions will be added to this
341   /// vector.
342   ///
343   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
344   /// due to transformation.
345   ///
346   /// \returns true if an error occurred, false otherwise.
347   bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall,
348                       llvm::SmallVectorImpl<Expr *> &Outputs,
349                       bool *ArgChanged = 0);
350 
351   /// \brief Transform the given declaration, which is referenced from a type
352   /// or expression.
353   ///
354   /// By default, acts as the identity function on declarations. Subclasses
355   /// may override this function to provide alternate behavior.
TransformDecl(SourceLocation Loc,Decl * D)356   Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
357 
358   /// \brief Transform the definition of the given declaration.
359   ///
360   /// By default, invokes TransformDecl() to transform the declaration.
361   /// Subclasses may override this function to provide alternate behavior.
TransformDefinition(SourceLocation Loc,Decl * D)362   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
363     return getDerived().TransformDecl(Loc, D);
364   }
365 
366   /// \brief Transform the given declaration, which was the first part of a
367   /// nested-name-specifier in a member access expression.
368   ///
369   /// This specific declaration transformation only applies to the first
370   /// identifier in a nested-name-specifier of a member access expression, e.g.,
371   /// the \c T in \c x->T::member
372   ///
373   /// By default, invokes TransformDecl() to transform the declaration.
374   /// Subclasses may override this function to provide alternate behavior.
TransformFirstQualifierInScope(NamedDecl * D,SourceLocation Loc)375   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
376     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
377   }
378 
379   /// \brief Transform the given nested-name-specifier with source-location
380   /// information.
381   ///
382   /// By default, transforms all of the types and declarations within the
383   /// nested-name-specifier. Subclasses may override this function to provide
384   /// alternate behavior.
385   NestedNameSpecifierLoc TransformNestedNameSpecifierLoc(
386                                                     NestedNameSpecifierLoc NNS,
387                                           QualType ObjectType = QualType(),
388                                           NamedDecl *FirstQualifierInScope = 0);
389 
390   /// \brief Transform the given declaration name.
391   ///
392   /// By default, transforms the types of conversion function, constructor,
393   /// and destructor names and then (if needed) rebuilds the declaration name.
394   /// Identifiers and selectors are returned unmodified. Sublcasses may
395   /// override this function to provide alternate behavior.
396   DeclarationNameInfo
397   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
398 
399   /// \brief Transform the given template name.
400   ///
401   /// \param SS The nested-name-specifier that qualifies the template
402   /// name. This nested-name-specifier must already have been transformed.
403   ///
404   /// \param Name The template name to transform.
405   ///
406   /// \param NameLoc The source location of the template name.
407   ///
408   /// \param ObjectType If we're translating a template name within a member
409   /// access expression, this is the type of the object whose member template
410   /// is being referenced.
411   ///
412   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
413   /// also refers to a name within the current (lexical) scope, this is the
414   /// declaration it refers to.
415   ///
416   /// By default, transforms the template name by transforming the declarations
417   /// and nested-name-specifiers that occur within the template name.
418   /// Subclasses may override this function to provide alternate behavior.
419   TemplateName TransformTemplateName(CXXScopeSpec &SS,
420                                      TemplateName Name,
421                                      SourceLocation NameLoc,
422                                      QualType ObjectType = QualType(),
423                                      NamedDecl *FirstQualifierInScope = 0);
424 
425   /// \brief Transform the given template argument.
426   ///
427   /// By default, this operation transforms the type, expression, or
428   /// declaration stored within the template argument and constructs a
429   /// new template argument from the transformed result. Subclasses may
430   /// override this function to provide alternate behavior.
431   ///
432   /// Returns true if there was an error.
433   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
434                                  TemplateArgumentLoc &Output);
435 
436   /// \brief Transform the given set of template arguments.
437   ///
438   /// By default, this operation transforms all of the template arguments
439   /// in the input set using \c TransformTemplateArgument(), and appends
440   /// the transformed arguments to the output list.
441   ///
442   /// Note that this overload of \c TransformTemplateArguments() is merely
443   /// a convenience function. Subclasses that wish to override this behavior
444   /// should override the iterator-based member template version.
445   ///
446   /// \param Inputs The set of template arguments to be transformed.
447   ///
448   /// \param NumInputs The number of template arguments in \p Inputs.
449   ///
450   /// \param Outputs The set of transformed template arguments output by this
451   /// routine.
452   ///
453   /// Returns true if an error occurred.
TransformTemplateArguments(const TemplateArgumentLoc * Inputs,unsigned NumInputs,TemplateArgumentListInfo & Outputs)454   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
455                                   unsigned NumInputs,
456                                   TemplateArgumentListInfo &Outputs) {
457     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
458   }
459 
460   /// \brief Transform the given set of template arguments.
461   ///
462   /// By default, this operation transforms all of the template arguments
463   /// in the input set using \c TransformTemplateArgument(), and appends
464   /// the transformed arguments to the output list.
465   ///
466   /// \param First An iterator to the first template argument.
467   ///
468   /// \param Last An iterator one step past the last template argument.
469   ///
470   /// \param Outputs The set of transformed template arguments output by this
471   /// routine.
472   ///
473   /// Returns true if an error occurred.
474   template<typename InputIterator>
475   bool TransformTemplateArguments(InputIterator First,
476                                   InputIterator Last,
477                                   TemplateArgumentListInfo &Outputs);
478 
479   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
480   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
481                                  TemplateArgumentLoc &ArgLoc);
482 
483   /// \brief Fakes up a TypeSourceInfo for a type.
InventTypeSourceInfo(QualType T)484   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
485     return SemaRef.Context.getTrivialTypeSourceInfo(T,
486                        getDerived().getBaseLocation());
487   }
488 
489 #define ABSTRACT_TYPELOC(CLASS, PARENT)
490 #define TYPELOC(CLASS, PARENT)                                   \
491   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
492 #include "clang/AST/TypeLocNodes.def"
493 
494   StmtResult
495   TransformSEHHandler(Stmt *Handler);
496 
497   QualType
498   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
499                                       TemplateSpecializationTypeLoc TL,
500                                       TemplateName Template);
501 
502   QualType
503   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
504                                       DependentTemplateSpecializationTypeLoc TL,
505                                                TemplateName Template,
506                                                CXXScopeSpec &SS);
507 
508   QualType
509   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
510                                                DependentTemplateSpecializationTypeLoc TL,
511                                          NestedNameSpecifierLoc QualifierLoc);
512 
513   /// \brief Transforms the parameters of a function type into the
514   /// given vectors.
515   ///
516   /// The result vectors should be kept in sync; null entries in the
517   /// variables vector are acceptable.
518   ///
519   /// Return true on error.
520   bool TransformFunctionTypeParams(SourceLocation Loc,
521                                    ParmVarDecl **Params, unsigned NumParams,
522                                    const QualType *ParamTypes,
523                                    llvm::SmallVectorImpl<QualType> &PTypes,
524                                    llvm::SmallVectorImpl<ParmVarDecl*> *PVars);
525 
526   /// \brief Transforms a single function-type parameter.  Return null
527   /// on error.
528   ///
529   /// \param indexAdjustment - A number to add to the parameter's
530   ///   scope index;  can be negative
531   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
532                                           int indexAdjustment,
533                                         llvm::Optional<unsigned> NumExpansions);
534 
535   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
536 
537   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
538   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
539 
540 #define STMT(Node, Parent)                        \
541   StmtResult Transform##Node(Node *S);
542 #define EXPR(Node, Parent)                        \
543   ExprResult Transform##Node(Node *E);
544 #define ABSTRACT_STMT(Stmt)
545 #include "clang/AST/StmtNodes.inc"
546 
547   /// \brief Build a new pointer type given its pointee type.
548   ///
549   /// By default, performs semantic analysis when building the pointer type.
550   /// Subclasses may override this routine to provide different behavior.
551   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
552 
553   /// \brief Build a new block pointer type given its pointee type.
554   ///
555   /// By default, performs semantic analysis when building the block pointer
556   /// type. Subclasses may override this routine to provide different behavior.
557   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
558 
559   /// \brief Build a new reference type given the type it references.
560   ///
561   /// By default, performs semantic analysis when building the
562   /// reference type. Subclasses may override this routine to provide
563   /// different behavior.
564   ///
565   /// \param LValue whether the type was written with an lvalue sigil
566   /// or an rvalue sigil.
567   QualType RebuildReferenceType(QualType ReferentType,
568                                 bool LValue,
569                                 SourceLocation Sigil);
570 
571   /// \brief Build a new member pointer type given the pointee type and the
572   /// class type it refers into.
573   ///
574   /// By default, performs semantic analysis when building the member pointer
575   /// type. Subclasses may override this routine to provide different behavior.
576   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
577                                     SourceLocation Sigil);
578 
579   /// \brief Build a new array type given the element type, size
580   /// modifier, size of the array (if known), size expression, and index type
581   /// qualifiers.
582   ///
583   /// By default, performs semantic analysis when building the array type.
584   /// Subclasses may override this routine to provide different behavior.
585   /// Also by default, all of the other Rebuild*Array
586   QualType RebuildArrayType(QualType ElementType,
587                             ArrayType::ArraySizeModifier SizeMod,
588                             const llvm::APInt *Size,
589                             Expr *SizeExpr,
590                             unsigned IndexTypeQuals,
591                             SourceRange BracketsRange);
592 
593   /// \brief Build a new constant array type given the element type, size
594   /// modifier, (known) size of the array, and index type qualifiers.
595   ///
596   /// By default, performs semantic analysis when building the array type.
597   /// Subclasses may override this routine to provide different behavior.
598   QualType RebuildConstantArrayType(QualType ElementType,
599                                     ArrayType::ArraySizeModifier SizeMod,
600                                     const llvm::APInt &Size,
601                                     unsigned IndexTypeQuals,
602                                     SourceRange BracketsRange);
603 
604   /// \brief Build a new incomplete array type given the element type, size
605   /// modifier, and index type qualifiers.
606   ///
607   /// By default, performs semantic analysis when building the array type.
608   /// Subclasses may override this routine to provide different behavior.
609   QualType RebuildIncompleteArrayType(QualType ElementType,
610                                       ArrayType::ArraySizeModifier SizeMod,
611                                       unsigned IndexTypeQuals,
612                                       SourceRange BracketsRange);
613 
614   /// \brief Build a new variable-length array type given the element type,
615   /// size modifier, size expression, and index type qualifiers.
616   ///
617   /// By default, performs semantic analysis when building the array type.
618   /// Subclasses may override this routine to provide different behavior.
619   QualType RebuildVariableArrayType(QualType ElementType,
620                                     ArrayType::ArraySizeModifier SizeMod,
621                                     Expr *SizeExpr,
622                                     unsigned IndexTypeQuals,
623                                     SourceRange BracketsRange);
624 
625   /// \brief Build a new dependent-sized array type given the element type,
626   /// size modifier, size expression, and index type qualifiers.
627   ///
628   /// By default, performs semantic analysis when building the array type.
629   /// Subclasses may override this routine to provide different behavior.
630   QualType RebuildDependentSizedArrayType(QualType ElementType,
631                                           ArrayType::ArraySizeModifier SizeMod,
632                                           Expr *SizeExpr,
633                                           unsigned IndexTypeQuals,
634                                           SourceRange BracketsRange);
635 
636   /// \brief Build a new vector type given the element type and
637   /// number of elements.
638   ///
639   /// By default, performs semantic analysis when building the vector type.
640   /// Subclasses may override this routine to provide different behavior.
641   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
642                              VectorType::VectorKind VecKind);
643 
644   /// \brief Build a new extended vector type given the element type and
645   /// number of elements.
646   ///
647   /// By default, performs semantic analysis when building the vector type.
648   /// Subclasses may override this routine to provide different behavior.
649   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
650                                 SourceLocation AttributeLoc);
651 
652   /// \brief Build a new potentially dependently-sized extended vector type
653   /// given the element type and number of elements.
654   ///
655   /// By default, performs semantic analysis when building the vector type.
656   /// Subclasses may override this routine to provide different behavior.
657   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
658                                               Expr *SizeExpr,
659                                               SourceLocation AttributeLoc);
660 
661   /// \brief Build a new function type.
662   ///
663   /// By default, performs semantic analysis when building the function type.
664   /// Subclasses may override this routine to provide different behavior.
665   QualType RebuildFunctionProtoType(QualType T,
666                                     QualType *ParamTypes,
667                                     unsigned NumParamTypes,
668                                     bool Variadic, unsigned Quals,
669                                     RefQualifierKind RefQualifier,
670                                     const FunctionType::ExtInfo &Info);
671 
672   /// \brief Build a new unprototyped function type.
673   QualType RebuildFunctionNoProtoType(QualType ResultType);
674 
675   /// \brief Rebuild an unresolved typename type, given the decl that
676   /// the UnresolvedUsingTypenameDecl was transformed to.
677   QualType RebuildUnresolvedUsingType(Decl *D);
678 
679   /// \brief Build a new typedef type.
RebuildTypedefType(TypedefNameDecl * Typedef)680   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
681     return SemaRef.Context.getTypeDeclType(Typedef);
682   }
683 
684   /// \brief Build a new class/struct/union type.
RebuildRecordType(RecordDecl * Record)685   QualType RebuildRecordType(RecordDecl *Record) {
686     return SemaRef.Context.getTypeDeclType(Record);
687   }
688 
689   /// \brief Build a new Enum type.
RebuildEnumType(EnumDecl * Enum)690   QualType RebuildEnumType(EnumDecl *Enum) {
691     return SemaRef.Context.getTypeDeclType(Enum);
692   }
693 
694   /// \brief Build a new typeof(expr) type.
695   ///
696   /// By default, performs semantic analysis when building the typeof type.
697   /// Subclasses may override this routine to provide different behavior.
698   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
699 
700   /// \brief Build a new typeof(type) type.
701   ///
702   /// By default, builds a new TypeOfType with the given underlying type.
703   QualType RebuildTypeOfType(QualType Underlying);
704 
705   /// \brief Build a new unary transform type.
706   QualType RebuildUnaryTransformType(QualType BaseType,
707                                      UnaryTransformType::UTTKind UKind,
708                                      SourceLocation Loc);
709 
710   /// \brief Build a new C++0x decltype type.
711   ///
712   /// By default, performs semantic analysis when building the decltype type.
713   /// Subclasses may override this routine to provide different behavior.
714   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
715 
716   /// \brief Build a new C++0x auto type.
717   ///
718   /// By default, builds a new AutoType with the given deduced type.
RebuildAutoType(QualType Deduced)719   QualType RebuildAutoType(QualType Deduced) {
720     return SemaRef.Context.getAutoType(Deduced);
721   }
722 
723   /// \brief Build a new template specialization type.
724   ///
725   /// By default, performs semantic analysis when building the template
726   /// specialization type. Subclasses may override this routine to provide
727   /// different behavior.
728   QualType RebuildTemplateSpecializationType(TemplateName Template,
729                                              SourceLocation TemplateLoc,
730                                              TemplateArgumentListInfo &Args);
731 
732   /// \brief Build a new parenthesized type.
733   ///
734   /// By default, builds a new ParenType type from the inner type.
735   /// Subclasses may override this routine to provide different behavior.
RebuildParenType(QualType InnerType)736   QualType RebuildParenType(QualType InnerType) {
737     return SemaRef.Context.getParenType(InnerType);
738   }
739 
740   /// \brief Build a new qualified name type.
741   ///
742   /// By default, builds a new ElaboratedType type from the keyword,
743   /// the nested-name-specifier and the named type.
744   /// Subclasses may override this routine to provide different behavior.
RebuildElaboratedType(SourceLocation KeywordLoc,ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,QualType Named)745   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
746                                  ElaboratedTypeKeyword Keyword,
747                                  NestedNameSpecifierLoc QualifierLoc,
748                                  QualType Named) {
749     return SemaRef.Context.getElaboratedType(Keyword,
750                                          QualifierLoc.getNestedNameSpecifier(),
751                                              Named);
752   }
753 
754   /// \brief Build a new typename type that refers to a template-id.
755   ///
756   /// By default, builds a new DependentNameType type from the
757   /// nested-name-specifier and the given type. Subclasses may override
758   /// this routine to provide different behavior.
RebuildDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Name,SourceLocation NameLoc,TemplateArgumentListInfo & Args)759   QualType RebuildDependentTemplateSpecializationType(
760                                           ElaboratedTypeKeyword Keyword,
761                                           NestedNameSpecifierLoc QualifierLoc,
762                                           const IdentifierInfo *Name,
763                                           SourceLocation NameLoc,
764                                           TemplateArgumentListInfo &Args) {
765     // Rebuild the template name.
766     // TODO: avoid TemplateName abstraction
767     CXXScopeSpec SS;
768     SS.Adopt(QualifierLoc);
769     TemplateName InstName
770       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0);
771 
772     if (InstName.isNull())
773       return QualType();
774 
775     // If it's still dependent, make a dependent specialization.
776     if (InstName.getAsDependentTemplateName())
777       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
778                                           QualifierLoc.getNestedNameSpecifier(),
779                                                                     Name,
780                                                                     Args);
781 
782     // Otherwise, make an elaborated type wrapping a non-dependent
783     // specialization.
784     QualType T =
785     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
786     if (T.isNull()) return QualType();
787 
788     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0)
789       return T;
790 
791     return SemaRef.Context.getElaboratedType(Keyword,
792                                        QualifierLoc.getNestedNameSpecifier(),
793                                              T);
794   }
795 
796   /// \brief Build a new typename type that refers to an identifier.
797   ///
798   /// By default, performs semantic analysis when building the typename type
799   /// (or elaborated type). Subclasses may override this routine to provide
800   /// different behavior.
RebuildDependentNameType(ElaboratedTypeKeyword Keyword,SourceLocation KeywordLoc,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Id,SourceLocation IdLoc)801   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
802                                     SourceLocation KeywordLoc,
803                                     NestedNameSpecifierLoc QualifierLoc,
804                                     const IdentifierInfo *Id,
805                                     SourceLocation IdLoc) {
806     CXXScopeSpec SS;
807     SS.Adopt(QualifierLoc);
808 
809     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
810       // If the name is still dependent, just build a new dependent name type.
811       if (!SemaRef.computeDeclContext(SS))
812         return SemaRef.Context.getDependentNameType(Keyword,
813                                           QualifierLoc.getNestedNameSpecifier(),
814                                                     Id);
815     }
816 
817     if (Keyword == ETK_None || Keyword == ETK_Typename)
818       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
819                                        *Id, IdLoc);
820 
821     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
822 
823     // We had a dependent elaborated-type-specifier that has been transformed
824     // into a non-dependent elaborated-type-specifier. Find the tag we're
825     // referring to.
826     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
827     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
828     if (!DC)
829       return QualType();
830 
831     if (SemaRef.RequireCompleteDeclContext(SS, DC))
832       return QualType();
833 
834     TagDecl *Tag = 0;
835     SemaRef.LookupQualifiedName(Result, DC);
836     switch (Result.getResultKind()) {
837       case LookupResult::NotFound:
838       case LookupResult::NotFoundInCurrentInstantiation:
839         break;
840 
841       case LookupResult::Found:
842         Tag = Result.getAsSingle<TagDecl>();
843         break;
844 
845       case LookupResult::FoundOverloaded:
846       case LookupResult::FoundUnresolvedValue:
847         llvm_unreachable("Tag lookup cannot find non-tags");
848         return QualType();
849 
850       case LookupResult::Ambiguous:
851         // Let the LookupResult structure handle ambiguities.
852         return QualType();
853     }
854 
855     if (!Tag) {
856       // Check where the name exists but isn't a tag type and use that to emit
857       // better diagnostics.
858       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
859       SemaRef.LookupQualifiedName(Result, DC);
860       switch (Result.getResultKind()) {
861         case LookupResult::Found:
862         case LookupResult::FoundOverloaded:
863         case LookupResult::FoundUnresolvedValue: {
864           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
865           unsigned Kind = 0;
866           if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
867           else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2;
868           else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3;
869           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
870           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
871           break;
872         }
873         default:
874           // FIXME: Would be nice to highlight just the source range.
875           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
876             << Kind << Id << DC;
877           break;
878       }
879       return QualType();
880     }
881 
882     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
883                                               IdLoc, *Id)) {
884       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
885       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
886       return QualType();
887     }
888 
889     // Build the elaborated-type-specifier type.
890     QualType T = SemaRef.Context.getTypeDeclType(Tag);
891     return SemaRef.Context.getElaboratedType(Keyword,
892                                          QualifierLoc.getNestedNameSpecifier(),
893                                              T);
894   }
895 
896   /// \brief Build a new pack expansion type.
897   ///
898   /// By default, builds a new PackExpansionType type from the given pattern.
899   /// Subclasses may override this routine to provide different behavior.
RebuildPackExpansionType(QualType Pattern,SourceRange PatternRange,SourceLocation EllipsisLoc,llvm::Optional<unsigned> NumExpansions)900   QualType RebuildPackExpansionType(QualType Pattern,
901                                     SourceRange PatternRange,
902                                     SourceLocation EllipsisLoc,
903                                     llvm::Optional<unsigned> NumExpansions) {
904     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
905                                         NumExpansions);
906   }
907 
908   /// \brief Build a new template name given a nested name specifier, a flag
909   /// indicating whether the "template" keyword was provided, and the template
910   /// that the template name refers to.
911   ///
912   /// By default, builds the new template name directly. Subclasses may override
913   /// this routine to provide different behavior.
914   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
915                                    bool TemplateKW,
916                                    TemplateDecl *Template);
917 
918   /// \brief Build a new template name given a nested name specifier and the
919   /// name that is referred to as a template.
920   ///
921   /// By default, performs semantic analysis to determine whether the name can
922   /// be resolved to a specific template, then builds the appropriate kind of
923   /// template name. Subclasses may override this routine to provide different
924   /// behavior.
925   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
926                                    const IdentifierInfo &Name,
927                                    SourceLocation NameLoc,
928                                    QualType ObjectType,
929                                    NamedDecl *FirstQualifierInScope);
930 
931   /// \brief Build a new template name given a nested name specifier and the
932   /// overloaded operator name that is referred to as a template.
933   ///
934   /// By default, performs semantic analysis to determine whether the name can
935   /// be resolved to a specific template, then builds the appropriate kind of
936   /// template name. Subclasses may override this routine to provide different
937   /// behavior.
938   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
939                                    OverloadedOperatorKind Operator,
940                                    SourceLocation NameLoc,
941                                    QualType ObjectType);
942 
943   /// \brief Build a new template name given a template template parameter pack
944   /// and the
945   ///
946   /// By default, performs semantic analysis to determine whether the name can
947   /// be resolved to a specific template, then builds the appropriate kind of
948   /// template name. Subclasses may override this routine to provide different
949   /// behavior.
RebuildTemplateName(TemplateTemplateParmDecl * Param,const TemplateArgument & ArgPack)950   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
951                                    const TemplateArgument &ArgPack) {
952     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
953   }
954 
955   /// \brief Build a new compound statement.
956   ///
957   /// By default, performs semantic analysis to build the new statement.
958   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundStmt(SourceLocation LBraceLoc,MultiStmtArg Statements,SourceLocation RBraceLoc,bool IsStmtExpr)959   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
960                                        MultiStmtArg Statements,
961                                        SourceLocation RBraceLoc,
962                                        bool IsStmtExpr) {
963     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
964                                        IsStmtExpr);
965   }
966 
967   /// \brief Build a new case statement.
968   ///
969   /// By default, performs semantic analysis to build the new statement.
970   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmt(SourceLocation CaseLoc,Expr * LHS,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation ColonLoc)971   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
972                                    Expr *LHS,
973                                    SourceLocation EllipsisLoc,
974                                    Expr *RHS,
975                                    SourceLocation ColonLoc) {
976     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
977                                    ColonLoc);
978   }
979 
980   /// \brief Attach the body to a new case statement.
981   ///
982   /// By default, performs semantic analysis to build the new statement.
983   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmtBody(Stmt * S,Stmt * Body)984   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
985     getSema().ActOnCaseStmtBody(S, Body);
986     return S;
987   }
988 
989   /// \brief Build a new default statement.
990   ///
991   /// By default, performs semantic analysis to build the new statement.
992   /// Subclasses may override this routine to provide different behavior.
RebuildDefaultStmt(SourceLocation DefaultLoc,SourceLocation ColonLoc,Stmt * SubStmt)993   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
994                                       SourceLocation ColonLoc,
995                                       Stmt *SubStmt) {
996     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
997                                       /*CurScope=*/0);
998   }
999 
1000   /// \brief Build a new label statement.
1001   ///
1002   /// By default, performs semantic analysis to build the new statement.
1003   /// Subclasses may override this routine to provide different behavior.
RebuildLabelStmt(SourceLocation IdentLoc,LabelDecl * L,SourceLocation ColonLoc,Stmt * SubStmt)1004   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1005                               SourceLocation ColonLoc, Stmt *SubStmt) {
1006     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1007   }
1008 
1009   /// \brief Build a new "if" statement.
1010   ///
1011   /// By default, performs semantic analysis to build the new statement.
1012   /// Subclasses may override this routine to provide different behavior.
RebuildIfStmt(SourceLocation IfLoc,Sema::FullExprArg Cond,VarDecl * CondVar,Stmt * Then,SourceLocation ElseLoc,Stmt * Else)1013   StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
1014                            VarDecl *CondVar, Stmt *Then,
1015                            SourceLocation ElseLoc, Stmt *Else) {
1016     return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
1017   }
1018 
1019   /// \brief Start building a new switch statement.
1020   ///
1021   /// By default, performs semantic analysis to build the new statement.
1022   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtStart(SourceLocation SwitchLoc,Expr * Cond,VarDecl * CondVar)1023   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1024                                     Expr *Cond, VarDecl *CondVar) {
1025     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
1026                                             CondVar);
1027   }
1028 
1029   /// \brief Attach the body to the switch statement.
1030   ///
1031   /// By default, performs semantic analysis to build the new statement.
1032   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtBody(SourceLocation SwitchLoc,Stmt * Switch,Stmt * Body)1033   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1034                                    Stmt *Switch, Stmt *Body) {
1035     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1036   }
1037 
1038   /// \brief Build a new while statement.
1039   ///
1040   /// By default, performs semantic analysis to build the new statement.
1041   /// Subclasses may override this routine to provide different behavior.
RebuildWhileStmt(SourceLocation WhileLoc,Sema::FullExprArg Cond,VarDecl * CondVar,Stmt * Body)1042   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
1043                               VarDecl *CondVar, Stmt *Body) {
1044     return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
1045   }
1046 
1047   /// \brief Build a new do-while statement.
1048   ///
1049   /// By default, performs semantic analysis to build the new statement.
1050   /// Subclasses may override this routine to provide different behavior.
RebuildDoStmt(SourceLocation DoLoc,Stmt * Body,SourceLocation WhileLoc,SourceLocation LParenLoc,Expr * Cond,SourceLocation RParenLoc)1051   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1052                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1053                            Expr *Cond, SourceLocation RParenLoc) {
1054     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1055                                  Cond, RParenLoc);
1056   }
1057 
1058   /// \brief Build a new for statement.
1059   ///
1060   /// By default, performs semantic analysis to build the new statement.
1061   /// Subclasses may override this routine to provide different behavior.
RebuildForStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * Init,Sema::FullExprArg Cond,VarDecl * CondVar,Sema::FullExprArg Inc,SourceLocation RParenLoc,Stmt * Body)1062   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1063                             Stmt *Init, Sema::FullExprArg Cond,
1064                             VarDecl *CondVar, Sema::FullExprArg Inc,
1065                             SourceLocation RParenLoc, Stmt *Body) {
1066     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1067                                   CondVar, Inc, RParenLoc, Body);
1068   }
1069 
1070   /// \brief Build a new goto statement.
1071   ///
1072   /// By default, performs semantic analysis to build the new statement.
1073   /// Subclasses may override this routine to provide different behavior.
RebuildGotoStmt(SourceLocation GotoLoc,SourceLocation LabelLoc,LabelDecl * Label)1074   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1075                              LabelDecl *Label) {
1076     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1077   }
1078 
1079   /// \brief Build a new indirect goto statement.
1080   ///
1081   /// By default, performs semantic analysis to build the new statement.
1082   /// Subclasses may override this routine to provide different behavior.
RebuildIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,Expr * Target)1083   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1084                                      SourceLocation StarLoc,
1085                                      Expr *Target) {
1086     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1087   }
1088 
1089   /// \brief Build a new return statement.
1090   ///
1091   /// By default, performs semantic analysis to build the new statement.
1092   /// Subclasses may override this routine to provide different behavior.
RebuildReturnStmt(SourceLocation ReturnLoc,Expr * Result)1093   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1094     return getSema().ActOnReturnStmt(ReturnLoc, Result);
1095   }
1096 
1097   /// \brief Build a new declaration statement.
1098   ///
1099   /// By default, performs semantic analysis to build the new statement.
1100   /// Subclasses may override this routine to provide different behavior.
RebuildDeclStmt(Decl ** Decls,unsigned NumDecls,SourceLocation StartLoc,SourceLocation EndLoc)1101   StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
1102                                    SourceLocation StartLoc,
1103                                    SourceLocation EndLoc) {
1104     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls, NumDecls);
1105     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1106   }
1107 
1108   /// \brief Build a new inline asm statement.
1109   ///
1110   /// By default, performs semantic analysis to build the new statement.
1111   /// Subclasses may override this routine to provide different behavior.
RebuildAsmStmt(SourceLocation AsmLoc,bool IsSimple,bool IsVolatile,unsigned NumOutputs,unsigned NumInputs,IdentifierInfo ** Names,MultiExprArg Constraints,MultiExprArg Exprs,Expr * AsmString,MultiExprArg Clobbers,SourceLocation RParenLoc,bool MSAsm)1112   StmtResult RebuildAsmStmt(SourceLocation AsmLoc,
1113                                   bool IsSimple,
1114                                   bool IsVolatile,
1115                                   unsigned NumOutputs,
1116                                   unsigned NumInputs,
1117                                   IdentifierInfo **Names,
1118                                   MultiExprArg Constraints,
1119                                   MultiExprArg Exprs,
1120                                   Expr *AsmString,
1121                                   MultiExprArg Clobbers,
1122                                   SourceLocation RParenLoc,
1123                                   bool MSAsm) {
1124     return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1125                                   NumInputs, Names, move(Constraints),
1126                                   Exprs, AsmString, Clobbers,
1127                                   RParenLoc, MSAsm);
1128   }
1129 
1130   /// \brief Build a new Objective-C @try statement.
1131   ///
1132   /// By default, performs semantic analysis to build the new statement.
1133   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtTryStmt(SourceLocation AtLoc,Stmt * TryBody,MultiStmtArg CatchStmts,Stmt * Finally)1134   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1135                                         Stmt *TryBody,
1136                                         MultiStmtArg CatchStmts,
1137                                         Stmt *Finally) {
1138     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts),
1139                                         Finally);
1140   }
1141 
1142   /// \brief Rebuild an Objective-C exception declaration.
1143   ///
1144   /// By default, performs semantic analysis to build the new declaration.
1145   /// Subclasses may override this routine to provide different behavior.
RebuildObjCExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * TInfo,QualType T)1146   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1147                                     TypeSourceInfo *TInfo, QualType T) {
1148     return getSema().BuildObjCExceptionDecl(TInfo, T,
1149                                             ExceptionDecl->getInnerLocStart(),
1150                                             ExceptionDecl->getLocation(),
1151                                             ExceptionDecl->getIdentifier());
1152   }
1153 
1154   /// \brief Build a new Objective-C @catch statement.
1155   ///
1156   /// By default, performs semantic analysis to build the new statement.
1157   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtCatchStmt(SourceLocation AtLoc,SourceLocation RParenLoc,VarDecl * Var,Stmt * Body)1158   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1159                                           SourceLocation RParenLoc,
1160                                           VarDecl *Var,
1161                                           Stmt *Body) {
1162     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1163                                           Var, Body);
1164   }
1165 
1166   /// \brief Build a new Objective-C @finally statement.
1167   ///
1168   /// By default, performs semantic analysis to build the new statement.
1169   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtFinallyStmt(SourceLocation AtLoc,Stmt * Body)1170   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1171                                             Stmt *Body) {
1172     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1173   }
1174 
1175   /// \brief Build a new Objective-C @throw statement.
1176   ///
1177   /// By default, performs semantic analysis to build the new statement.
1178   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtThrowStmt(SourceLocation AtLoc,Expr * Operand)1179   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1180                                           Expr *Operand) {
1181     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1182   }
1183 
1184   /// \brief Build a new Objective-C @synchronized statement.
1185   ///
1186   /// By default, performs semantic analysis to build the new statement.
1187   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,Expr * Object,Stmt * Body)1188   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1189                                                  Expr *Object,
1190                                                  Stmt *Body) {
1191     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object,
1192                                                  Body);
1193   }
1194 
1195   /// \brief Build a new Objective-C @autoreleasepool statement.
1196   ///
1197   /// By default, performs semantic analysis to build the new statement.
1198   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,Stmt * Body)1199   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1200                                             Stmt *Body) {
1201     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1202   }
1203 
1204 
1205   /// \brief Build a new Objective-C fast enumeration statement.
1206   ///
1207   /// By default, performs semantic analysis to build the new statement.
1208   /// Subclasses may override this routine to provide different behavior.
RebuildObjCForCollectionStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * Element,Expr * Collection,SourceLocation RParenLoc,Stmt * Body)1209   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1210                                           SourceLocation LParenLoc,
1211                                           Stmt *Element,
1212                                           Expr *Collection,
1213                                           SourceLocation RParenLoc,
1214                                           Stmt *Body) {
1215     return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
1216                                                 Element,
1217                                                 Collection,
1218                                                 RParenLoc,
1219                                                 Body);
1220   }
1221 
1222   /// \brief Build a new C++ exception declaration.
1223   ///
1224   /// By default, performs semantic analysis to build the new decaration.
1225   /// Subclasses may override this routine to provide different behavior.
RebuildExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * Declarator,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id)1226   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1227                                 TypeSourceInfo *Declarator,
1228                                 SourceLocation StartLoc,
1229                                 SourceLocation IdLoc,
1230                                 IdentifierInfo *Id) {
1231     VarDecl *Var = getSema().BuildExceptionDeclaration(0, Declarator,
1232                                                        StartLoc, IdLoc, Id);
1233     if (Var)
1234       getSema().CurContext->addDecl(Var);
1235     return Var;
1236   }
1237 
1238   /// \brief Build a new C++ catch statement.
1239   ///
1240   /// By default, performs semantic analysis to build the new statement.
1241   /// Subclasses may override this routine to provide different behavior.
RebuildCXXCatchStmt(SourceLocation CatchLoc,VarDecl * ExceptionDecl,Stmt * Handler)1242   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1243                                  VarDecl *ExceptionDecl,
1244                                  Stmt *Handler) {
1245     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1246                                                       Handler));
1247   }
1248 
1249   /// \brief Build a new C++ try statement.
1250   ///
1251   /// By default, performs semantic analysis to build the new statement.
1252   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTryStmt(SourceLocation TryLoc,Stmt * TryBlock,MultiStmtArg Handlers)1253   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
1254                                Stmt *TryBlock,
1255                                MultiStmtArg Handlers) {
1256     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers));
1257   }
1258 
1259   /// \brief Build a new C++0x range-based for statement.
1260   ///
1261   /// By default, performs semantic analysis to build the new statement.
1262   /// Subclasses may override this routine to provide different behavior.
RebuildCXXForRangeStmt(SourceLocation ForLoc,SourceLocation ColonLoc,Stmt * Range,Stmt * BeginEnd,Expr * Cond,Expr * Inc,Stmt * LoopVar,SourceLocation RParenLoc)1263   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1264                                     SourceLocation ColonLoc,
1265                                     Stmt *Range, Stmt *BeginEnd,
1266                                     Expr *Cond, Expr *Inc,
1267                                     Stmt *LoopVar,
1268                                     SourceLocation RParenLoc) {
1269     return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd,
1270                                           Cond, Inc, LoopVar, RParenLoc);
1271   }
1272 
1273   /// \brief Attach body to a C++0x range-based for statement.
1274   ///
1275   /// By default, performs semantic analysis to finish the new statement.
1276   /// Subclasses may override this routine to provide different behavior.
FinishCXXForRangeStmt(Stmt * ForRange,Stmt * Body)1277   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1278     return getSema().FinishCXXForRangeStmt(ForRange, Body);
1279   }
1280 
RebuildSEHTryStmt(bool IsCXXTry,SourceLocation TryLoc,Stmt * TryBlock,Stmt * Handler)1281   StmtResult RebuildSEHTryStmt(bool IsCXXTry,
1282                                SourceLocation TryLoc,
1283                                Stmt *TryBlock,
1284                                Stmt *Handler) {
1285     return getSema().ActOnSEHTryBlock(IsCXXTry,TryLoc,TryBlock,Handler);
1286   }
1287 
RebuildSEHExceptStmt(SourceLocation Loc,Expr * FilterExpr,Stmt * Block)1288   StmtResult RebuildSEHExceptStmt(SourceLocation Loc,
1289                                   Expr *FilterExpr,
1290                                   Stmt *Block) {
1291     return getSema().ActOnSEHExceptBlock(Loc,FilterExpr,Block);
1292   }
1293 
RebuildSEHFinallyStmt(SourceLocation Loc,Stmt * Block)1294   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc,
1295                                    Stmt *Block) {
1296     return getSema().ActOnSEHFinallyBlock(Loc,Block);
1297   }
1298 
1299   /// \brief Build a new expression that references a declaration.
1300   ///
1301   /// By default, performs semantic analysis to build the new expression.
1302   /// Subclasses may override this routine to provide different behavior.
RebuildDeclarationNameExpr(const CXXScopeSpec & SS,LookupResult & R,bool RequiresADL)1303   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1304                                         LookupResult &R,
1305                                         bool RequiresADL) {
1306     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1307   }
1308 
1309 
1310   /// \brief Build a new expression that references a declaration.
1311   ///
1312   /// By default, performs semantic analysis to build the new expression.
1313   /// Subclasses may override this routine to provide different behavior.
RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,ValueDecl * VD,const DeclarationNameInfo & NameInfo,TemplateArgumentListInfo * TemplateArgs)1314   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1315                                 ValueDecl *VD,
1316                                 const DeclarationNameInfo &NameInfo,
1317                                 TemplateArgumentListInfo *TemplateArgs) {
1318     CXXScopeSpec SS;
1319     SS.Adopt(QualifierLoc);
1320 
1321     // FIXME: loses template args.
1322 
1323     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1324   }
1325 
1326   /// \brief Build a new expression in parentheses.
1327   ///
1328   /// By default, performs semantic analysis to build the new expression.
1329   /// Subclasses may override this routine to provide different behavior.
RebuildParenExpr(Expr * SubExpr,SourceLocation LParen,SourceLocation RParen)1330   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1331                                     SourceLocation RParen) {
1332     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1333   }
1334 
1335   /// \brief Build a new pseudo-destructor expression.
1336   ///
1337   /// By default, performs semantic analysis to build the new expression.
1338   /// Subclasses may override this routine to provide different behavior.
1339   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1340                                             SourceLocation OperatorLoc,
1341                                             bool isArrow,
1342                                             CXXScopeSpec &SS,
1343                                             TypeSourceInfo *ScopeType,
1344                                             SourceLocation CCLoc,
1345                                             SourceLocation TildeLoc,
1346                                         PseudoDestructorTypeStorage Destroyed);
1347 
1348   /// \brief Build a new unary operator expression.
1349   ///
1350   /// By default, performs semantic analysis to build the new expression.
1351   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryOperator(SourceLocation OpLoc,UnaryOperatorKind Opc,Expr * SubExpr)1352   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1353                                         UnaryOperatorKind Opc,
1354                                         Expr *SubExpr) {
1355     return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr);
1356   }
1357 
1358   /// \brief Build a new builtin offsetof expression.
1359   ///
1360   /// By default, performs semantic analysis to build the new expression.
1361   /// Subclasses may override this routine to provide different behavior.
RebuildOffsetOfExpr(SourceLocation OperatorLoc,TypeSourceInfo * Type,Sema::OffsetOfComponent * Components,unsigned NumComponents,SourceLocation RParenLoc)1362   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
1363                                        TypeSourceInfo *Type,
1364                                        Sema::OffsetOfComponent *Components,
1365                                        unsigned NumComponents,
1366                                        SourceLocation RParenLoc) {
1367     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
1368                                           NumComponents, RParenLoc);
1369   }
1370 
1371   /// \brief Build a new sizeof, alignof or vec_step expression with a
1372   /// type argument.
1373   ///
1374   /// By default, performs semantic analysis to build the new expression.
1375   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(TypeSourceInfo * TInfo,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)1376   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
1377                                          SourceLocation OpLoc,
1378                                          UnaryExprOrTypeTrait ExprKind,
1379                                          SourceRange R) {
1380     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
1381   }
1382 
1383   /// \brief Build a new sizeof, alignof or vec step expression with an
1384   /// expression argument.
1385   ///
1386   /// By default, performs semantic analysis to build the new expression.
1387   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(Expr * SubExpr,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)1388   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
1389                                          UnaryExprOrTypeTrait ExprKind,
1390                                          SourceRange R) {
1391     ExprResult Result
1392       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
1393     if (Result.isInvalid())
1394       return ExprError();
1395 
1396     return move(Result);
1397   }
1398 
1399   /// \brief Build a new array subscript expression.
1400   ///
1401   /// By default, performs semantic analysis to build the new expression.
1402   /// Subclasses may override this routine to provide different behavior.
RebuildArraySubscriptExpr(Expr * LHS,SourceLocation LBracketLoc,Expr * RHS,SourceLocation RBracketLoc)1403   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1404                                              SourceLocation LBracketLoc,
1405                                              Expr *RHS,
1406                                              SourceLocation RBracketLoc) {
1407     return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS,
1408                                              LBracketLoc, RHS,
1409                                              RBracketLoc);
1410   }
1411 
1412   /// \brief Build a new call expression.
1413   ///
1414   /// By default, performs semantic analysis to build the new expression.
1415   /// Subclasses may override this routine to provide different behavior.
1416   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1417                                    MultiExprArg Args,
1418                                    SourceLocation RParenLoc,
1419                                    Expr *ExecConfig = 0) {
1420     return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc,
1421                                    move(Args), RParenLoc, ExecConfig);
1422   }
1423 
1424   /// \brief Build a new member access expression.
1425   ///
1426   /// By default, performs semantic analysis to build the new expression.
1427   /// Subclasses may override this routine to provide different behavior.
RebuildMemberExpr(Expr * Base,SourceLocation OpLoc,bool isArrow,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & MemberNameInfo,ValueDecl * Member,NamedDecl * FoundDecl,const TemplateArgumentListInfo * ExplicitTemplateArgs,NamedDecl * FirstQualifierInScope)1428   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
1429                                bool isArrow,
1430                                NestedNameSpecifierLoc QualifierLoc,
1431                                const DeclarationNameInfo &MemberNameInfo,
1432                                ValueDecl *Member,
1433                                NamedDecl *FoundDecl,
1434                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
1435                                NamedDecl *FirstQualifierInScope) {
1436     if (!Member->getDeclName()) {
1437       // We have a reference to an unnamed field.  This is always the
1438       // base of an anonymous struct/union member access, i.e. the
1439       // field is always of record type.
1440       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
1441       assert(Member->getType()->isRecordType() &&
1442              "unnamed member not of record type?");
1443 
1444       ExprResult BaseResult =
1445         getSema().PerformObjectMemberConversion(Base,
1446                                                 QualifierLoc.getNestedNameSpecifier(),
1447                                                 FoundDecl, Member);
1448       if (BaseResult.isInvalid())
1449         return ExprError();
1450       Base = BaseResult.take();
1451       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
1452       MemberExpr *ME =
1453         new (getSema().Context) MemberExpr(Base, isArrow,
1454                                            Member, MemberNameInfo,
1455                                            cast<FieldDecl>(Member)->getType(),
1456                                            VK, OK_Ordinary);
1457       return getSema().Owned(ME);
1458     }
1459 
1460     CXXScopeSpec SS;
1461     SS.Adopt(QualifierLoc);
1462 
1463     ExprResult BaseResult = getSema().DefaultFunctionArrayConversion(Base);
1464     if (BaseResult.isInvalid())
1465       return ExprError();
1466     Base = BaseResult.take();
1467     QualType BaseType = Base->getType();
1468 
1469     // FIXME: this involves duplicating earlier analysis in a lot of
1470     // cases; we should avoid this when possible.
1471     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
1472     R.addDecl(FoundDecl);
1473     R.resolveKind();
1474 
1475     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1476                                               SS, FirstQualifierInScope,
1477                                               R, ExplicitTemplateArgs);
1478   }
1479 
1480   /// \brief Build a new binary operator expression.
1481   ///
1482   /// By default, performs semantic analysis to build the new expression.
1483   /// Subclasses may override this routine to provide different behavior.
RebuildBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opc,Expr * LHS,Expr * RHS)1484   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1485                                          BinaryOperatorKind Opc,
1486                                          Expr *LHS, Expr *RHS) {
1487     return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS);
1488   }
1489 
1490   /// \brief Build a new conditional operator expression.
1491   ///
1492   /// By default, performs semantic analysis to build the new expression.
1493   /// Subclasses may override this routine to provide different behavior.
RebuildConditionalOperator(Expr * Cond,SourceLocation QuestionLoc,Expr * LHS,SourceLocation ColonLoc,Expr * RHS)1494   ExprResult RebuildConditionalOperator(Expr *Cond,
1495                                         SourceLocation QuestionLoc,
1496                                         Expr *LHS,
1497                                         SourceLocation ColonLoc,
1498                                         Expr *RHS) {
1499     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
1500                                         LHS, RHS);
1501   }
1502 
1503   /// \brief Build a new C-style cast expression.
1504   ///
1505   /// By default, performs semantic analysis to build the new expression.
1506   /// Subclasses may override this routine to provide different behavior.
RebuildCStyleCastExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * SubExpr)1507   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
1508                                          TypeSourceInfo *TInfo,
1509                                          SourceLocation RParenLoc,
1510                                          Expr *SubExpr) {
1511     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1512                                          SubExpr);
1513   }
1514 
1515   /// \brief Build a new compound literal expression.
1516   ///
1517   /// By default, performs semantic analysis to build the new expression.
1518   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundLiteralExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * Init)1519   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1520                                               TypeSourceInfo *TInfo,
1521                                               SourceLocation RParenLoc,
1522                                               Expr *Init) {
1523     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
1524                                               Init);
1525   }
1526 
1527   /// \brief Build a new extended vector element access expression.
1528   ///
1529   /// By default, performs semantic analysis to build the new expression.
1530   /// Subclasses may override this routine to provide different behavior.
RebuildExtVectorElementExpr(Expr * Base,SourceLocation OpLoc,SourceLocation AccessorLoc,IdentifierInfo & Accessor)1531   ExprResult RebuildExtVectorElementExpr(Expr *Base,
1532                                                SourceLocation OpLoc,
1533                                                SourceLocation AccessorLoc,
1534                                                IdentifierInfo &Accessor) {
1535 
1536     CXXScopeSpec SS;
1537     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
1538     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1539                                               OpLoc, /*IsArrow*/ false,
1540                                               SS, /*FirstQualifierInScope*/ 0,
1541                                               NameInfo,
1542                                               /* TemplateArgs */ 0);
1543   }
1544 
1545   /// \brief Build a new initializer list expression.
1546   ///
1547   /// By default, performs semantic analysis to build the new expression.
1548   /// Subclasses may override this routine to provide different behavior.
RebuildInitList(SourceLocation LBraceLoc,MultiExprArg Inits,SourceLocation RBraceLoc,QualType ResultTy)1549   ExprResult RebuildInitList(SourceLocation LBraceLoc,
1550                              MultiExprArg Inits,
1551                              SourceLocation RBraceLoc,
1552                              QualType ResultTy) {
1553     ExprResult Result
1554       = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1555     if (Result.isInvalid() || ResultTy->isDependentType())
1556       return move(Result);
1557 
1558     // Patch in the result type we were given, which may have been computed
1559     // when the initial InitListExpr was built.
1560     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1561     ILE->setType(ResultTy);
1562     return move(Result);
1563   }
1564 
1565   /// \brief Build a new designated initializer expression.
1566   ///
1567   /// By default, performs semantic analysis to build the new expression.
1568   /// Subclasses may override this routine to provide different behavior.
RebuildDesignatedInitExpr(Designation & Desig,MultiExprArg ArrayExprs,SourceLocation EqualOrColonLoc,bool GNUSyntax,Expr * Init)1569   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1570                                              MultiExprArg ArrayExprs,
1571                                              SourceLocation EqualOrColonLoc,
1572                                              bool GNUSyntax,
1573                                              Expr *Init) {
1574     ExprResult Result
1575       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1576                                            Init);
1577     if (Result.isInvalid())
1578       return ExprError();
1579 
1580     ArrayExprs.release();
1581     return move(Result);
1582   }
1583 
1584   /// \brief Build a new value-initialized expression.
1585   ///
1586   /// By default, builds the implicit value initialization without performing
1587   /// any semantic analysis. Subclasses may override this routine to provide
1588   /// different behavior.
RebuildImplicitValueInitExpr(QualType T)1589   ExprResult RebuildImplicitValueInitExpr(QualType T) {
1590     return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1591   }
1592 
1593   /// \brief Build a new \c va_arg expression.
1594   ///
1595   /// By default, performs semantic analysis to build the new expression.
1596   /// Subclasses may override this routine to provide different behavior.
RebuildVAArgExpr(SourceLocation BuiltinLoc,Expr * SubExpr,TypeSourceInfo * TInfo,SourceLocation RParenLoc)1597   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
1598                                     Expr *SubExpr, TypeSourceInfo *TInfo,
1599                                     SourceLocation RParenLoc) {
1600     return getSema().BuildVAArgExpr(BuiltinLoc,
1601                                     SubExpr, TInfo,
1602                                     RParenLoc);
1603   }
1604 
1605   /// \brief Build a new expression list in parentheses.
1606   ///
1607   /// By default, performs semantic analysis to build the new expression.
1608   /// Subclasses may override this routine to provide different behavior.
RebuildParenListExpr(SourceLocation LParenLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)1609   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1610                                         MultiExprArg SubExprs,
1611                                         SourceLocation RParenLoc) {
1612     return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1613                                                move(SubExprs));
1614   }
1615 
1616   /// \brief Build a new address-of-label expression.
1617   ///
1618   /// By default, performs semantic analysis, using the name of the label
1619   /// rather than attempting to map the label statement itself.
1620   /// Subclasses may override this routine to provide different behavior.
RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,SourceLocation LabelLoc,LabelDecl * Label)1621   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1622                                   SourceLocation LabelLoc, LabelDecl *Label) {
1623     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
1624   }
1625 
1626   /// \brief Build a new GNU statement expression.
1627   ///
1628   /// By default, performs semantic analysis to build the new expression.
1629   /// Subclasses may override this routine to provide different behavior.
RebuildStmtExpr(SourceLocation LParenLoc,Stmt * SubStmt,SourceLocation RParenLoc)1630   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1631                                    Stmt *SubStmt,
1632                                    SourceLocation RParenLoc) {
1633     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
1634   }
1635 
1636   /// \brief Build a new __builtin_choose_expr expression.
1637   ///
1638   /// By default, performs semantic analysis to build the new expression.
1639   /// Subclasses may override this routine to provide different behavior.
RebuildChooseExpr(SourceLocation BuiltinLoc,Expr * Cond,Expr * LHS,Expr * RHS,SourceLocation RParenLoc)1640   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1641                                      Expr *Cond, Expr *LHS, Expr *RHS,
1642                                      SourceLocation RParenLoc) {
1643     return SemaRef.ActOnChooseExpr(BuiltinLoc,
1644                                    Cond, LHS, RHS,
1645                                    RParenLoc);
1646   }
1647 
1648   /// \brief Build a new generic selection expression.
1649   ///
1650   /// By default, performs semantic analysis to build the new expression.
1651   /// Subclasses may override this routine to provide different behavior.
RebuildGenericSelectionExpr(SourceLocation KeyLoc,SourceLocation DefaultLoc,SourceLocation RParenLoc,Expr * ControllingExpr,TypeSourceInfo ** Types,Expr ** Exprs,unsigned NumAssocs)1652   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
1653                                          SourceLocation DefaultLoc,
1654                                          SourceLocation RParenLoc,
1655                                          Expr *ControllingExpr,
1656                                          TypeSourceInfo **Types,
1657                                          Expr **Exprs,
1658                                          unsigned NumAssocs) {
1659     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
1660                                                 ControllingExpr, Types, Exprs,
1661                                                 NumAssocs);
1662   }
1663 
1664   /// \brief Build a new overloaded operator call expression.
1665   ///
1666   /// By default, performs semantic analysis to build the new expression.
1667   /// The semantic analysis provides the behavior of template instantiation,
1668   /// copying with transformations that turn what looks like an overloaded
1669   /// operator call into a use of a builtin operator, performing
1670   /// argument-dependent lookup, etc. Subclasses may override this routine to
1671   /// provide different behavior.
1672   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1673                                               SourceLocation OpLoc,
1674                                               Expr *Callee,
1675                                               Expr *First,
1676                                               Expr *Second);
1677 
1678   /// \brief Build a new C++ "named" cast expression, such as static_cast or
1679   /// reinterpret_cast.
1680   ///
1681   /// By default, this routine dispatches to one of the more-specific routines
1682   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1683   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNamedCastExpr(SourceLocation OpLoc,Stmt::StmtClass Class,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)1684   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1685                                            Stmt::StmtClass Class,
1686                                            SourceLocation LAngleLoc,
1687                                            TypeSourceInfo *TInfo,
1688                                            SourceLocation RAngleLoc,
1689                                            SourceLocation LParenLoc,
1690                                            Expr *SubExpr,
1691                                            SourceLocation RParenLoc) {
1692     switch (Class) {
1693     case Stmt::CXXStaticCastExprClass:
1694       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
1695                                                    RAngleLoc, LParenLoc,
1696                                                    SubExpr, RParenLoc);
1697 
1698     case Stmt::CXXDynamicCastExprClass:
1699       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
1700                                                     RAngleLoc, LParenLoc,
1701                                                     SubExpr, RParenLoc);
1702 
1703     case Stmt::CXXReinterpretCastExprClass:
1704       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
1705                                                         RAngleLoc, LParenLoc,
1706                                                         SubExpr,
1707                                                         RParenLoc);
1708 
1709     case Stmt::CXXConstCastExprClass:
1710       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
1711                                                    RAngleLoc, LParenLoc,
1712                                                    SubExpr, RParenLoc);
1713 
1714     default:
1715       assert(false && "Invalid C++ named cast");
1716       break;
1717     }
1718 
1719     return ExprError();
1720   }
1721 
1722   /// \brief Build a new C++ static_cast expression.
1723   ///
1724   /// By default, performs semantic analysis to build the new expression.
1725   /// Subclasses may override this routine to provide different behavior.
RebuildCXXStaticCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)1726   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1727                                             SourceLocation LAngleLoc,
1728                                             TypeSourceInfo *TInfo,
1729                                             SourceLocation RAngleLoc,
1730                                             SourceLocation LParenLoc,
1731                                             Expr *SubExpr,
1732                                             SourceLocation RParenLoc) {
1733     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1734                                        TInfo, SubExpr,
1735                                        SourceRange(LAngleLoc, RAngleLoc),
1736                                        SourceRange(LParenLoc, RParenLoc));
1737   }
1738 
1739   /// \brief Build a new C++ dynamic_cast expression.
1740   ///
1741   /// By default, performs semantic analysis to build the new expression.
1742   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDynamicCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)1743   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1744                                              SourceLocation LAngleLoc,
1745                                              TypeSourceInfo *TInfo,
1746                                              SourceLocation RAngleLoc,
1747                                              SourceLocation LParenLoc,
1748                                              Expr *SubExpr,
1749                                              SourceLocation RParenLoc) {
1750     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1751                                        TInfo, SubExpr,
1752                                        SourceRange(LAngleLoc, RAngleLoc),
1753                                        SourceRange(LParenLoc, RParenLoc));
1754   }
1755 
1756   /// \brief Build a new C++ reinterpret_cast expression.
1757   ///
1758   /// By default, performs semantic analysis to build the new expression.
1759   /// Subclasses may override this routine to provide different behavior.
RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)1760   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1761                                                  SourceLocation LAngleLoc,
1762                                                  TypeSourceInfo *TInfo,
1763                                                  SourceLocation RAngleLoc,
1764                                                  SourceLocation LParenLoc,
1765                                                  Expr *SubExpr,
1766                                                  SourceLocation RParenLoc) {
1767     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1768                                        TInfo, SubExpr,
1769                                        SourceRange(LAngleLoc, RAngleLoc),
1770                                        SourceRange(LParenLoc, RParenLoc));
1771   }
1772 
1773   /// \brief Build a new C++ const_cast expression.
1774   ///
1775   /// By default, performs semantic analysis to build the new expression.
1776   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)1777   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1778                                            SourceLocation LAngleLoc,
1779                                            TypeSourceInfo *TInfo,
1780                                            SourceLocation RAngleLoc,
1781                                            SourceLocation LParenLoc,
1782                                            Expr *SubExpr,
1783                                            SourceLocation RParenLoc) {
1784     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1785                                        TInfo, SubExpr,
1786                                        SourceRange(LAngleLoc, RAngleLoc),
1787                                        SourceRange(LParenLoc, RParenLoc));
1788   }
1789 
1790   /// \brief Build a new C++ functional-style cast expression.
1791   ///
1792   /// By default, performs semantic analysis to build the new expression.
1793   /// Subclasses may override this routine to provide different behavior.
RebuildCXXFunctionalCastExpr(TypeSourceInfo * TInfo,SourceLocation LParenLoc,Expr * Sub,SourceLocation RParenLoc)1794   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
1795                                           SourceLocation LParenLoc,
1796                                           Expr *Sub,
1797                                           SourceLocation RParenLoc) {
1798     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
1799                                                MultiExprArg(&Sub, 1),
1800                                                RParenLoc);
1801   }
1802 
1803   /// \brief Build a new C++ typeid(type) expression.
1804   ///
1805   /// By default, performs semantic analysis to build the new expression.
1806   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)1807   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
1808                                         SourceLocation TypeidLoc,
1809                                         TypeSourceInfo *Operand,
1810                                         SourceLocation RParenLoc) {
1811     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
1812                                     RParenLoc);
1813   }
1814 
1815 
1816   /// \brief Build a new C++ typeid(expr) expression.
1817   ///
1818   /// By default, performs semantic analysis to build the new expression.
1819   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)1820   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
1821                                         SourceLocation TypeidLoc,
1822                                         Expr *Operand,
1823                                         SourceLocation RParenLoc) {
1824     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
1825                                     RParenLoc);
1826   }
1827 
1828   /// \brief Build a new C++ __uuidof(type) expression.
1829   ///
1830   /// By default, performs semantic analysis to build the new expression.
1831   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)1832   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
1833                                         SourceLocation TypeidLoc,
1834                                         TypeSourceInfo *Operand,
1835                                         SourceLocation RParenLoc) {
1836     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
1837                                     RParenLoc);
1838   }
1839 
1840   /// \brief Build a new C++ __uuidof(expr) expression.
1841   ///
1842   /// By default, performs semantic analysis to build the new expression.
1843   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)1844   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
1845                                         SourceLocation TypeidLoc,
1846                                         Expr *Operand,
1847                                         SourceLocation RParenLoc) {
1848     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
1849                                     RParenLoc);
1850   }
1851 
1852   /// \brief Build a new C++ "this" expression.
1853   ///
1854   /// By default, builds a new "this" expression without performing any
1855   /// semantic analysis. Subclasses may override this routine to provide
1856   /// different behavior.
RebuildCXXThisExpr(SourceLocation ThisLoc,QualType ThisType,bool isImplicit)1857   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1858                                 QualType ThisType,
1859                                 bool isImplicit) {
1860     return getSema().Owned(
1861                       new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1862                                                           isImplicit));
1863   }
1864 
1865   /// \brief Build a new C++ throw expression.
1866   ///
1867   /// By default, performs semantic analysis to build the new expression.
1868   /// Subclasses may override this routine to provide different behavior.
RebuildCXXThrowExpr(SourceLocation ThrowLoc,Expr * Sub,bool IsThrownVariableInScope)1869   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
1870                                  bool IsThrownVariableInScope) {
1871     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
1872   }
1873 
1874   /// \brief Build a new C++ default-argument expression.
1875   ///
1876   /// By default, builds a new default-argument expression, which does not
1877   /// require any semantic analysis. Subclasses may override this routine to
1878   /// provide different behavior.
RebuildCXXDefaultArgExpr(SourceLocation Loc,ParmVarDecl * Param)1879   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1880                                             ParmVarDecl *Param) {
1881     return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1882                                                      Param));
1883   }
1884 
1885   /// \brief Build a new C++ zero-initialization expression.
1886   ///
1887   /// By default, performs semantic analysis to build the new expression.
1888   /// Subclasses may override this routine to provide different behavior.
RebuildCXXScalarValueInitExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,SourceLocation RParenLoc)1889   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
1890                                            SourceLocation LParenLoc,
1891                                            SourceLocation RParenLoc) {
1892     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
1893                                                MultiExprArg(getSema(), 0, 0),
1894                                                RParenLoc);
1895   }
1896 
1897   /// \brief Build a new C++ "new" expression.
1898   ///
1899   /// By default, performs semantic analysis to build the new expression.
1900   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNewExpr(SourceLocation StartLoc,bool UseGlobal,SourceLocation PlacementLParen,MultiExprArg PlacementArgs,SourceLocation PlacementRParen,SourceRange TypeIdParens,QualType AllocatedType,TypeSourceInfo * AllocatedTypeInfo,Expr * ArraySize,SourceLocation ConstructorLParen,MultiExprArg ConstructorArgs,SourceLocation ConstructorRParen)1901   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1902                                bool UseGlobal,
1903                                SourceLocation PlacementLParen,
1904                                MultiExprArg PlacementArgs,
1905                                SourceLocation PlacementRParen,
1906                                SourceRange TypeIdParens,
1907                                QualType AllocatedType,
1908                                TypeSourceInfo *AllocatedTypeInfo,
1909                                Expr *ArraySize,
1910                                SourceLocation ConstructorLParen,
1911                                MultiExprArg ConstructorArgs,
1912                                SourceLocation ConstructorRParen) {
1913     return getSema().BuildCXXNew(StartLoc, UseGlobal,
1914                                  PlacementLParen,
1915                                  move(PlacementArgs),
1916                                  PlacementRParen,
1917                                  TypeIdParens,
1918                                  AllocatedType,
1919                                  AllocatedTypeInfo,
1920                                  ArraySize,
1921                                  ConstructorLParen,
1922                                  move(ConstructorArgs),
1923                                  ConstructorRParen);
1924   }
1925 
1926   /// \brief Build a new C++ "delete" expression.
1927   ///
1928   /// By default, performs semantic analysis to build the new expression.
1929   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDeleteExpr(SourceLocation StartLoc,bool IsGlobalDelete,bool IsArrayForm,Expr * Operand)1930   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1931                                         bool IsGlobalDelete,
1932                                         bool IsArrayForm,
1933                                         Expr *Operand) {
1934     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1935                                     Operand);
1936   }
1937 
1938   /// \brief Build a new unary type trait expression.
1939   ///
1940   /// By default, performs semantic analysis to build the new expression.
1941   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryTypeTrait(UnaryTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * T,SourceLocation RParenLoc)1942   ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1943                                    SourceLocation StartLoc,
1944                                    TypeSourceInfo *T,
1945                                    SourceLocation RParenLoc) {
1946     return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc);
1947   }
1948 
1949   /// \brief Build a new binary type trait expression.
1950   ///
1951   /// By default, performs semantic analysis to build the new expression.
1952   /// Subclasses may override this routine to provide different behavior.
RebuildBinaryTypeTrait(BinaryTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * LhsT,TypeSourceInfo * RhsT,SourceLocation RParenLoc)1953   ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait,
1954                                     SourceLocation StartLoc,
1955                                     TypeSourceInfo *LhsT,
1956                                     TypeSourceInfo *RhsT,
1957                                     SourceLocation RParenLoc) {
1958     return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc);
1959   }
1960 
1961   /// \brief Build a new array type trait expression.
1962   ///
1963   /// By default, performs semantic analysis to build the new expression.
1964   /// Subclasses may override this routine to provide different behavior.
RebuildArrayTypeTrait(ArrayTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * TSInfo,Expr * DimExpr,SourceLocation RParenLoc)1965   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
1966                                    SourceLocation StartLoc,
1967                                    TypeSourceInfo *TSInfo,
1968                                    Expr *DimExpr,
1969                                    SourceLocation RParenLoc) {
1970     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
1971   }
1972 
1973   /// \brief Build a new expression trait expression.
1974   ///
1975   /// By default, performs semantic analysis to build the new expression.
1976   /// Subclasses may override this routine to provide different behavior.
RebuildExpressionTrait(ExpressionTrait Trait,SourceLocation StartLoc,Expr * Queried,SourceLocation RParenLoc)1977   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
1978                                    SourceLocation StartLoc,
1979                                    Expr *Queried,
1980                                    SourceLocation RParenLoc) {
1981     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
1982   }
1983 
1984   /// \brief Build a new (previously unresolved) declaration reference
1985   /// expression.
1986   ///
1987   /// By default, performs semantic analysis to build the new expression.
1988   /// Subclasses may override this routine to provide different behavior.
RebuildDependentScopeDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * TemplateArgs)1989   ExprResult RebuildDependentScopeDeclRefExpr(
1990                                           NestedNameSpecifierLoc QualifierLoc,
1991                                        const DeclarationNameInfo &NameInfo,
1992                               const TemplateArgumentListInfo *TemplateArgs) {
1993     CXXScopeSpec SS;
1994     SS.Adopt(QualifierLoc);
1995 
1996     if (TemplateArgs)
1997       return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
1998                                                     *TemplateArgs);
1999 
2000     return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
2001   }
2002 
2003   /// \brief Build a new template-id expression.
2004   ///
2005   /// By default, performs semantic analysis to build the new expression.
2006   /// Subclasses may override this routine to provide different behavior.
RebuildTemplateIdExpr(const CXXScopeSpec & SS,LookupResult & R,bool RequiresADL,const TemplateArgumentListInfo & TemplateArgs)2007   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2008                                          LookupResult &R,
2009                                          bool RequiresADL,
2010                               const TemplateArgumentListInfo &TemplateArgs) {
2011     return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
2012   }
2013 
2014   /// \brief Build a new object-construction expression.
2015   ///
2016   /// By default, performs semantic analysis to build the new expression.
2017   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstructExpr(QualType T,SourceLocation Loc,CXXConstructorDecl * Constructor,bool IsElidable,MultiExprArg Args,bool RequiresZeroInit,CXXConstructExpr::ConstructionKind ConstructKind,SourceRange ParenRange)2018   ExprResult RebuildCXXConstructExpr(QualType T,
2019                                            SourceLocation Loc,
2020                                            CXXConstructorDecl *Constructor,
2021                                            bool IsElidable,
2022                                            MultiExprArg Args,
2023                                            bool RequiresZeroInit,
2024                              CXXConstructExpr::ConstructionKind ConstructKind,
2025                                            SourceRange ParenRange) {
2026     ASTOwningVector<Expr*> ConvertedArgs(SemaRef);
2027     if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
2028                                           ConvertedArgs))
2029       return ExprError();
2030 
2031     return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
2032                                            move_arg(ConvertedArgs),
2033                                            RequiresZeroInit, ConstructKind,
2034                                            ParenRange);
2035   }
2036 
2037   /// \brief Build a new object-construction expression.
2038   ///
2039   /// By default, performs semantic analysis to build the new expression.
2040   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTemporaryObjectExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2041   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2042                                            SourceLocation LParenLoc,
2043                                            MultiExprArg Args,
2044                                            SourceLocation RParenLoc) {
2045     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2046                                                LParenLoc,
2047                                                move(Args),
2048                                                RParenLoc);
2049   }
2050 
2051   /// \brief Build a new object-construction expression.
2052   ///
2053   /// By default, performs semantic analysis to build the new expression.
2054   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUnresolvedConstructExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2055   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2056                                                SourceLocation LParenLoc,
2057                                                MultiExprArg Args,
2058                                                SourceLocation RParenLoc) {
2059     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2060                                                LParenLoc,
2061                                                move(Args),
2062                                                RParenLoc);
2063   }
2064 
2065   /// \brief Build a new member reference expression.
2066   ///
2067   /// By default, performs semantic analysis to build the new expression.
2068   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDependentScopeMemberExpr(Expr * BaseE,QualType BaseType,bool IsArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,NamedDecl * FirstQualifierInScope,const DeclarationNameInfo & MemberNameInfo,const TemplateArgumentListInfo * TemplateArgs)2069   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2070                                                 QualType BaseType,
2071                                                 bool IsArrow,
2072                                                 SourceLocation OperatorLoc,
2073                                           NestedNameSpecifierLoc QualifierLoc,
2074                                             NamedDecl *FirstQualifierInScope,
2075                                    const DeclarationNameInfo &MemberNameInfo,
2076                               const TemplateArgumentListInfo *TemplateArgs) {
2077     CXXScopeSpec SS;
2078     SS.Adopt(QualifierLoc);
2079 
2080     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2081                                             OperatorLoc, IsArrow,
2082                                             SS, FirstQualifierInScope,
2083                                             MemberNameInfo,
2084                                             TemplateArgs);
2085   }
2086 
2087   /// \brief Build a new member reference expression.
2088   ///
2089   /// By default, performs semantic analysis to build the new expression.
2090   /// Subclasses may override this routine to provide different behavior.
RebuildUnresolvedMemberExpr(Expr * BaseE,QualType BaseType,SourceLocation OperatorLoc,bool IsArrow,NestedNameSpecifierLoc QualifierLoc,NamedDecl * FirstQualifierInScope,LookupResult & R,const TemplateArgumentListInfo * TemplateArgs)2091   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE,
2092                                                QualType BaseType,
2093                                                SourceLocation OperatorLoc,
2094                                                bool IsArrow,
2095                                            NestedNameSpecifierLoc QualifierLoc,
2096                                                NamedDecl *FirstQualifierInScope,
2097                                                LookupResult &R,
2098                                 const TemplateArgumentListInfo *TemplateArgs) {
2099     CXXScopeSpec SS;
2100     SS.Adopt(QualifierLoc);
2101 
2102     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2103                                             OperatorLoc, IsArrow,
2104                                             SS, FirstQualifierInScope,
2105                                             R, TemplateArgs);
2106   }
2107 
2108   /// \brief Build a new noexcept expression.
2109   ///
2110   /// By default, performs semantic analysis to build the new expression.
2111   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNoexceptExpr(SourceRange Range,Expr * Arg)2112   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2113     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2114   }
2115 
2116   /// \brief Build a new expression to compute the length of a parameter pack.
RebuildSizeOfPackExpr(SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,unsigned Length)2117   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
2118                                    SourceLocation PackLoc,
2119                                    SourceLocation RParenLoc,
2120                                    unsigned Length) {
2121     return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2122                                                 OperatorLoc, Pack, PackLoc,
2123                                                 RParenLoc, Length);
2124   }
2125 
2126   /// \brief Build a new Objective-C @encode expression.
2127   ///
2128   /// By default, performs semantic analysis to build the new expression.
2129   /// Subclasses may override this routine to provide different behavior.
RebuildObjCEncodeExpr(SourceLocation AtLoc,TypeSourceInfo * EncodeTypeInfo,SourceLocation RParenLoc)2130   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2131                                          TypeSourceInfo *EncodeTypeInfo,
2132                                          SourceLocation RParenLoc) {
2133     return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
2134                                                            RParenLoc));
2135   }
2136 
2137   /// \brief Build a new Objective-C class message.
RebuildObjCMessageExpr(TypeSourceInfo * ReceiverTypeInfo,Selector Sel,SourceLocation SelectorLoc,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2138   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2139                                           Selector Sel,
2140                                           SourceLocation SelectorLoc,
2141                                           ObjCMethodDecl *Method,
2142                                           SourceLocation LBracLoc,
2143                                           MultiExprArg Args,
2144                                           SourceLocation RBracLoc) {
2145     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2146                                      ReceiverTypeInfo->getType(),
2147                                      /*SuperLoc=*/SourceLocation(),
2148                                      Sel, Method, LBracLoc, SelectorLoc,
2149                                      RBracLoc, move(Args));
2150   }
2151 
2152   /// \brief Build a new Objective-C instance message.
RebuildObjCMessageExpr(Expr * Receiver,Selector Sel,SourceLocation SelectorLoc,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2153   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2154                                           Selector Sel,
2155                                           SourceLocation SelectorLoc,
2156                                           ObjCMethodDecl *Method,
2157                                           SourceLocation LBracLoc,
2158                                           MultiExprArg Args,
2159                                           SourceLocation RBracLoc) {
2160     return SemaRef.BuildInstanceMessage(Receiver,
2161                                         Receiver->getType(),
2162                                         /*SuperLoc=*/SourceLocation(),
2163                                         Sel, Method, LBracLoc, SelectorLoc,
2164                                         RBracLoc, move(Args));
2165   }
2166 
2167   /// \brief Build a new Objective-C ivar reference expression.
2168   ///
2169   /// By default, performs semantic analysis to build the new expression.
2170   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIvarRefExpr(Expr * BaseArg,ObjCIvarDecl * Ivar,SourceLocation IvarLoc,bool IsArrow,bool IsFreeIvar)2171   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2172                                           SourceLocation IvarLoc,
2173                                           bool IsArrow, bool IsFreeIvar) {
2174     // FIXME: We lose track of the IsFreeIvar bit.
2175     CXXScopeSpec SS;
2176     ExprResult Base = getSema().Owned(BaseArg);
2177     LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
2178                    Sema::LookupMemberName);
2179     ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2180                                                          /*FIME:*/IvarLoc,
2181                                                          SS, 0,
2182                                                          false);
2183     if (Result.isInvalid() || Base.isInvalid())
2184       return ExprError();
2185 
2186     if (Result.get())
2187       return move(Result);
2188 
2189     return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(),
2190                                               /*FIXME:*/IvarLoc, IsArrow, SS,
2191                                               /*FirstQualifierInScope=*/0,
2192                                               R,
2193                                               /*TemplateArgs=*/0);
2194   }
2195 
2196   /// \brief Build a new Objective-C property reference expression.
2197   ///
2198   /// By default, performs semantic analysis to build the new expression.
2199   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * BaseArg,ObjCPropertyDecl * Property,SourceLocation PropertyLoc)2200   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2201                                               ObjCPropertyDecl *Property,
2202                                               SourceLocation PropertyLoc) {
2203     CXXScopeSpec SS;
2204     ExprResult Base = getSema().Owned(BaseArg);
2205     LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
2206                    Sema::LookupMemberName);
2207     bool IsArrow = false;
2208     ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2209                                                          /*FIME:*/PropertyLoc,
2210                                                          SS, 0, false);
2211     if (Result.isInvalid() || Base.isInvalid())
2212       return ExprError();
2213 
2214     if (Result.get())
2215       return move(Result);
2216 
2217     return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(),
2218                                               /*FIXME:*/PropertyLoc, IsArrow,
2219                                               SS,
2220                                               /*FirstQualifierInScope=*/0,
2221                                               R,
2222                                               /*TemplateArgs=*/0);
2223   }
2224 
2225   /// \brief Build a new Objective-C property reference expression.
2226   ///
2227   /// By default, performs semantic analysis to build the new expression.
2228   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * Base,QualType T,ObjCMethodDecl * Getter,ObjCMethodDecl * Setter,SourceLocation PropertyLoc)2229   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2230                                         ObjCMethodDecl *Getter,
2231                                         ObjCMethodDecl *Setter,
2232                                         SourceLocation PropertyLoc) {
2233     // Since these expressions can only be value-dependent, we do not
2234     // need to perform semantic analysis again.
2235     return Owned(
2236       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2237                                                   VK_LValue, OK_ObjCProperty,
2238                                                   PropertyLoc, Base));
2239   }
2240 
2241   /// \brief Build a new Objective-C "isa" expression.
2242   ///
2243   /// By default, performs semantic analysis to build the new expression.
2244   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIsaExpr(Expr * BaseArg,SourceLocation IsaLoc,bool IsArrow)2245   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2246                                       bool IsArrow) {
2247     CXXScopeSpec SS;
2248     ExprResult Base = getSema().Owned(BaseArg);
2249     LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
2250                    Sema::LookupMemberName);
2251     ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2252                                                          /*FIME:*/IsaLoc,
2253                                                          SS, 0, false);
2254     if (Result.isInvalid() || Base.isInvalid())
2255       return ExprError();
2256 
2257     if (Result.get())
2258       return move(Result);
2259 
2260     return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(),
2261                                               /*FIXME:*/IsaLoc, IsArrow, SS,
2262                                               /*FirstQualifierInScope=*/0,
2263                                               R,
2264                                               /*TemplateArgs=*/0);
2265   }
2266 
2267   /// \brief Build a new shuffle vector expression.
2268   ///
2269   /// By default, performs semantic analysis to build the new expression.
2270   /// Subclasses may override this routine to provide different behavior.
RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2271   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2272                                       MultiExprArg SubExprs,
2273                                       SourceLocation RParenLoc) {
2274     // Find the declaration for __builtin_shufflevector
2275     const IdentifierInfo &Name
2276       = SemaRef.Context.Idents.get("__builtin_shufflevector");
2277     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
2278     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
2279     assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
2280 
2281     // Build a reference to the __builtin_shufflevector builtin
2282     FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
2283     ExprResult Callee
2284       = SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
2285                                                         VK_LValue, BuiltinLoc));
2286     Callee = SemaRef.UsualUnaryConversions(Callee.take());
2287     if (Callee.isInvalid())
2288       return ExprError();
2289 
2290     // Build the CallExpr
2291     unsigned NumSubExprs = SubExprs.size();
2292     Expr **Subs = (Expr **)SubExprs.release();
2293     ExprResult TheCall = SemaRef.Owned(
2294       new (SemaRef.Context) CallExpr(SemaRef.Context, Callee.take(),
2295                                                        Subs, NumSubExprs,
2296                                                    Builtin->getCallResultType(),
2297                             Expr::getValueKindForType(Builtin->getResultType()),
2298                                      RParenLoc));
2299 
2300     // Type-check the __builtin_shufflevector expression.
2301     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.take()));
2302   }
2303 
2304   /// \brief Build a new template argument pack expansion.
2305   ///
2306   /// By default, performs semantic analysis to build a new pack expansion
2307   /// for a template argument. Subclasses may override this routine to provide
2308   /// different behavior.
RebuildPackExpansion(TemplateArgumentLoc Pattern,SourceLocation EllipsisLoc,llvm::Optional<unsigned> NumExpansions)2309   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
2310                                            SourceLocation EllipsisLoc,
2311                                        llvm::Optional<unsigned> NumExpansions) {
2312     switch (Pattern.getArgument().getKind()) {
2313     case TemplateArgument::Expression: {
2314       ExprResult Result
2315         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
2316                                        EllipsisLoc, NumExpansions);
2317       if (Result.isInvalid())
2318         return TemplateArgumentLoc();
2319 
2320       return TemplateArgumentLoc(Result.get(), Result.get());
2321     }
2322 
2323     case TemplateArgument::Template:
2324       return TemplateArgumentLoc(TemplateArgument(
2325                                           Pattern.getArgument().getAsTemplate(),
2326                                                   NumExpansions),
2327                                  Pattern.getTemplateQualifierLoc(),
2328                                  Pattern.getTemplateNameLoc(),
2329                                  EllipsisLoc);
2330 
2331     case TemplateArgument::Null:
2332     case TemplateArgument::Integral:
2333     case TemplateArgument::Declaration:
2334     case TemplateArgument::Pack:
2335     case TemplateArgument::TemplateExpansion:
2336       llvm_unreachable("Pack expansion pattern has no parameter packs");
2337 
2338     case TemplateArgument::Type:
2339       if (TypeSourceInfo *Expansion
2340             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
2341                                            EllipsisLoc,
2342                                            NumExpansions))
2343         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
2344                                    Expansion);
2345       break;
2346     }
2347 
2348     return TemplateArgumentLoc();
2349   }
2350 
2351   /// \brief Build a new expression pack expansion.
2352   ///
2353   /// By default, performs semantic analysis to build a new pack expansion
2354   /// for an expression. Subclasses may override this routine to provide
2355   /// different behavior.
RebuildPackExpansion(Expr * Pattern,SourceLocation EllipsisLoc,llvm::Optional<unsigned> NumExpansions)2356   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
2357                                   llvm::Optional<unsigned> NumExpansions) {
2358     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
2359   }
2360 
2361 private:
2362   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
2363                                      QualType ObjectType,
2364                                      NamedDecl *FirstQualifierInScope,
2365                                      CXXScopeSpec &SS);
2366 
2367   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
2368                                              QualType ObjectType,
2369                                              NamedDecl *FirstQualifierInScope,
2370                                              CXXScopeSpec &SS);
2371 };
2372 
2373 template<typename Derived>
TransformStmt(Stmt * S)2374 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
2375   if (!S)
2376     return SemaRef.Owned(S);
2377 
2378   switch (S->getStmtClass()) {
2379   case Stmt::NoStmtClass: break;
2380 
2381   // Transform individual statement nodes
2382 #define STMT(Node, Parent)                                              \
2383   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
2384 #define ABSTRACT_STMT(Node)
2385 #define EXPR(Node, Parent)
2386 #include "clang/AST/StmtNodes.inc"
2387 
2388   // Transform expressions by calling TransformExpr.
2389 #define STMT(Node, Parent)
2390 #define ABSTRACT_STMT(Stmt)
2391 #define EXPR(Node, Parent) case Stmt::Node##Class:
2392 #include "clang/AST/StmtNodes.inc"
2393     {
2394       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
2395       if (E.isInvalid())
2396         return StmtError();
2397 
2398       return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take()));
2399     }
2400   }
2401 
2402   return SemaRef.Owned(S);
2403 }
2404 
2405 
2406 template<typename Derived>
TransformExpr(Expr * E)2407 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2408   if (!E)
2409     return SemaRef.Owned(E);
2410 
2411   switch (E->getStmtClass()) {
2412     case Stmt::NoStmtClass: break;
2413 #define STMT(Node, Parent) case Stmt::Node##Class: break;
2414 #define ABSTRACT_STMT(Stmt)
2415 #define EXPR(Node, Parent)                                              \
2416     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
2417 #include "clang/AST/StmtNodes.inc"
2418   }
2419 
2420   return SemaRef.Owned(E);
2421 }
2422 
2423 template<typename Derived>
TransformExprs(Expr ** Inputs,unsigned NumInputs,bool IsCall,llvm::SmallVectorImpl<Expr * > & Outputs,bool * ArgChanged)2424 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
2425                                             unsigned NumInputs,
2426                                             bool IsCall,
2427                                       llvm::SmallVectorImpl<Expr *> &Outputs,
2428                                             bool *ArgChanged) {
2429   for (unsigned I = 0; I != NumInputs; ++I) {
2430     // If requested, drop call arguments that need to be dropped.
2431     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
2432       if (ArgChanged)
2433         *ArgChanged = true;
2434 
2435       break;
2436     }
2437 
2438     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
2439       Expr *Pattern = Expansion->getPattern();
2440 
2441       llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2442       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
2443       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
2444 
2445       // Determine whether the set of unexpanded parameter packs can and should
2446       // be expanded.
2447       bool Expand = true;
2448       bool RetainExpansion = false;
2449       llvm::Optional<unsigned> OrigNumExpansions
2450         = Expansion->getNumExpansions();
2451       llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
2452       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
2453                                                Pattern->getSourceRange(),
2454                                                Unexpanded.data(),
2455                                                Unexpanded.size(),
2456                                                Expand, RetainExpansion,
2457                                                NumExpansions))
2458         return true;
2459 
2460       if (!Expand) {
2461         // The transform has determined that we should perform a simple
2462         // transformation on the pack expansion, producing another pack
2463         // expansion.
2464         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
2465         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
2466         if (OutPattern.isInvalid())
2467           return true;
2468 
2469         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
2470                                                 Expansion->getEllipsisLoc(),
2471                                                            NumExpansions);
2472         if (Out.isInvalid())
2473           return true;
2474 
2475         if (ArgChanged)
2476           *ArgChanged = true;
2477         Outputs.push_back(Out.get());
2478         continue;
2479       }
2480 
2481       // Record right away that the argument was changed.  This needs
2482       // to happen even if the array expands to nothing.
2483       if (ArgChanged) *ArgChanged = true;
2484 
2485       // The transform has determined that we should perform an elementwise
2486       // expansion of the pattern. Do so.
2487       for (unsigned I = 0; I != *NumExpansions; ++I) {
2488         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
2489         ExprResult Out = getDerived().TransformExpr(Pattern);
2490         if (Out.isInvalid())
2491           return true;
2492 
2493         if (Out.get()->containsUnexpandedParameterPack()) {
2494           Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(),
2495                                      OrigNumExpansions);
2496           if (Out.isInvalid())
2497             return true;
2498         }
2499 
2500         Outputs.push_back(Out.get());
2501       }
2502 
2503       continue;
2504     }
2505 
2506     ExprResult Result = getDerived().TransformExpr(Inputs[I]);
2507     if (Result.isInvalid())
2508       return true;
2509 
2510     if (Result.get() != Inputs[I] && ArgChanged)
2511       *ArgChanged = true;
2512 
2513     Outputs.push_back(Result.get());
2514   }
2515 
2516   return false;
2517 }
2518 
2519 template<typename Derived>
2520 NestedNameSpecifierLoc
TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,QualType ObjectType,NamedDecl * FirstQualifierInScope)2521 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
2522                                                     NestedNameSpecifierLoc NNS,
2523                                                      QualType ObjectType,
2524                                              NamedDecl *FirstQualifierInScope) {
2525   llvm::SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
2526   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
2527        Qualifier = Qualifier.getPrefix())
2528     Qualifiers.push_back(Qualifier);
2529 
2530   CXXScopeSpec SS;
2531   while (!Qualifiers.empty()) {
2532     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
2533     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
2534 
2535     switch (QNNS->getKind()) {
2536     case NestedNameSpecifier::Identifier:
2537       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0,
2538                                               *QNNS->getAsIdentifier(),
2539                                               Q.getLocalBeginLoc(),
2540                                               Q.getLocalEndLoc(),
2541                                               ObjectType, false, SS,
2542                                               FirstQualifierInScope, false))
2543         return NestedNameSpecifierLoc();
2544 
2545       break;
2546 
2547     case NestedNameSpecifier::Namespace: {
2548       NamespaceDecl *NS
2549         = cast_or_null<NamespaceDecl>(
2550                                     getDerived().TransformDecl(
2551                                                           Q.getLocalBeginLoc(),
2552                                                        QNNS->getAsNamespace()));
2553       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
2554       break;
2555     }
2556 
2557     case NestedNameSpecifier::NamespaceAlias: {
2558       NamespaceAliasDecl *Alias
2559         = cast_or_null<NamespaceAliasDecl>(
2560                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
2561                                                  QNNS->getAsNamespaceAlias()));
2562       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
2563                 Q.getLocalEndLoc());
2564       break;
2565     }
2566 
2567     case NestedNameSpecifier::Global:
2568       // There is no meaningful transformation that one could perform on the
2569       // global scope.
2570       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
2571       break;
2572 
2573     case NestedNameSpecifier::TypeSpecWithTemplate:
2574     case NestedNameSpecifier::TypeSpec: {
2575       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
2576                                               FirstQualifierInScope, SS);
2577 
2578       if (!TL)
2579         return NestedNameSpecifierLoc();
2580 
2581       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
2582           (SemaRef.getLangOptions().CPlusPlus0x &&
2583            TL.getType()->isEnumeralType())) {
2584         assert(!TL.getType().hasLocalQualifiers() &&
2585                "Can't get cv-qualifiers here");
2586         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
2587                   Q.getLocalEndLoc());
2588         break;
2589       }
2590       // If the nested-name-specifier is an invalid type def, don't emit an
2591       // error because a previous error should have already been emitted.
2592       TypedefTypeLoc* TTL = dyn_cast<TypedefTypeLoc>(&TL);
2593       if (!TTL || !TTL->getTypedefNameDecl()->isInvalidDecl()) {
2594         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
2595           << TL.getType() << SS.getRange();
2596       }
2597       return NestedNameSpecifierLoc();
2598     }
2599     }
2600 
2601     // The qualifier-in-scope and object type only apply to the leftmost entity.
2602     FirstQualifierInScope = 0;
2603     ObjectType = QualType();
2604   }
2605 
2606   // Don't rebuild the nested-name-specifier if we don't have to.
2607   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
2608       !getDerived().AlwaysRebuild())
2609     return NNS;
2610 
2611   // If we can re-use the source-location data from the original
2612   // nested-name-specifier, do so.
2613   if (SS.location_size() == NNS.getDataLength() &&
2614       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
2615     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
2616 
2617   // Allocate new nested-name-specifier location information.
2618   return SS.getWithLocInContext(SemaRef.Context);
2619 }
2620 
2621 template<typename Derived>
2622 DeclarationNameInfo
2623 TreeTransform<Derived>
TransformDeclarationNameInfo(const DeclarationNameInfo & NameInfo)2624 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
2625   DeclarationName Name = NameInfo.getName();
2626   if (!Name)
2627     return DeclarationNameInfo();
2628 
2629   switch (Name.getNameKind()) {
2630   case DeclarationName::Identifier:
2631   case DeclarationName::ObjCZeroArgSelector:
2632   case DeclarationName::ObjCOneArgSelector:
2633   case DeclarationName::ObjCMultiArgSelector:
2634   case DeclarationName::CXXOperatorName:
2635   case DeclarationName::CXXLiteralOperatorName:
2636   case DeclarationName::CXXUsingDirective:
2637     return NameInfo;
2638 
2639   case DeclarationName::CXXConstructorName:
2640   case DeclarationName::CXXDestructorName:
2641   case DeclarationName::CXXConversionFunctionName: {
2642     TypeSourceInfo *NewTInfo;
2643     CanQualType NewCanTy;
2644     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
2645       NewTInfo = getDerived().TransformType(OldTInfo);
2646       if (!NewTInfo)
2647         return DeclarationNameInfo();
2648       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
2649     }
2650     else {
2651       NewTInfo = 0;
2652       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
2653       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
2654       if (NewT.isNull())
2655         return DeclarationNameInfo();
2656       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
2657     }
2658 
2659     DeclarationName NewName
2660       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
2661                                                            NewCanTy);
2662     DeclarationNameInfo NewNameInfo(NameInfo);
2663     NewNameInfo.setName(NewName);
2664     NewNameInfo.setNamedTypeInfo(NewTInfo);
2665     return NewNameInfo;
2666   }
2667   }
2668 
2669   assert(0 && "Unknown name kind.");
2670   return DeclarationNameInfo();
2671 }
2672 
2673 template<typename Derived>
2674 TemplateName
TransformTemplateName(CXXScopeSpec & SS,TemplateName Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)2675 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
2676                                               TemplateName Name,
2677                                               SourceLocation NameLoc,
2678                                               QualType ObjectType,
2679                                               NamedDecl *FirstQualifierInScope) {
2680   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
2681     TemplateDecl *Template = QTN->getTemplateDecl();
2682     assert(Template && "qualified template name must refer to a template");
2683 
2684     TemplateDecl *TransTemplate
2685       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
2686                                                               Template));
2687     if (!TransTemplate)
2688       return TemplateName();
2689 
2690     if (!getDerived().AlwaysRebuild() &&
2691         SS.getScopeRep() == QTN->getQualifier() &&
2692         TransTemplate == Template)
2693       return Name;
2694 
2695     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
2696                                             TransTemplate);
2697   }
2698 
2699   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
2700     if (SS.getScopeRep()) {
2701       // These apply to the scope specifier, not the template.
2702       ObjectType = QualType();
2703       FirstQualifierInScope = 0;
2704     }
2705 
2706     if (!getDerived().AlwaysRebuild() &&
2707         SS.getScopeRep() == DTN->getQualifier() &&
2708         ObjectType.isNull())
2709       return Name;
2710 
2711     if (DTN->isIdentifier()) {
2712       return getDerived().RebuildTemplateName(SS,
2713                                               *DTN->getIdentifier(),
2714                                               NameLoc,
2715                                               ObjectType,
2716                                               FirstQualifierInScope);
2717     }
2718 
2719     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
2720                                             ObjectType);
2721   }
2722 
2723   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
2724     TemplateDecl *TransTemplate
2725       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
2726                                                               Template));
2727     if (!TransTemplate)
2728       return TemplateName();
2729 
2730     if (!getDerived().AlwaysRebuild() &&
2731         TransTemplate == Template)
2732       return Name;
2733 
2734     return TemplateName(TransTemplate);
2735   }
2736 
2737   if (SubstTemplateTemplateParmPackStorage *SubstPack
2738       = Name.getAsSubstTemplateTemplateParmPack()) {
2739     TemplateTemplateParmDecl *TransParam
2740     = cast_or_null<TemplateTemplateParmDecl>(
2741             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
2742     if (!TransParam)
2743       return TemplateName();
2744 
2745     if (!getDerived().AlwaysRebuild() &&
2746         TransParam == SubstPack->getParameterPack())
2747       return Name;
2748 
2749     return getDerived().RebuildTemplateName(TransParam,
2750                                             SubstPack->getArgumentPack());
2751   }
2752 
2753   // These should be getting filtered out before they reach the AST.
2754   llvm_unreachable("overloaded function decl survived to here");
2755   return TemplateName();
2756 }
2757 
2758 template<typename Derived>
InventTemplateArgumentLoc(const TemplateArgument & Arg,TemplateArgumentLoc & Output)2759 void TreeTransform<Derived>::InventTemplateArgumentLoc(
2760                                          const TemplateArgument &Arg,
2761                                          TemplateArgumentLoc &Output) {
2762   SourceLocation Loc = getDerived().getBaseLocation();
2763   switch (Arg.getKind()) {
2764   case TemplateArgument::Null:
2765     llvm_unreachable("null template argument in TreeTransform");
2766     break;
2767 
2768   case TemplateArgument::Type:
2769     Output = TemplateArgumentLoc(Arg,
2770                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2771 
2772     break;
2773 
2774   case TemplateArgument::Template:
2775   case TemplateArgument::TemplateExpansion: {
2776     NestedNameSpecifierLocBuilder Builder;
2777     TemplateName Template = Arg.getAsTemplate();
2778     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
2779       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
2780     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
2781       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
2782 
2783     if (Arg.getKind() == TemplateArgument::Template)
2784       Output = TemplateArgumentLoc(Arg,
2785                                    Builder.getWithLocInContext(SemaRef.Context),
2786                                    Loc);
2787     else
2788       Output = TemplateArgumentLoc(Arg,
2789                                    Builder.getWithLocInContext(SemaRef.Context),
2790                                    Loc, Loc);
2791 
2792     break;
2793   }
2794 
2795   case TemplateArgument::Expression:
2796     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2797     break;
2798 
2799   case TemplateArgument::Declaration:
2800   case TemplateArgument::Integral:
2801   case TemplateArgument::Pack:
2802     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2803     break;
2804   }
2805 }
2806 
2807 template<typename Derived>
TransformTemplateArgument(const TemplateArgumentLoc & Input,TemplateArgumentLoc & Output)2808 bool TreeTransform<Derived>::TransformTemplateArgument(
2809                                          const TemplateArgumentLoc &Input,
2810                                          TemplateArgumentLoc &Output) {
2811   const TemplateArgument &Arg = Input.getArgument();
2812   switch (Arg.getKind()) {
2813   case TemplateArgument::Null:
2814   case TemplateArgument::Integral:
2815     Output = Input;
2816     return false;
2817 
2818   case TemplateArgument::Type: {
2819     TypeSourceInfo *DI = Input.getTypeSourceInfo();
2820     if (DI == NULL)
2821       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2822 
2823     DI = getDerived().TransformType(DI);
2824     if (!DI) return true;
2825 
2826     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2827     return false;
2828   }
2829 
2830   case TemplateArgument::Declaration: {
2831     // FIXME: we should never have to transform one of these.
2832     DeclarationName Name;
2833     if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2834       Name = ND->getDeclName();
2835     TemporaryBase Rebase(*this, Input.getLocation(), Name);
2836     Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2837     if (!D) return true;
2838 
2839     Expr *SourceExpr = Input.getSourceDeclExpression();
2840     if (SourceExpr) {
2841       EnterExpressionEvaluationContext Unevaluated(getSema(),
2842                                                    Sema::Unevaluated);
2843       ExprResult E = getDerived().TransformExpr(SourceExpr);
2844       SourceExpr = (E.isInvalid() ? 0 : E.take());
2845     }
2846 
2847     Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2848     return false;
2849   }
2850 
2851   case TemplateArgument::Template: {
2852     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
2853     if (QualifierLoc) {
2854       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
2855       if (!QualifierLoc)
2856         return true;
2857     }
2858 
2859     CXXScopeSpec SS;
2860     SS.Adopt(QualifierLoc);
2861     TemplateName Template
2862       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
2863                                            Input.getTemplateNameLoc());
2864     if (Template.isNull())
2865       return true;
2866 
2867     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
2868                                  Input.getTemplateNameLoc());
2869     return false;
2870   }
2871 
2872   case TemplateArgument::TemplateExpansion:
2873     llvm_unreachable("Caller should expand pack expansions");
2874 
2875   case TemplateArgument::Expression: {
2876     // Template argument expressions are not potentially evaluated.
2877     EnterExpressionEvaluationContext Unevaluated(getSema(),
2878                                                  Sema::Unevaluated);
2879 
2880     Expr *InputExpr = Input.getSourceExpression();
2881     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2882 
2883     ExprResult E = getDerived().TransformExpr(InputExpr);
2884     if (E.isInvalid()) return true;
2885     Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take());
2886     return false;
2887   }
2888 
2889   case TemplateArgument::Pack: {
2890     llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2891     TransformedArgs.reserve(Arg.pack_size());
2892     for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2893                                       AEnd = Arg.pack_end();
2894          A != AEnd; ++A) {
2895 
2896       // FIXME: preserve source information here when we start
2897       // caring about parameter packs.
2898 
2899       TemplateArgumentLoc InputArg;
2900       TemplateArgumentLoc OutputArg;
2901       getDerived().InventTemplateArgumentLoc(*A, InputArg);
2902       if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2903         return true;
2904 
2905       TransformedArgs.push_back(OutputArg.getArgument());
2906     }
2907 
2908     TemplateArgument *TransformedArgsPtr
2909       = new (getSema().Context) TemplateArgument[TransformedArgs.size()];
2910     std::copy(TransformedArgs.begin(), TransformedArgs.end(),
2911               TransformedArgsPtr);
2912     Output = TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr,
2913                                                   TransformedArgs.size()),
2914                                  Input.getLocInfo());
2915     return false;
2916   }
2917   }
2918 
2919   // Work around bogus GCC warning
2920   return true;
2921 }
2922 
2923 /// \brief Iterator adaptor that invents template argument location information
2924 /// for each of the template arguments in its underlying iterator.
2925 template<typename Derived, typename InputIterator>
2926 class TemplateArgumentLocInventIterator {
2927   TreeTransform<Derived> &Self;
2928   InputIterator Iter;
2929 
2930 public:
2931   typedef TemplateArgumentLoc value_type;
2932   typedef TemplateArgumentLoc reference;
2933   typedef typename std::iterator_traits<InputIterator>::difference_type
2934     difference_type;
2935   typedef std::input_iterator_tag iterator_category;
2936 
2937   class pointer {
2938     TemplateArgumentLoc Arg;
2939 
2940   public:
pointer(TemplateArgumentLoc Arg)2941     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
2942 
2943     const TemplateArgumentLoc *operator->() const { return &Arg; }
2944   };
2945 
TemplateArgumentLocInventIterator()2946   TemplateArgumentLocInventIterator() { }
2947 
TemplateArgumentLocInventIterator(TreeTransform<Derived> & Self,InputIterator Iter)2948   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
2949                                              InputIterator Iter)
2950     : Self(Self), Iter(Iter) { }
2951 
2952   TemplateArgumentLocInventIterator &operator++() {
2953     ++Iter;
2954     return *this;
2955   }
2956 
2957   TemplateArgumentLocInventIterator operator++(int) {
2958     TemplateArgumentLocInventIterator Old(*this);
2959     ++(*this);
2960     return Old;
2961   }
2962 
2963   reference operator*() const {
2964     TemplateArgumentLoc Result;
2965     Self.InventTemplateArgumentLoc(*Iter, Result);
2966     return Result;
2967   }
2968 
2969   pointer operator->() const { return pointer(**this); }
2970 
2971   friend bool operator==(const TemplateArgumentLocInventIterator &X,
2972                          const TemplateArgumentLocInventIterator &Y) {
2973     return X.Iter == Y.Iter;
2974   }
2975 
2976   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
2977                          const TemplateArgumentLocInventIterator &Y) {
2978     return X.Iter != Y.Iter;
2979   }
2980 };
2981 
2982 template<typename Derived>
2983 template<typename InputIterator>
TransformTemplateArguments(InputIterator First,InputIterator Last,TemplateArgumentListInfo & Outputs)2984 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
2985                                                         InputIterator Last,
2986                                             TemplateArgumentListInfo &Outputs) {
2987   for (; First != Last; ++First) {
2988     TemplateArgumentLoc Out;
2989     TemplateArgumentLoc In = *First;
2990 
2991     if (In.getArgument().getKind() == TemplateArgument::Pack) {
2992       // Unpack argument packs, which we translate them into separate
2993       // arguments.
2994       // FIXME: We could do much better if we could guarantee that the
2995       // TemplateArgumentLocInfo for the pack expansion would be usable for
2996       // all of the template arguments in the argument pack.
2997       typedef TemplateArgumentLocInventIterator<Derived,
2998                                                 TemplateArgument::pack_iterator>
2999         PackLocIterator;
3000       if (TransformTemplateArguments(PackLocIterator(*this,
3001                                                  In.getArgument().pack_begin()),
3002                                      PackLocIterator(*this,
3003                                                    In.getArgument().pack_end()),
3004                                      Outputs))
3005         return true;
3006 
3007       continue;
3008     }
3009 
3010     if (In.getArgument().isPackExpansion()) {
3011       // We have a pack expansion, for which we will be substituting into
3012       // the pattern.
3013       SourceLocation Ellipsis;
3014       llvm::Optional<unsigned> OrigNumExpansions;
3015       TemplateArgumentLoc Pattern
3016         = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions,
3017                                      getSema().Context);
3018 
3019       llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3020       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3021       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3022 
3023       // Determine whether the set of unexpanded parameter packs can and should
3024       // be expanded.
3025       bool Expand = true;
3026       bool RetainExpansion = false;
3027       llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
3028       if (getDerived().TryExpandParameterPacks(Ellipsis,
3029                                                Pattern.getSourceRange(),
3030                                                Unexpanded.data(),
3031                                                Unexpanded.size(),
3032                                                Expand,
3033                                                RetainExpansion,
3034                                                NumExpansions))
3035         return true;
3036 
3037       if (!Expand) {
3038         // The transform has determined that we should perform a simple
3039         // transformation on the pack expansion, producing another pack
3040         // expansion.
3041         TemplateArgumentLoc OutPattern;
3042         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3043         if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
3044           return true;
3045 
3046         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3047                                                 NumExpansions);
3048         if (Out.getArgument().isNull())
3049           return true;
3050 
3051         Outputs.addArgument(Out);
3052         continue;
3053       }
3054 
3055       // The transform has determined that we should perform an elementwise
3056       // expansion of the pattern. Do so.
3057       for (unsigned I = 0; I != *NumExpansions; ++I) {
3058         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3059 
3060         if (getDerived().TransformTemplateArgument(Pattern, Out))
3061           return true;
3062 
3063         if (Out.getArgument().containsUnexpandedParameterPack()) {
3064           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3065                                                   OrigNumExpansions);
3066           if (Out.getArgument().isNull())
3067             return true;
3068         }
3069 
3070         Outputs.addArgument(Out);
3071       }
3072 
3073       // If we're supposed to retain a pack expansion, do so by temporarily
3074       // forgetting the partially-substituted parameter pack.
3075       if (RetainExpansion) {
3076         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3077 
3078         if (getDerived().TransformTemplateArgument(Pattern, Out))
3079           return true;
3080 
3081         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3082                                                 OrigNumExpansions);
3083         if (Out.getArgument().isNull())
3084           return true;
3085 
3086         Outputs.addArgument(Out);
3087       }
3088 
3089       continue;
3090     }
3091 
3092     // The simple case:
3093     if (getDerived().TransformTemplateArgument(In, Out))
3094       return true;
3095 
3096     Outputs.addArgument(Out);
3097   }
3098 
3099   return false;
3100 
3101 }
3102 
3103 //===----------------------------------------------------------------------===//
3104 // Type transformation
3105 //===----------------------------------------------------------------------===//
3106 
3107 template<typename Derived>
TransformType(QualType T)3108 QualType TreeTransform<Derived>::TransformType(QualType T) {
3109   if (getDerived().AlreadyTransformed(T))
3110     return T;
3111 
3112   // Temporary workaround.  All of these transformations should
3113   // eventually turn into transformations on TypeLocs.
3114   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3115                                                 getDerived().getBaseLocation());
3116 
3117   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3118 
3119   if (!NewDI)
3120     return QualType();
3121 
3122   return NewDI->getType();
3123 }
3124 
3125 template<typename Derived>
TransformType(TypeSourceInfo * DI)3126 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3127   if (getDerived().AlreadyTransformed(DI->getType()))
3128     return DI;
3129 
3130   TypeLocBuilder TLB;
3131 
3132   TypeLoc TL = DI->getTypeLoc();
3133   TLB.reserve(TL.getFullDataSize());
3134 
3135   QualType Result = getDerived().TransformType(TLB, TL);
3136   if (Result.isNull())
3137     return 0;
3138 
3139   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3140 }
3141 
3142 template<typename Derived>
3143 QualType
TransformType(TypeLocBuilder & TLB,TypeLoc T)3144 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
3145   switch (T.getTypeLocClass()) {
3146 #define ABSTRACT_TYPELOC(CLASS, PARENT)
3147 #define TYPELOC(CLASS, PARENT) \
3148   case TypeLoc::CLASS: \
3149     return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
3150 #include "clang/AST/TypeLocNodes.def"
3151   }
3152 
3153   llvm_unreachable("unhandled type loc!");
3154   return QualType();
3155 }
3156 
3157 /// FIXME: By default, this routine adds type qualifiers only to types
3158 /// that can have qualifiers, and silently suppresses those qualifiers
3159 /// that are not permitted (e.g., qualifiers on reference or function
3160 /// types). This is the right thing for template instantiation, but
3161 /// probably not for other clients.
3162 template<typename Derived>
3163 QualType
TransformQualifiedType(TypeLocBuilder & TLB,QualifiedTypeLoc T)3164 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
3165                                                QualifiedTypeLoc T) {
3166   Qualifiers Quals = T.getType().getLocalQualifiers();
3167 
3168   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
3169   if (Result.isNull())
3170     return QualType();
3171 
3172   // Silently suppress qualifiers if the result type can't be qualified.
3173   // FIXME: this is the right thing for template instantiation, but
3174   // probably not for other clients.
3175   if (Result->isFunctionType() || Result->isReferenceType())
3176     return Result;
3177 
3178   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
3179   // resulting type.
3180   if (Quals.hasObjCLifetime()) {
3181     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
3182       Quals.removeObjCLifetime();
3183     else if (Result.getObjCLifetime()) {
3184       // Objective-C ARC:
3185       //   A lifetime qualifier applied to a substituted template parameter
3186       //   overrides the lifetime qualifier from the template argument.
3187       if (const SubstTemplateTypeParmType *SubstTypeParam
3188                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
3189         QualType Replacement = SubstTypeParam->getReplacementType();
3190         Qualifiers Qs = Replacement.getQualifiers();
3191         Qs.removeObjCLifetime();
3192         Replacement
3193           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
3194                                              Qs);
3195         Result = SemaRef.Context.getSubstTemplateTypeParmType(
3196                                         SubstTypeParam->getReplacedParameter(),
3197                                                               Replacement);
3198         TLB.TypeWasModifiedSafely(Result);
3199       } else {
3200         // Otherwise, complain about the addition of a qualifier to an
3201         // already-qualified type.
3202         SourceRange R = TLB.getTemporaryTypeLoc(Result).getSourceRange();
3203         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
3204           << Result << R;
3205 
3206         Quals.removeObjCLifetime();
3207       }
3208     }
3209   }
3210   if (!Quals.empty()) {
3211     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
3212     TLB.push<QualifiedTypeLoc>(Result);
3213     // No location information to preserve.
3214   }
3215 
3216   return Result;
3217 }
3218 
3219 template<typename Derived>
3220 TypeLoc
TransformTypeInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3221 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
3222                                                    QualType ObjectType,
3223                                                    NamedDecl *UnqualLookup,
3224                                                    CXXScopeSpec &SS) {
3225   QualType T = TL.getType();
3226   if (getDerived().AlreadyTransformed(T))
3227     return TL;
3228 
3229   TypeLocBuilder TLB;
3230   QualType Result;
3231 
3232   if (isa<TemplateSpecializationType>(T)) {
3233     TemplateSpecializationTypeLoc SpecTL
3234       = cast<TemplateSpecializationTypeLoc>(TL);
3235 
3236     TemplateName Template =
3237       getDerived().TransformTemplateName(SS,
3238                                          SpecTL.getTypePtr()->getTemplateName(),
3239                                          SpecTL.getTemplateNameLoc(),
3240                                          ObjectType, UnqualLookup);
3241     if (Template.isNull())
3242       return TypeLoc();
3243 
3244     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3245                                                               Template);
3246   } else if (isa<DependentTemplateSpecializationType>(T)) {
3247     DependentTemplateSpecializationTypeLoc SpecTL
3248       = cast<DependentTemplateSpecializationTypeLoc>(TL);
3249 
3250     TemplateName Template
3251       = getDerived().RebuildTemplateName(SS,
3252                                          *SpecTL.getTypePtr()->getIdentifier(),
3253                                          SpecTL.getNameLoc(),
3254                                          ObjectType, UnqualLookup);
3255     if (Template.isNull())
3256       return TypeLoc();
3257 
3258     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3259                                                                        SpecTL,
3260                                                                      Template,
3261                                                                        SS);
3262   } else {
3263     // Nothing special needs to be done for these.
3264     Result = getDerived().TransformType(TLB, TL);
3265   }
3266 
3267   if (Result.isNull())
3268     return TypeLoc();
3269 
3270   return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc();
3271 }
3272 
3273 template<typename Derived>
3274 TypeSourceInfo *
TransformTypeInObjectScope(TypeSourceInfo * TSInfo,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3275 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3276                                                    QualType ObjectType,
3277                                                    NamedDecl *UnqualLookup,
3278                                                    CXXScopeSpec &SS) {
3279   // FIXME: Painfully copy-paste from the above!
3280 
3281   QualType T = TSInfo->getType();
3282   if (getDerived().AlreadyTransformed(T))
3283     return TSInfo;
3284 
3285   TypeLocBuilder TLB;
3286   QualType Result;
3287 
3288   TypeLoc TL = TSInfo->getTypeLoc();
3289   if (isa<TemplateSpecializationType>(T)) {
3290     TemplateSpecializationTypeLoc SpecTL
3291       = cast<TemplateSpecializationTypeLoc>(TL);
3292 
3293     TemplateName Template
3294     = getDerived().TransformTemplateName(SS,
3295                                          SpecTL.getTypePtr()->getTemplateName(),
3296                                          SpecTL.getTemplateNameLoc(),
3297                                          ObjectType, UnqualLookup);
3298     if (Template.isNull())
3299       return 0;
3300 
3301     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3302                                                               Template);
3303   } else if (isa<DependentTemplateSpecializationType>(T)) {
3304     DependentTemplateSpecializationTypeLoc SpecTL
3305       = cast<DependentTemplateSpecializationTypeLoc>(TL);
3306 
3307     TemplateName Template
3308       = getDerived().RebuildTemplateName(SS,
3309                                          *SpecTL.getTypePtr()->getIdentifier(),
3310                                          SpecTL.getNameLoc(),
3311                                          ObjectType, UnqualLookup);
3312     if (Template.isNull())
3313       return 0;
3314 
3315     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3316                                                                        SpecTL,
3317                                                                        Template,
3318                                                                        SS);
3319   } else {
3320     // Nothing special needs to be done for these.
3321     Result = getDerived().TransformType(TLB, TL);
3322   }
3323 
3324   if (Result.isNull())
3325     return 0;
3326 
3327   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3328 }
3329 
3330 template <class TyLoc> static inline
TransformTypeSpecType(TypeLocBuilder & TLB,TyLoc T)3331 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
3332   TyLoc NewT = TLB.push<TyLoc>(T.getType());
3333   NewT.setNameLoc(T.getNameLoc());
3334   return T.getType();
3335 }
3336 
3337 template<typename Derived>
TransformBuiltinType(TypeLocBuilder & TLB,BuiltinTypeLoc T)3338 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
3339                                                       BuiltinTypeLoc T) {
3340   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
3341   NewT.setBuiltinLoc(T.getBuiltinLoc());
3342   if (T.needsExtraLocalData())
3343     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
3344   return T.getType();
3345 }
3346 
3347 template<typename Derived>
TransformComplexType(TypeLocBuilder & TLB,ComplexTypeLoc T)3348 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
3349                                                       ComplexTypeLoc T) {
3350   // FIXME: recurse?
3351   return TransformTypeSpecType(TLB, T);
3352 }
3353 
3354 template<typename Derived>
TransformPointerType(TypeLocBuilder & TLB,PointerTypeLoc TL)3355 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
3356                                                       PointerTypeLoc TL) {
3357   QualType PointeeType
3358     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3359   if (PointeeType.isNull())
3360     return QualType();
3361 
3362   QualType Result = TL.getType();
3363   if (PointeeType->getAs<ObjCObjectType>()) {
3364     // A dependent pointer type 'T *' has is being transformed such
3365     // that an Objective-C class type is being replaced for 'T'. The
3366     // resulting pointer type is an ObjCObjectPointerType, not a
3367     // PointerType.
3368     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
3369 
3370     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
3371     NewT.setStarLoc(TL.getStarLoc());
3372     return Result;
3373   }
3374 
3375   if (getDerived().AlwaysRebuild() ||
3376       PointeeType != TL.getPointeeLoc().getType()) {
3377     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
3378     if (Result.isNull())
3379       return QualType();
3380   }
3381 
3382   // Objective-C ARC can add lifetime qualifiers to the type that we're
3383   // pointing to.
3384   TLB.TypeWasModifiedSafely(Result->getPointeeType());
3385 
3386   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
3387   NewT.setSigilLoc(TL.getSigilLoc());
3388   return Result;
3389 }
3390 
3391 template<typename Derived>
3392 QualType
TransformBlockPointerType(TypeLocBuilder & TLB,BlockPointerTypeLoc TL)3393 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
3394                                                   BlockPointerTypeLoc TL) {
3395   QualType PointeeType
3396     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3397   if (PointeeType.isNull())
3398     return QualType();
3399 
3400   QualType Result = TL.getType();
3401   if (getDerived().AlwaysRebuild() ||
3402       PointeeType != TL.getPointeeLoc().getType()) {
3403     Result = getDerived().RebuildBlockPointerType(PointeeType,
3404                                                   TL.getSigilLoc());
3405     if (Result.isNull())
3406       return QualType();
3407   }
3408 
3409   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
3410   NewT.setSigilLoc(TL.getSigilLoc());
3411   return Result;
3412 }
3413 
3414 /// Transforms a reference type.  Note that somewhat paradoxically we
3415 /// don't care whether the type itself is an l-value type or an r-value
3416 /// type;  we only care if the type was *written* as an l-value type
3417 /// or an r-value type.
3418 template<typename Derived>
3419 QualType
TransformReferenceType(TypeLocBuilder & TLB,ReferenceTypeLoc TL)3420 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
3421                                                ReferenceTypeLoc TL) {
3422   const ReferenceType *T = TL.getTypePtr();
3423 
3424   // Note that this works with the pointee-as-written.
3425   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
3426   if (PointeeType.isNull())
3427     return QualType();
3428 
3429   QualType Result = TL.getType();
3430   if (getDerived().AlwaysRebuild() ||
3431       PointeeType != T->getPointeeTypeAsWritten()) {
3432     Result = getDerived().RebuildReferenceType(PointeeType,
3433                                                T->isSpelledAsLValue(),
3434                                                TL.getSigilLoc());
3435     if (Result.isNull())
3436       return QualType();
3437   }
3438 
3439   // Objective-C ARC can add lifetime qualifiers to the type that we're
3440   // referring to.
3441   TLB.TypeWasModifiedSafely(
3442                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
3443 
3444   // r-value references can be rebuilt as l-value references.
3445   ReferenceTypeLoc NewTL;
3446   if (isa<LValueReferenceType>(Result))
3447     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
3448   else
3449     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
3450   NewTL.setSigilLoc(TL.getSigilLoc());
3451 
3452   return Result;
3453 }
3454 
3455 template<typename Derived>
3456 QualType
TransformLValueReferenceType(TypeLocBuilder & TLB,LValueReferenceTypeLoc TL)3457 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
3458                                                  LValueReferenceTypeLoc TL) {
3459   return TransformReferenceType(TLB, TL);
3460 }
3461 
3462 template<typename Derived>
3463 QualType
TransformRValueReferenceType(TypeLocBuilder & TLB,RValueReferenceTypeLoc TL)3464 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
3465                                                  RValueReferenceTypeLoc TL) {
3466   return TransformReferenceType(TLB, TL);
3467 }
3468 
3469 template<typename Derived>
3470 QualType
TransformMemberPointerType(TypeLocBuilder & TLB,MemberPointerTypeLoc TL)3471 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
3472                                                    MemberPointerTypeLoc TL) {
3473   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
3474   if (PointeeType.isNull())
3475     return QualType();
3476 
3477   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
3478   TypeSourceInfo* NewClsTInfo = 0;
3479   if (OldClsTInfo) {
3480     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
3481     if (!NewClsTInfo)
3482       return QualType();
3483   }
3484 
3485   const MemberPointerType *T = TL.getTypePtr();
3486   QualType OldClsType = QualType(T->getClass(), 0);
3487   QualType NewClsType;
3488   if (NewClsTInfo)
3489     NewClsType = NewClsTInfo->getType();
3490   else {
3491     NewClsType = getDerived().TransformType(OldClsType);
3492     if (NewClsType.isNull())
3493       return QualType();
3494   }
3495 
3496   QualType Result = TL.getType();
3497   if (getDerived().AlwaysRebuild() ||
3498       PointeeType != T->getPointeeType() ||
3499       NewClsType != OldClsType) {
3500     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
3501                                                    TL.getStarLoc());
3502     if (Result.isNull())
3503       return QualType();
3504   }
3505 
3506   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
3507   NewTL.setSigilLoc(TL.getSigilLoc());
3508   NewTL.setClassTInfo(NewClsTInfo);
3509 
3510   return Result;
3511 }
3512 
3513 template<typename Derived>
3514 QualType
TransformConstantArrayType(TypeLocBuilder & TLB,ConstantArrayTypeLoc TL)3515 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
3516                                                    ConstantArrayTypeLoc TL) {
3517   const ConstantArrayType *T = TL.getTypePtr();
3518   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3519   if (ElementType.isNull())
3520     return QualType();
3521 
3522   QualType Result = TL.getType();
3523   if (getDerived().AlwaysRebuild() ||
3524       ElementType != T->getElementType()) {
3525     Result = getDerived().RebuildConstantArrayType(ElementType,
3526                                                    T->getSizeModifier(),
3527                                                    T->getSize(),
3528                                              T->getIndexTypeCVRQualifiers(),
3529                                                    TL.getBracketsRange());
3530     if (Result.isNull())
3531       return QualType();
3532   }
3533 
3534   ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
3535   NewTL.setLBracketLoc(TL.getLBracketLoc());
3536   NewTL.setRBracketLoc(TL.getRBracketLoc());
3537 
3538   Expr *Size = TL.getSizeExpr();
3539   if (Size) {
3540     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3541     Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
3542   }
3543   NewTL.setSizeExpr(Size);
3544 
3545   return Result;
3546 }
3547 
3548 template<typename Derived>
TransformIncompleteArrayType(TypeLocBuilder & TLB,IncompleteArrayTypeLoc TL)3549 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
3550                                               TypeLocBuilder &TLB,
3551                                               IncompleteArrayTypeLoc TL) {
3552   const IncompleteArrayType *T = TL.getTypePtr();
3553   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3554   if (ElementType.isNull())
3555     return QualType();
3556 
3557   QualType Result = TL.getType();
3558   if (getDerived().AlwaysRebuild() ||
3559       ElementType != T->getElementType()) {
3560     Result = getDerived().RebuildIncompleteArrayType(ElementType,
3561                                                      T->getSizeModifier(),
3562                                            T->getIndexTypeCVRQualifiers(),
3563                                                      TL.getBracketsRange());
3564     if (Result.isNull())
3565       return QualType();
3566   }
3567 
3568   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
3569   NewTL.setLBracketLoc(TL.getLBracketLoc());
3570   NewTL.setRBracketLoc(TL.getRBracketLoc());
3571   NewTL.setSizeExpr(0);
3572 
3573   return Result;
3574 }
3575 
3576 template<typename Derived>
3577 QualType
TransformVariableArrayType(TypeLocBuilder & TLB,VariableArrayTypeLoc TL)3578 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
3579                                                    VariableArrayTypeLoc TL) {
3580   const VariableArrayType *T = TL.getTypePtr();
3581   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3582   if (ElementType.isNull())
3583     return QualType();
3584 
3585   // Array bounds are not potentially evaluated contexts
3586   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3587 
3588   ExprResult SizeResult
3589     = getDerived().TransformExpr(T->getSizeExpr());
3590   if (SizeResult.isInvalid())
3591     return QualType();
3592 
3593   Expr *Size = SizeResult.take();
3594 
3595   QualType Result = TL.getType();
3596   if (getDerived().AlwaysRebuild() ||
3597       ElementType != T->getElementType() ||
3598       Size != T->getSizeExpr()) {
3599     Result = getDerived().RebuildVariableArrayType(ElementType,
3600                                                    T->getSizeModifier(),
3601                                                    Size,
3602                                              T->getIndexTypeCVRQualifiers(),
3603                                                    TL.getBracketsRange());
3604     if (Result.isNull())
3605       return QualType();
3606   }
3607 
3608   VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
3609   NewTL.setLBracketLoc(TL.getLBracketLoc());
3610   NewTL.setRBracketLoc(TL.getRBracketLoc());
3611   NewTL.setSizeExpr(Size);
3612 
3613   return Result;
3614 }
3615 
3616 template<typename Derived>
3617 QualType
TransformDependentSizedArrayType(TypeLocBuilder & TLB,DependentSizedArrayTypeLoc TL)3618 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
3619                                              DependentSizedArrayTypeLoc TL) {
3620   const DependentSizedArrayType *T = TL.getTypePtr();
3621   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3622   if (ElementType.isNull())
3623     return QualType();
3624 
3625   // Array bounds are not potentially evaluated contexts
3626   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3627 
3628   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
3629   Expr *origSize = TL.getSizeExpr();
3630   if (!origSize) origSize = T->getSizeExpr();
3631 
3632   ExprResult sizeResult
3633     = getDerived().TransformExpr(origSize);
3634   if (sizeResult.isInvalid())
3635     return QualType();
3636 
3637   Expr *size = sizeResult.get();
3638 
3639   QualType Result = TL.getType();
3640   if (getDerived().AlwaysRebuild() ||
3641       ElementType != T->getElementType() ||
3642       size != origSize) {
3643     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
3644                                                          T->getSizeModifier(),
3645                                                          size,
3646                                                 T->getIndexTypeCVRQualifiers(),
3647                                                         TL.getBracketsRange());
3648     if (Result.isNull())
3649       return QualType();
3650   }
3651 
3652   // We might have any sort of array type now, but fortunately they
3653   // all have the same location layout.
3654   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
3655   NewTL.setLBracketLoc(TL.getLBracketLoc());
3656   NewTL.setRBracketLoc(TL.getRBracketLoc());
3657   NewTL.setSizeExpr(size);
3658 
3659   return Result;
3660 }
3661 
3662 template<typename Derived>
TransformDependentSizedExtVectorType(TypeLocBuilder & TLB,DependentSizedExtVectorTypeLoc TL)3663 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
3664                                       TypeLocBuilder &TLB,
3665                                       DependentSizedExtVectorTypeLoc TL) {
3666   const DependentSizedExtVectorType *T = TL.getTypePtr();
3667 
3668   // FIXME: ext vector locs should be nested
3669   QualType ElementType = getDerived().TransformType(T->getElementType());
3670   if (ElementType.isNull())
3671     return QualType();
3672 
3673   // Vector sizes are not potentially evaluated contexts
3674   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3675 
3676   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
3677   if (Size.isInvalid())
3678     return QualType();
3679 
3680   QualType Result = TL.getType();
3681   if (getDerived().AlwaysRebuild() ||
3682       ElementType != T->getElementType() ||
3683       Size.get() != T->getSizeExpr()) {
3684     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
3685                                                              Size.take(),
3686                                                          T->getAttributeLoc());
3687     if (Result.isNull())
3688       return QualType();
3689   }
3690 
3691   // Result might be dependent or not.
3692   if (isa<DependentSizedExtVectorType>(Result)) {
3693     DependentSizedExtVectorTypeLoc NewTL
3694       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
3695     NewTL.setNameLoc(TL.getNameLoc());
3696   } else {
3697     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
3698     NewTL.setNameLoc(TL.getNameLoc());
3699   }
3700 
3701   return Result;
3702 }
3703 
3704 template<typename Derived>
TransformVectorType(TypeLocBuilder & TLB,VectorTypeLoc TL)3705 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
3706                                                      VectorTypeLoc TL) {
3707   const VectorType *T = TL.getTypePtr();
3708   QualType ElementType = getDerived().TransformType(T->getElementType());
3709   if (ElementType.isNull())
3710     return QualType();
3711 
3712   QualType Result = TL.getType();
3713   if (getDerived().AlwaysRebuild() ||
3714       ElementType != T->getElementType()) {
3715     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
3716                                             T->getVectorKind());
3717     if (Result.isNull())
3718       return QualType();
3719   }
3720 
3721   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
3722   NewTL.setNameLoc(TL.getNameLoc());
3723 
3724   return Result;
3725 }
3726 
3727 template<typename Derived>
TransformExtVectorType(TypeLocBuilder & TLB,ExtVectorTypeLoc TL)3728 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
3729                                                         ExtVectorTypeLoc TL) {
3730   const VectorType *T = TL.getTypePtr();
3731   QualType ElementType = getDerived().TransformType(T->getElementType());
3732   if (ElementType.isNull())
3733     return QualType();
3734 
3735   QualType Result = TL.getType();
3736   if (getDerived().AlwaysRebuild() ||
3737       ElementType != T->getElementType()) {
3738     Result = getDerived().RebuildExtVectorType(ElementType,
3739                                                T->getNumElements(),
3740                                                /*FIXME*/ SourceLocation());
3741     if (Result.isNull())
3742       return QualType();
3743   }
3744 
3745   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
3746   NewTL.setNameLoc(TL.getNameLoc());
3747 
3748   return Result;
3749 }
3750 
3751 template<typename Derived>
3752 ParmVarDecl *
TransformFunctionTypeParam(ParmVarDecl * OldParm,int indexAdjustment,llvm::Optional<unsigned> NumExpansions)3753 TreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm,
3754                                                    int indexAdjustment,
3755                                        llvm::Optional<unsigned> NumExpansions) {
3756   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
3757   TypeSourceInfo *NewDI = 0;
3758 
3759   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
3760     // If we're substituting into a pack expansion type and we know the
3761     TypeLoc OldTL = OldDI->getTypeLoc();
3762     PackExpansionTypeLoc OldExpansionTL = cast<PackExpansionTypeLoc>(OldTL);
3763 
3764     TypeLocBuilder TLB;
3765     TypeLoc NewTL = OldDI->getTypeLoc();
3766     TLB.reserve(NewTL.getFullDataSize());
3767 
3768     QualType Result = getDerived().TransformType(TLB,
3769                                                OldExpansionTL.getPatternLoc());
3770     if (Result.isNull())
3771       return 0;
3772 
3773     Result = RebuildPackExpansionType(Result,
3774                                 OldExpansionTL.getPatternLoc().getSourceRange(),
3775                                       OldExpansionTL.getEllipsisLoc(),
3776                                       NumExpansions);
3777     if (Result.isNull())
3778       return 0;
3779 
3780     PackExpansionTypeLoc NewExpansionTL
3781       = TLB.push<PackExpansionTypeLoc>(Result);
3782     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
3783     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
3784   } else
3785     NewDI = getDerived().TransformType(OldDI);
3786   if (!NewDI)
3787     return 0;
3788 
3789   if (NewDI == OldDI && indexAdjustment == 0)
3790     return OldParm;
3791 
3792   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
3793                                              OldParm->getDeclContext(),
3794                                              OldParm->getInnerLocStart(),
3795                                              OldParm->getLocation(),
3796                                              OldParm->getIdentifier(),
3797                                              NewDI->getType(),
3798                                              NewDI,
3799                                              OldParm->getStorageClass(),
3800                                              OldParm->getStorageClassAsWritten(),
3801                                              /* DefArg */ NULL);
3802   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
3803                         OldParm->getFunctionScopeIndex() + indexAdjustment);
3804   return newParm;
3805 }
3806 
3807 template<typename Derived>
3808 bool TreeTransform<Derived>::
TransformFunctionTypeParams(SourceLocation Loc,ParmVarDecl ** Params,unsigned NumParams,const QualType * ParamTypes,llvm::SmallVectorImpl<QualType> & OutParamTypes,llvm::SmallVectorImpl<ParmVarDecl * > * PVars)3809   TransformFunctionTypeParams(SourceLocation Loc,
3810                               ParmVarDecl **Params, unsigned NumParams,
3811                               const QualType *ParamTypes,
3812                               llvm::SmallVectorImpl<QualType> &OutParamTypes,
3813                               llvm::SmallVectorImpl<ParmVarDecl*> *PVars) {
3814   int indexAdjustment = 0;
3815 
3816   for (unsigned i = 0; i != NumParams; ++i) {
3817     if (ParmVarDecl *OldParm = Params[i]) {
3818       assert(OldParm->getFunctionScopeIndex() == i);
3819 
3820       llvm::Optional<unsigned> NumExpansions;
3821       ParmVarDecl *NewParm = 0;
3822       if (OldParm->isParameterPack()) {
3823         // We have a function parameter pack that may need to be expanded.
3824         llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3825 
3826         // Find the parameter packs that could be expanded.
3827         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
3828         PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL);
3829         TypeLoc Pattern = ExpansionTL.getPatternLoc();
3830         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3831         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
3832 
3833         // Determine whether we should expand the parameter packs.
3834         bool ShouldExpand = false;
3835         bool RetainExpansion = false;
3836         llvm::Optional<unsigned> OrigNumExpansions
3837           = ExpansionTL.getTypePtr()->getNumExpansions();
3838         NumExpansions = OrigNumExpansions;
3839         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
3840                                                  Pattern.getSourceRange(),
3841                                                  Unexpanded.data(),
3842                                                  Unexpanded.size(),
3843                                                  ShouldExpand,
3844                                                  RetainExpansion,
3845                                                  NumExpansions)) {
3846           return true;
3847         }
3848 
3849         if (ShouldExpand) {
3850           // Expand the function parameter pack into multiple, separate
3851           // parameters.
3852           getDerived().ExpandingFunctionParameterPack(OldParm);
3853           for (unsigned I = 0; I != *NumExpansions; ++I) {
3854             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3855             ParmVarDecl *NewParm
3856               = getDerived().TransformFunctionTypeParam(OldParm,
3857                                                         indexAdjustment++,
3858                                                         OrigNumExpansions);
3859             if (!NewParm)
3860               return true;
3861 
3862             OutParamTypes.push_back(NewParm->getType());
3863             if (PVars)
3864               PVars->push_back(NewParm);
3865           }
3866 
3867           // If we're supposed to retain a pack expansion, do so by temporarily
3868           // forgetting the partially-substituted parameter pack.
3869           if (RetainExpansion) {
3870             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3871             ParmVarDecl *NewParm
3872               = getDerived().TransformFunctionTypeParam(OldParm,
3873                                                         indexAdjustment++,
3874                                                         OrigNumExpansions);
3875             if (!NewParm)
3876               return true;
3877 
3878             OutParamTypes.push_back(NewParm->getType());
3879             if (PVars)
3880               PVars->push_back(NewParm);
3881           }
3882 
3883           // The next parameter should have the same adjustment as the
3884           // last thing we pushed, but we post-incremented indexAdjustment
3885           // on every push.  Also, if we push nothing, the adjustment should
3886           // go down by one.
3887           indexAdjustment--;
3888 
3889           // We're done with the pack expansion.
3890           continue;
3891         }
3892 
3893         // We'll substitute the parameter now without expanding the pack
3894         // expansion.
3895         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3896         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
3897                                                           indexAdjustment,
3898                                                           NumExpansions);
3899       } else {
3900         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
3901                                                           indexAdjustment,
3902                                                   llvm::Optional<unsigned>());
3903       }
3904 
3905       if (!NewParm)
3906         return true;
3907 
3908       OutParamTypes.push_back(NewParm->getType());
3909       if (PVars)
3910         PVars->push_back(NewParm);
3911       continue;
3912     }
3913 
3914     // Deal with the possibility that we don't have a parameter
3915     // declaration for this parameter.
3916     QualType OldType = ParamTypes[i];
3917     bool IsPackExpansion = false;
3918     llvm::Optional<unsigned> NumExpansions;
3919     QualType NewType;
3920     if (const PackExpansionType *Expansion
3921                                        = dyn_cast<PackExpansionType>(OldType)) {
3922       // We have a function parameter pack that may need to be expanded.
3923       QualType Pattern = Expansion->getPattern();
3924       llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3925       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3926 
3927       // Determine whether we should expand the parameter packs.
3928       bool ShouldExpand = false;
3929       bool RetainExpansion = false;
3930       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
3931                                                Unexpanded.data(),
3932                                                Unexpanded.size(),
3933                                                ShouldExpand,
3934                                                RetainExpansion,
3935                                                NumExpansions)) {
3936         return true;
3937       }
3938 
3939       if (ShouldExpand) {
3940         // Expand the function parameter pack into multiple, separate
3941         // parameters.
3942         for (unsigned I = 0; I != *NumExpansions; ++I) {
3943           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3944           QualType NewType = getDerived().TransformType(Pattern);
3945           if (NewType.isNull())
3946             return true;
3947 
3948           OutParamTypes.push_back(NewType);
3949           if (PVars)
3950             PVars->push_back(0);
3951         }
3952 
3953         // We're done with the pack expansion.
3954         continue;
3955       }
3956 
3957       // If we're supposed to retain a pack expansion, do so by temporarily
3958       // forgetting the partially-substituted parameter pack.
3959       if (RetainExpansion) {
3960         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3961         QualType NewType = getDerived().TransformType(Pattern);
3962         if (NewType.isNull())
3963           return true;
3964 
3965         OutParamTypes.push_back(NewType);
3966         if (PVars)
3967           PVars->push_back(0);
3968       }
3969 
3970       // We'll substitute the parameter now without expanding the pack
3971       // expansion.
3972       OldType = Expansion->getPattern();
3973       IsPackExpansion = true;
3974       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3975       NewType = getDerived().TransformType(OldType);
3976     } else {
3977       NewType = getDerived().TransformType(OldType);
3978     }
3979 
3980     if (NewType.isNull())
3981       return true;
3982 
3983     if (IsPackExpansion)
3984       NewType = getSema().Context.getPackExpansionType(NewType,
3985                                                        NumExpansions);
3986 
3987     OutParamTypes.push_back(NewType);
3988     if (PVars)
3989       PVars->push_back(0);
3990   }
3991 
3992 #ifndef NDEBUG
3993   if (PVars) {
3994     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
3995       if (ParmVarDecl *parm = (*PVars)[i])
3996         assert(parm->getFunctionScopeIndex() == i);
3997   }
3998 #endif
3999 
4000   return false;
4001 }
4002 
4003 template<typename Derived>
4004 QualType
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL)4005 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4006                                                    FunctionProtoTypeLoc TL) {
4007   // Transform the parameters and return type.
4008   //
4009   // We instantiate in source order, with the return type first followed by
4010   // the parameters, because users tend to expect this (even if they shouldn't
4011   // rely on it!).
4012   //
4013   // When the function has a trailing return type, we instantiate the
4014   // parameters before the return type,  since the return type can then refer
4015   // to the parameters themselves (via decltype, sizeof, etc.).
4016   //
4017   llvm::SmallVector<QualType, 4> ParamTypes;
4018   llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
4019   const FunctionProtoType *T = TL.getTypePtr();
4020 
4021   QualType ResultType;
4022 
4023   if (TL.getTrailingReturn()) {
4024     if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(),
4025                                                  TL.getParmArray(),
4026                                                  TL.getNumArgs(),
4027                                              TL.getTypePtr()->arg_type_begin(),
4028                                                  ParamTypes, &ParamDecls))
4029       return QualType();
4030 
4031     ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
4032     if (ResultType.isNull())
4033       return QualType();
4034   }
4035   else {
4036     ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
4037     if (ResultType.isNull())
4038       return QualType();
4039 
4040     if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(),
4041                                                  TL.getParmArray(),
4042                                                  TL.getNumArgs(),
4043                                              TL.getTypePtr()->arg_type_begin(),
4044                                                  ParamTypes, &ParamDecls))
4045       return QualType();
4046   }
4047 
4048   QualType Result = TL.getType();
4049   if (getDerived().AlwaysRebuild() ||
4050       ResultType != T->getResultType() ||
4051       T->getNumArgs() != ParamTypes.size() ||
4052       !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
4053     Result = getDerived().RebuildFunctionProtoType(ResultType,
4054                                                    ParamTypes.data(),
4055                                                    ParamTypes.size(),
4056                                                    T->isVariadic(),
4057                                                    T->getTypeQuals(),
4058                                                    T->getRefQualifier(),
4059                                                    T->getExtInfo());
4060     if (Result.isNull())
4061       return QualType();
4062   }
4063 
4064   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
4065   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4066   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4067   NewTL.setTrailingReturn(TL.getTrailingReturn());
4068   for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
4069     NewTL.setArg(i, ParamDecls[i]);
4070 
4071   return Result;
4072 }
4073 
4074 template<typename Derived>
TransformFunctionNoProtoType(TypeLocBuilder & TLB,FunctionNoProtoTypeLoc TL)4075 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
4076                                                  TypeLocBuilder &TLB,
4077                                                  FunctionNoProtoTypeLoc TL) {
4078   const FunctionNoProtoType *T = TL.getTypePtr();
4079   QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
4080   if (ResultType.isNull())
4081     return QualType();
4082 
4083   QualType Result = TL.getType();
4084   if (getDerived().AlwaysRebuild() ||
4085       ResultType != T->getResultType())
4086     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
4087 
4088   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
4089   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4090   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4091   NewTL.setTrailingReturn(false);
4092 
4093   return Result;
4094 }
4095 
4096 template<typename Derived> QualType
TransformUnresolvedUsingType(TypeLocBuilder & TLB,UnresolvedUsingTypeLoc TL)4097 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
4098                                                  UnresolvedUsingTypeLoc TL) {
4099   const UnresolvedUsingType *T = TL.getTypePtr();
4100   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
4101   if (!D)
4102     return QualType();
4103 
4104   QualType Result = TL.getType();
4105   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
4106     Result = getDerived().RebuildUnresolvedUsingType(D);
4107     if (Result.isNull())
4108       return QualType();
4109   }
4110 
4111   // We might get an arbitrary type spec type back.  We should at
4112   // least always get a type spec type, though.
4113   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
4114   NewTL.setNameLoc(TL.getNameLoc());
4115 
4116   return Result;
4117 }
4118 
4119 template<typename Derived>
TransformTypedefType(TypeLocBuilder & TLB,TypedefTypeLoc TL)4120 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
4121                                                       TypedefTypeLoc TL) {
4122   const TypedefType *T = TL.getTypePtr();
4123   TypedefNameDecl *Typedef
4124     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4125                                                                T->getDecl()));
4126   if (!Typedef)
4127     return QualType();
4128 
4129   QualType Result = TL.getType();
4130   if (getDerived().AlwaysRebuild() ||
4131       Typedef != T->getDecl()) {
4132     Result = getDerived().RebuildTypedefType(Typedef);
4133     if (Result.isNull())
4134       return QualType();
4135   }
4136 
4137   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
4138   NewTL.setNameLoc(TL.getNameLoc());
4139 
4140   return Result;
4141 }
4142 
4143 template<typename Derived>
TransformTypeOfExprType(TypeLocBuilder & TLB,TypeOfExprTypeLoc TL)4144 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
4145                                                       TypeOfExprTypeLoc TL) {
4146   // typeof expressions are not potentially evaluated contexts
4147   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
4148 
4149   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
4150   if (E.isInvalid())
4151     return QualType();
4152 
4153   QualType Result = TL.getType();
4154   if (getDerived().AlwaysRebuild() ||
4155       E.get() != TL.getUnderlyingExpr()) {
4156     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
4157     if (Result.isNull())
4158       return QualType();
4159   }
4160   else E.take();
4161 
4162   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
4163   NewTL.setTypeofLoc(TL.getTypeofLoc());
4164   NewTL.setLParenLoc(TL.getLParenLoc());
4165   NewTL.setRParenLoc(TL.getRParenLoc());
4166 
4167   return Result;
4168 }
4169 
4170 template<typename Derived>
TransformTypeOfType(TypeLocBuilder & TLB,TypeOfTypeLoc TL)4171 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
4172                                                      TypeOfTypeLoc TL) {
4173   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
4174   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
4175   if (!New_Under_TI)
4176     return QualType();
4177 
4178   QualType Result = TL.getType();
4179   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
4180     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
4181     if (Result.isNull())
4182       return QualType();
4183   }
4184 
4185   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
4186   NewTL.setTypeofLoc(TL.getTypeofLoc());
4187   NewTL.setLParenLoc(TL.getLParenLoc());
4188   NewTL.setRParenLoc(TL.getRParenLoc());
4189   NewTL.setUnderlyingTInfo(New_Under_TI);
4190 
4191   return Result;
4192 }
4193 
4194 template<typename Derived>
TransformDecltypeType(TypeLocBuilder & TLB,DecltypeTypeLoc TL)4195 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
4196                                                        DecltypeTypeLoc TL) {
4197   const DecltypeType *T = TL.getTypePtr();
4198 
4199   // decltype expressions are not potentially evaluated contexts
4200   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
4201 
4202   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
4203   if (E.isInvalid())
4204     return QualType();
4205 
4206   QualType Result = TL.getType();
4207   if (getDerived().AlwaysRebuild() ||
4208       E.get() != T->getUnderlyingExpr()) {
4209     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
4210     if (Result.isNull())
4211       return QualType();
4212   }
4213   else E.take();
4214 
4215   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
4216   NewTL.setNameLoc(TL.getNameLoc());
4217 
4218   return Result;
4219 }
4220 
4221 template<typename Derived>
TransformUnaryTransformType(TypeLocBuilder & TLB,UnaryTransformTypeLoc TL)4222 QualType TreeTransform<Derived>::TransformUnaryTransformType(
4223                                                             TypeLocBuilder &TLB,
4224                                                      UnaryTransformTypeLoc TL) {
4225   QualType Result = TL.getType();
4226   if (Result->isDependentType()) {
4227     const UnaryTransformType *T = TL.getTypePtr();
4228     QualType NewBase =
4229       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
4230     Result = getDerived().RebuildUnaryTransformType(NewBase,
4231                                                     T->getUTTKind(),
4232                                                     TL.getKWLoc());
4233     if (Result.isNull())
4234       return QualType();
4235   }
4236 
4237   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
4238   NewTL.setKWLoc(TL.getKWLoc());
4239   NewTL.setParensRange(TL.getParensRange());
4240   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
4241   return Result;
4242 }
4243 
4244 template<typename Derived>
TransformAutoType(TypeLocBuilder & TLB,AutoTypeLoc TL)4245 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
4246                                                    AutoTypeLoc TL) {
4247   const AutoType *T = TL.getTypePtr();
4248   QualType OldDeduced = T->getDeducedType();
4249   QualType NewDeduced;
4250   if (!OldDeduced.isNull()) {
4251     NewDeduced = getDerived().TransformType(OldDeduced);
4252     if (NewDeduced.isNull())
4253       return QualType();
4254   }
4255 
4256   QualType Result = TL.getType();
4257   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced) {
4258     Result = getDerived().RebuildAutoType(NewDeduced);
4259     if (Result.isNull())
4260       return QualType();
4261   }
4262 
4263   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
4264   NewTL.setNameLoc(TL.getNameLoc());
4265 
4266   return Result;
4267 }
4268 
4269 template<typename Derived>
TransformRecordType(TypeLocBuilder & TLB,RecordTypeLoc TL)4270 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
4271                                                      RecordTypeLoc TL) {
4272   const RecordType *T = TL.getTypePtr();
4273   RecordDecl *Record
4274     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4275                                                           T->getDecl()));
4276   if (!Record)
4277     return QualType();
4278 
4279   QualType Result = TL.getType();
4280   if (getDerived().AlwaysRebuild() ||
4281       Record != T->getDecl()) {
4282     Result = getDerived().RebuildRecordType(Record);
4283     if (Result.isNull())
4284       return QualType();
4285   }
4286 
4287   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
4288   NewTL.setNameLoc(TL.getNameLoc());
4289 
4290   return Result;
4291 }
4292 
4293 template<typename Derived>
TransformEnumType(TypeLocBuilder & TLB,EnumTypeLoc TL)4294 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
4295                                                    EnumTypeLoc TL) {
4296   const EnumType *T = TL.getTypePtr();
4297   EnumDecl *Enum
4298     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4299                                                         T->getDecl()));
4300   if (!Enum)
4301     return QualType();
4302 
4303   QualType Result = TL.getType();
4304   if (getDerived().AlwaysRebuild() ||
4305       Enum != T->getDecl()) {
4306     Result = getDerived().RebuildEnumType(Enum);
4307     if (Result.isNull())
4308       return QualType();
4309   }
4310 
4311   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
4312   NewTL.setNameLoc(TL.getNameLoc());
4313 
4314   return Result;
4315 }
4316 
4317 template<typename Derived>
TransformInjectedClassNameType(TypeLocBuilder & TLB,InjectedClassNameTypeLoc TL)4318 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
4319                                          TypeLocBuilder &TLB,
4320                                          InjectedClassNameTypeLoc TL) {
4321   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
4322                                        TL.getTypePtr()->getDecl());
4323   if (!D) return QualType();
4324 
4325   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
4326   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
4327   return T;
4328 }
4329 
4330 template<typename Derived>
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL)4331 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
4332                                                 TypeLocBuilder &TLB,
4333                                                 TemplateTypeParmTypeLoc TL) {
4334   return TransformTypeSpecType(TLB, TL);
4335 }
4336 
4337 template<typename Derived>
TransformSubstTemplateTypeParmType(TypeLocBuilder & TLB,SubstTemplateTypeParmTypeLoc TL)4338 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
4339                                          TypeLocBuilder &TLB,
4340                                          SubstTemplateTypeParmTypeLoc TL) {
4341   const SubstTemplateTypeParmType *T = TL.getTypePtr();
4342 
4343   // Substitute into the replacement type, which itself might involve something
4344   // that needs to be transformed. This only tends to occur with default
4345   // template arguments of template template parameters.
4346   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
4347   QualType Replacement = getDerived().TransformType(T->getReplacementType());
4348   if (Replacement.isNull())
4349     return QualType();
4350 
4351   // Always canonicalize the replacement type.
4352   Replacement = SemaRef.Context.getCanonicalType(Replacement);
4353   QualType Result
4354     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
4355                                                    Replacement);
4356 
4357   // Propagate type-source information.
4358   SubstTemplateTypeParmTypeLoc NewTL
4359     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
4360   NewTL.setNameLoc(TL.getNameLoc());
4361   return Result;
4362 
4363 }
4364 
4365 template<typename Derived>
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL)4366 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
4367                                           TypeLocBuilder &TLB,
4368                                           SubstTemplateTypeParmPackTypeLoc TL) {
4369   return TransformTypeSpecType(TLB, TL);
4370 }
4371 
4372 template<typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL)4373 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
4374                                                         TypeLocBuilder &TLB,
4375                                            TemplateSpecializationTypeLoc TL) {
4376   const TemplateSpecializationType *T = TL.getTypePtr();
4377 
4378   // The nested-name-specifier never matters in a TemplateSpecializationType,
4379   // because we can't have a dependent nested-name-specifier anyway.
4380   CXXScopeSpec SS;
4381   TemplateName Template
4382     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
4383                                          TL.getTemplateNameLoc());
4384   if (Template.isNull())
4385     return QualType();
4386 
4387   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
4388 }
4389 
4390 namespace {
4391   /// \brief Simple iterator that traverses the template arguments in a
4392   /// container that provides a \c getArgLoc() member function.
4393   ///
4394   /// This iterator is intended to be used with the iterator form of
4395   /// \c TreeTransform<Derived>::TransformTemplateArguments().
4396   template<typename ArgLocContainer>
4397   class TemplateArgumentLocContainerIterator {
4398     ArgLocContainer *Container;
4399     unsigned Index;
4400 
4401   public:
4402     typedef TemplateArgumentLoc value_type;
4403     typedef TemplateArgumentLoc reference;
4404     typedef int difference_type;
4405     typedef std::input_iterator_tag iterator_category;
4406 
4407     class pointer {
4408       TemplateArgumentLoc Arg;
4409 
4410     public:
pointer(TemplateArgumentLoc Arg)4411       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4412 
4413       const TemplateArgumentLoc *operator->() const {
4414         return &Arg;
4415       }
4416     };
4417 
4418 
TemplateArgumentLocContainerIterator()4419     TemplateArgumentLocContainerIterator() {}
4420 
TemplateArgumentLocContainerIterator(ArgLocContainer & Container,unsigned Index)4421     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
4422                                  unsigned Index)
4423       : Container(&Container), Index(Index) { }
4424 
4425     TemplateArgumentLocContainerIterator &operator++() {
4426       ++Index;
4427       return *this;
4428     }
4429 
4430     TemplateArgumentLocContainerIterator operator++(int) {
4431       TemplateArgumentLocContainerIterator Old(*this);
4432       ++(*this);
4433       return Old;
4434     }
4435 
4436     TemplateArgumentLoc operator*() const {
4437       return Container->getArgLoc(Index);
4438     }
4439 
4440     pointer operator->() const {
4441       return pointer(Container->getArgLoc(Index));
4442     }
4443 
4444     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
4445                            const TemplateArgumentLocContainerIterator &Y) {
4446       return X.Container == Y.Container && X.Index == Y.Index;
4447     }
4448 
4449     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
4450                            const TemplateArgumentLocContainerIterator &Y) {
4451       return !(X == Y);
4452     }
4453   };
4454 }
4455 
4456 
4457 template <typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL,TemplateName Template)4458 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
4459                                                         TypeLocBuilder &TLB,
4460                                            TemplateSpecializationTypeLoc TL,
4461                                                       TemplateName Template) {
4462   TemplateArgumentListInfo NewTemplateArgs;
4463   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4464   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
4465   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
4466     ArgIterator;
4467   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
4468                                               ArgIterator(TL, TL.getNumArgs()),
4469                                               NewTemplateArgs))
4470     return QualType();
4471 
4472   // FIXME: maybe don't rebuild if all the template arguments are the same.
4473 
4474   QualType Result =
4475     getDerived().RebuildTemplateSpecializationType(Template,
4476                                                    TL.getTemplateNameLoc(),
4477                                                    NewTemplateArgs);
4478 
4479   if (!Result.isNull()) {
4480     // Specializations of template template parameters are represented as
4481     // TemplateSpecializationTypes, and substitution of type alias templates
4482     // within a dependent context can transform them into
4483     // DependentTemplateSpecializationTypes.
4484     if (isa<DependentTemplateSpecializationType>(Result)) {
4485       DependentTemplateSpecializationTypeLoc NewTL
4486         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
4487       NewTL.setKeywordLoc(TL.getTemplateNameLoc());
4488       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
4489       NewTL.setNameLoc(TL.getTemplateNameLoc());
4490       NewTL.setLAngleLoc(TL.getLAngleLoc());
4491       NewTL.setRAngleLoc(TL.getRAngleLoc());
4492       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4493         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4494       return Result;
4495     }
4496 
4497     TemplateSpecializationTypeLoc NewTL
4498       = TLB.push<TemplateSpecializationTypeLoc>(Result);
4499     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
4500     NewTL.setLAngleLoc(TL.getLAngleLoc());
4501     NewTL.setRAngleLoc(TL.getRAngleLoc());
4502     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4503       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4504   }
4505 
4506   return Result;
4507 }
4508 
4509 template <typename Derived>
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,TemplateName Template,CXXScopeSpec & SS)4510 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
4511                                      TypeLocBuilder &TLB,
4512                                      DependentTemplateSpecializationTypeLoc TL,
4513                                      TemplateName Template,
4514                                      CXXScopeSpec &SS) {
4515   TemplateArgumentListInfo NewTemplateArgs;
4516   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4517   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
4518   typedef TemplateArgumentLocContainerIterator<
4519             DependentTemplateSpecializationTypeLoc> ArgIterator;
4520   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
4521                                               ArgIterator(TL, TL.getNumArgs()),
4522                                               NewTemplateArgs))
4523     return QualType();
4524 
4525   // FIXME: maybe don't rebuild if all the template arguments are the same.
4526 
4527   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
4528     QualType Result
4529       = getSema().Context.getDependentTemplateSpecializationType(
4530                                                 TL.getTypePtr()->getKeyword(),
4531                                                          DTN->getQualifier(),
4532                                                          DTN->getIdentifier(),
4533                                                                NewTemplateArgs);
4534 
4535     DependentTemplateSpecializationTypeLoc NewTL
4536       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
4537     NewTL.setKeywordLoc(TL.getKeywordLoc());
4538 
4539     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
4540     NewTL.setNameLoc(TL.getNameLoc());
4541     NewTL.setLAngleLoc(TL.getLAngleLoc());
4542     NewTL.setRAngleLoc(TL.getRAngleLoc());
4543     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4544       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4545     return Result;
4546   }
4547 
4548   QualType Result
4549     = getDerived().RebuildTemplateSpecializationType(Template,
4550                                                      TL.getNameLoc(),
4551                                                      NewTemplateArgs);
4552 
4553   if (!Result.isNull()) {
4554     /// FIXME: Wrap this in an elaborated-type-specifier?
4555     TemplateSpecializationTypeLoc NewTL
4556       = TLB.push<TemplateSpecializationTypeLoc>(Result);
4557     NewTL.setTemplateNameLoc(TL.getNameLoc());
4558     NewTL.setLAngleLoc(TL.getLAngleLoc());
4559     NewTL.setRAngleLoc(TL.getRAngleLoc());
4560     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4561       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4562   }
4563 
4564   return Result;
4565 }
4566 
4567 template<typename Derived>
4568 QualType
TransformElaboratedType(TypeLocBuilder & TLB,ElaboratedTypeLoc TL)4569 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
4570                                                 ElaboratedTypeLoc TL) {
4571   const ElaboratedType *T = TL.getTypePtr();
4572 
4573   NestedNameSpecifierLoc QualifierLoc;
4574   // NOTE: the qualifier in an ElaboratedType is optional.
4575   if (TL.getQualifierLoc()) {
4576     QualifierLoc
4577       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
4578     if (!QualifierLoc)
4579       return QualType();
4580   }
4581 
4582   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
4583   if (NamedT.isNull())
4584     return QualType();
4585 
4586   // C++0x [dcl.type.elab]p2:
4587   //   If the identifier resolves to a typedef-name or the simple-template-id
4588   //   resolves to an alias template specialization, the
4589   //   elaborated-type-specifier is ill-formed.
4590   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
4591     if (const TemplateSpecializationType *TST =
4592           NamedT->getAs<TemplateSpecializationType>()) {
4593       TemplateName Template = TST->getTemplateName();
4594       if (TypeAliasTemplateDecl *TAT =
4595           dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) {
4596         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
4597                      diag::err_tag_reference_non_tag) << 4;
4598         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
4599       }
4600     }
4601   }
4602 
4603   QualType Result = TL.getType();
4604   if (getDerived().AlwaysRebuild() ||
4605       QualifierLoc != TL.getQualifierLoc() ||
4606       NamedT != T->getNamedType()) {
4607     Result = getDerived().RebuildElaboratedType(TL.getKeywordLoc(),
4608                                                 T->getKeyword(),
4609                                                 QualifierLoc, NamedT);
4610     if (Result.isNull())
4611       return QualType();
4612   }
4613 
4614   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
4615   NewTL.setKeywordLoc(TL.getKeywordLoc());
4616   NewTL.setQualifierLoc(QualifierLoc);
4617   return Result;
4618 }
4619 
4620 template<typename Derived>
TransformAttributedType(TypeLocBuilder & TLB,AttributedTypeLoc TL)4621 QualType TreeTransform<Derived>::TransformAttributedType(
4622                                                 TypeLocBuilder &TLB,
4623                                                 AttributedTypeLoc TL) {
4624   const AttributedType *oldType = TL.getTypePtr();
4625   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
4626   if (modifiedType.isNull())
4627     return QualType();
4628 
4629   QualType result = TL.getType();
4630 
4631   // FIXME: dependent operand expressions?
4632   if (getDerived().AlwaysRebuild() ||
4633       modifiedType != oldType->getModifiedType()) {
4634     // TODO: this is really lame; we should really be rebuilding the
4635     // equivalent type from first principles.
4636     QualType equivalentType
4637       = getDerived().TransformType(oldType->getEquivalentType());
4638     if (equivalentType.isNull())
4639       return QualType();
4640     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
4641                                                modifiedType,
4642                                                equivalentType);
4643   }
4644 
4645   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
4646   newTL.setAttrNameLoc(TL.getAttrNameLoc());
4647   if (TL.hasAttrOperand())
4648     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
4649   if (TL.hasAttrExprOperand())
4650     newTL.setAttrExprOperand(TL.getAttrExprOperand());
4651   else if (TL.hasAttrEnumOperand())
4652     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
4653 
4654   return result;
4655 }
4656 
4657 template<typename Derived>
4658 QualType
TransformParenType(TypeLocBuilder & TLB,ParenTypeLoc TL)4659 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
4660                                            ParenTypeLoc TL) {
4661   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
4662   if (Inner.isNull())
4663     return QualType();
4664 
4665   QualType Result = TL.getType();
4666   if (getDerived().AlwaysRebuild() ||
4667       Inner != TL.getInnerLoc().getType()) {
4668     Result = getDerived().RebuildParenType(Inner);
4669     if (Result.isNull())
4670       return QualType();
4671   }
4672 
4673   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
4674   NewTL.setLParenLoc(TL.getLParenLoc());
4675   NewTL.setRParenLoc(TL.getRParenLoc());
4676   return Result;
4677 }
4678 
4679 template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL)4680 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
4681                                                       DependentNameTypeLoc TL) {
4682   const DependentNameType *T = TL.getTypePtr();
4683 
4684   NestedNameSpecifierLoc QualifierLoc
4685     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
4686   if (!QualifierLoc)
4687     return QualType();
4688 
4689   QualType Result
4690     = getDerived().RebuildDependentNameType(T->getKeyword(),
4691                                             TL.getKeywordLoc(),
4692                                             QualifierLoc,
4693                                             T->getIdentifier(),
4694                                             TL.getNameLoc());
4695   if (Result.isNull())
4696     return QualType();
4697 
4698   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
4699     QualType NamedT = ElabT->getNamedType();
4700     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
4701 
4702     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
4703     NewTL.setKeywordLoc(TL.getKeywordLoc());
4704     NewTL.setQualifierLoc(QualifierLoc);
4705   } else {
4706     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
4707     NewTL.setKeywordLoc(TL.getKeywordLoc());
4708     NewTL.setQualifierLoc(QualifierLoc);
4709     NewTL.setNameLoc(TL.getNameLoc());
4710   }
4711   return Result;
4712 }
4713 
4714 template<typename Derived>
4715 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL)4716           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
4717                                  DependentTemplateSpecializationTypeLoc TL) {
4718   NestedNameSpecifierLoc QualifierLoc;
4719   if (TL.getQualifierLoc()) {
4720     QualifierLoc
4721       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
4722     if (!QualifierLoc)
4723       return QualType();
4724   }
4725 
4726   return getDerived()
4727            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
4728 }
4729 
4730 template<typename Derived>
4731 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,NestedNameSpecifierLoc QualifierLoc)4732 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
4733                                    DependentTemplateSpecializationTypeLoc TL,
4734                                        NestedNameSpecifierLoc QualifierLoc) {
4735   const DependentTemplateSpecializationType *T = TL.getTypePtr();
4736 
4737   TemplateArgumentListInfo NewTemplateArgs;
4738   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4739   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
4740 
4741   typedef TemplateArgumentLocContainerIterator<
4742   DependentTemplateSpecializationTypeLoc> ArgIterator;
4743   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
4744                                               ArgIterator(TL, TL.getNumArgs()),
4745                                               NewTemplateArgs))
4746     return QualType();
4747 
4748   QualType Result
4749     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
4750                                                               QualifierLoc,
4751                                                             T->getIdentifier(),
4752                                                             TL.getNameLoc(),
4753                                                             NewTemplateArgs);
4754   if (Result.isNull())
4755     return QualType();
4756 
4757   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
4758     QualType NamedT = ElabT->getNamedType();
4759 
4760     // Copy information relevant to the template specialization.
4761     TemplateSpecializationTypeLoc NamedTL
4762       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
4763     NamedTL.setTemplateNameLoc(TL.getNameLoc());
4764     NamedTL.setLAngleLoc(TL.getLAngleLoc());
4765     NamedTL.setRAngleLoc(TL.getRAngleLoc());
4766     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
4767       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
4768 
4769     // Copy information relevant to the elaborated type.
4770     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
4771     NewTL.setKeywordLoc(TL.getKeywordLoc());
4772     NewTL.setQualifierLoc(QualifierLoc);
4773   } else if (isa<DependentTemplateSpecializationType>(Result)) {
4774     DependentTemplateSpecializationTypeLoc SpecTL
4775       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
4776     SpecTL.setKeywordLoc(TL.getKeywordLoc());
4777     SpecTL.setQualifierLoc(QualifierLoc);
4778     SpecTL.setNameLoc(TL.getNameLoc());
4779     SpecTL.setLAngleLoc(TL.getLAngleLoc());
4780     SpecTL.setRAngleLoc(TL.getRAngleLoc());
4781     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
4782       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
4783   } else {
4784     TemplateSpecializationTypeLoc SpecTL
4785       = TLB.push<TemplateSpecializationTypeLoc>(Result);
4786     SpecTL.setTemplateNameLoc(TL.getNameLoc());
4787     SpecTL.setLAngleLoc(TL.getLAngleLoc());
4788     SpecTL.setRAngleLoc(TL.getRAngleLoc());
4789     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
4790       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
4791   }
4792   return Result;
4793 }
4794 
4795 template<typename Derived>
TransformPackExpansionType(TypeLocBuilder & TLB,PackExpansionTypeLoc TL)4796 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
4797                                                       PackExpansionTypeLoc TL) {
4798   QualType Pattern
4799     = getDerived().TransformType(TLB, TL.getPatternLoc());
4800   if (Pattern.isNull())
4801     return QualType();
4802 
4803   QualType Result = TL.getType();
4804   if (getDerived().AlwaysRebuild() ||
4805       Pattern != TL.getPatternLoc().getType()) {
4806     Result = getDerived().RebuildPackExpansionType(Pattern,
4807                                            TL.getPatternLoc().getSourceRange(),
4808                                                    TL.getEllipsisLoc(),
4809                                            TL.getTypePtr()->getNumExpansions());
4810     if (Result.isNull())
4811       return QualType();
4812   }
4813 
4814   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
4815   NewT.setEllipsisLoc(TL.getEllipsisLoc());
4816   return Result;
4817 }
4818 
4819 template<typename Derived>
4820 QualType
TransformObjCInterfaceType(TypeLocBuilder & TLB,ObjCInterfaceTypeLoc TL)4821 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
4822                                                    ObjCInterfaceTypeLoc TL) {
4823   // ObjCInterfaceType is never dependent.
4824   TLB.pushFullCopy(TL);
4825   return TL.getType();
4826 }
4827 
4828 template<typename Derived>
4829 QualType
TransformObjCObjectType(TypeLocBuilder & TLB,ObjCObjectTypeLoc TL)4830 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
4831                                                 ObjCObjectTypeLoc TL) {
4832   // ObjCObjectType is never dependent.
4833   TLB.pushFullCopy(TL);
4834   return TL.getType();
4835 }
4836 
4837 template<typename Derived>
4838 QualType
TransformObjCObjectPointerType(TypeLocBuilder & TLB,ObjCObjectPointerTypeLoc TL)4839 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
4840                                                ObjCObjectPointerTypeLoc TL) {
4841   // ObjCObjectPointerType is never dependent.
4842   TLB.pushFullCopy(TL);
4843   return TL.getType();
4844 }
4845 
4846 //===----------------------------------------------------------------------===//
4847 // Statement transformation
4848 //===----------------------------------------------------------------------===//
4849 template<typename Derived>
4850 StmtResult
TransformNullStmt(NullStmt * S)4851 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
4852   return SemaRef.Owned(S);
4853 }
4854 
4855 template<typename Derived>
4856 StmtResult
TransformCompoundStmt(CompoundStmt * S)4857 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
4858   return getDerived().TransformCompoundStmt(S, false);
4859 }
4860 
4861 template<typename Derived>
4862 StmtResult
TransformCompoundStmt(CompoundStmt * S,bool IsStmtExpr)4863 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
4864                                               bool IsStmtExpr) {
4865   bool SubStmtInvalid = false;
4866   bool SubStmtChanged = false;
4867   ASTOwningVector<Stmt*> Statements(getSema());
4868   for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
4869        B != BEnd; ++B) {
4870     StmtResult Result = getDerived().TransformStmt(*B);
4871     if (Result.isInvalid()) {
4872       // Immediately fail if this was a DeclStmt, since it's very
4873       // likely that this will cause problems for future statements.
4874       if (isa<DeclStmt>(*B))
4875         return StmtError();
4876 
4877       // Otherwise, just keep processing substatements and fail later.
4878       SubStmtInvalid = true;
4879       continue;
4880     }
4881 
4882     SubStmtChanged = SubStmtChanged || Result.get() != *B;
4883     Statements.push_back(Result.takeAs<Stmt>());
4884   }
4885 
4886   if (SubStmtInvalid)
4887     return StmtError();
4888 
4889   if (!getDerived().AlwaysRebuild() &&
4890       !SubStmtChanged)
4891     return SemaRef.Owned(S);
4892 
4893   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
4894                                           move_arg(Statements),
4895                                           S->getRBracLoc(),
4896                                           IsStmtExpr);
4897 }
4898 
4899 template<typename Derived>
4900 StmtResult
TransformCaseStmt(CaseStmt * S)4901 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
4902   ExprResult LHS, RHS;
4903   {
4904     // The case value expressions are not potentially evaluated.
4905     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
4906 
4907     // Transform the left-hand case value.
4908     LHS = getDerived().TransformExpr(S->getLHS());
4909     if (LHS.isInvalid())
4910       return StmtError();
4911 
4912     // Transform the right-hand case value (for the GNU case-range extension).
4913     RHS = getDerived().TransformExpr(S->getRHS());
4914     if (RHS.isInvalid())
4915       return StmtError();
4916   }
4917 
4918   // Build the case statement.
4919   // Case statements are always rebuilt so that they will attached to their
4920   // transformed switch statement.
4921   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
4922                                                        LHS.get(),
4923                                                        S->getEllipsisLoc(),
4924                                                        RHS.get(),
4925                                                        S->getColonLoc());
4926   if (Case.isInvalid())
4927     return StmtError();
4928 
4929   // Transform the statement following the case
4930   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
4931   if (SubStmt.isInvalid())
4932     return StmtError();
4933 
4934   // Attach the body to the case statement
4935   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
4936 }
4937 
4938 template<typename Derived>
4939 StmtResult
TransformDefaultStmt(DefaultStmt * S)4940 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
4941   // Transform the statement following the default case
4942   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
4943   if (SubStmt.isInvalid())
4944     return StmtError();
4945 
4946   // Default statements are always rebuilt
4947   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
4948                                          SubStmt.get());
4949 }
4950 
4951 template<typename Derived>
4952 StmtResult
TransformLabelStmt(LabelStmt * S)4953 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
4954   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
4955   if (SubStmt.isInvalid())
4956     return StmtError();
4957 
4958   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
4959                                         S->getDecl());
4960   if (!LD)
4961     return StmtError();
4962 
4963 
4964   // FIXME: Pass the real colon location in.
4965   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
4966                                        cast<LabelDecl>(LD), SourceLocation(),
4967                                        SubStmt.get());
4968 }
4969 
4970 template<typename Derived>
4971 StmtResult
TransformIfStmt(IfStmt * S)4972 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
4973   // Transform the condition
4974   ExprResult Cond;
4975   VarDecl *ConditionVar = 0;
4976   if (S->getConditionVariable()) {
4977     ConditionVar
4978       = cast_or_null<VarDecl>(
4979                    getDerived().TransformDefinition(
4980                                       S->getConditionVariable()->getLocation(),
4981                                                     S->getConditionVariable()));
4982     if (!ConditionVar)
4983       return StmtError();
4984   } else {
4985     Cond = getDerived().TransformExpr(S->getCond());
4986 
4987     if (Cond.isInvalid())
4988       return StmtError();
4989 
4990     // Convert the condition to a boolean value.
4991     if (S->getCond()) {
4992       ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(),
4993                                                          Cond.get());
4994       if (CondE.isInvalid())
4995         return StmtError();
4996 
4997       Cond = CondE.get();
4998     }
4999   }
5000 
5001   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
5002   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5003     return StmtError();
5004 
5005   // Transform the "then" branch.
5006   StmtResult Then = getDerived().TransformStmt(S->getThen());
5007   if (Then.isInvalid())
5008     return StmtError();
5009 
5010   // Transform the "else" branch.
5011   StmtResult Else = getDerived().TransformStmt(S->getElse());
5012   if (Else.isInvalid())
5013     return StmtError();
5014 
5015   if (!getDerived().AlwaysRebuild() &&
5016       FullCond.get() == S->getCond() &&
5017       ConditionVar == S->getConditionVariable() &&
5018       Then.get() == S->getThen() &&
5019       Else.get() == S->getElse())
5020     return SemaRef.Owned(S);
5021 
5022   return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
5023                                     Then.get(),
5024                                     S->getElseLoc(), Else.get());
5025 }
5026 
5027 template<typename Derived>
5028 StmtResult
TransformSwitchStmt(SwitchStmt * S)5029 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
5030   // Transform the condition.
5031   ExprResult Cond;
5032   VarDecl *ConditionVar = 0;
5033   if (S->getConditionVariable()) {
5034     ConditionVar
5035       = cast_or_null<VarDecl>(
5036                    getDerived().TransformDefinition(
5037                                       S->getConditionVariable()->getLocation(),
5038                                                     S->getConditionVariable()));
5039     if (!ConditionVar)
5040       return StmtError();
5041   } else {
5042     Cond = getDerived().TransformExpr(S->getCond());
5043 
5044     if (Cond.isInvalid())
5045       return StmtError();
5046   }
5047 
5048   // Rebuild the switch statement.
5049   StmtResult Switch
5050     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
5051                                           ConditionVar);
5052   if (Switch.isInvalid())
5053     return StmtError();
5054 
5055   // Transform the body of the switch statement.
5056   StmtResult Body = getDerived().TransformStmt(S->getBody());
5057   if (Body.isInvalid())
5058     return StmtError();
5059 
5060   // Complete the switch statement.
5061   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
5062                                             Body.get());
5063 }
5064 
5065 template<typename Derived>
5066 StmtResult
TransformWhileStmt(WhileStmt * S)5067 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
5068   // Transform the condition
5069   ExprResult Cond;
5070   VarDecl *ConditionVar = 0;
5071   if (S->getConditionVariable()) {
5072     ConditionVar
5073       = cast_or_null<VarDecl>(
5074                    getDerived().TransformDefinition(
5075                                       S->getConditionVariable()->getLocation(),
5076                                                     S->getConditionVariable()));
5077     if (!ConditionVar)
5078       return StmtError();
5079   } else {
5080     Cond = getDerived().TransformExpr(S->getCond());
5081 
5082     if (Cond.isInvalid())
5083       return StmtError();
5084 
5085     if (S->getCond()) {
5086       // Convert the condition to a boolean value.
5087       ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(),
5088                                                          Cond.get());
5089       if (CondE.isInvalid())
5090         return StmtError();
5091       Cond = CondE;
5092     }
5093   }
5094 
5095   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
5096   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5097     return StmtError();
5098 
5099   // Transform the body
5100   StmtResult Body = getDerived().TransformStmt(S->getBody());
5101   if (Body.isInvalid())
5102     return StmtError();
5103 
5104   if (!getDerived().AlwaysRebuild() &&
5105       FullCond.get() == S->getCond() &&
5106       ConditionVar == S->getConditionVariable() &&
5107       Body.get() == S->getBody())
5108     return Owned(S);
5109 
5110   return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
5111                                        ConditionVar, Body.get());
5112 }
5113 
5114 template<typename Derived>
5115 StmtResult
TransformDoStmt(DoStmt * S)5116 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
5117   // Transform the body
5118   StmtResult Body = getDerived().TransformStmt(S->getBody());
5119   if (Body.isInvalid())
5120     return StmtError();
5121 
5122   // Transform the condition
5123   ExprResult Cond = getDerived().TransformExpr(S->getCond());
5124   if (Cond.isInvalid())
5125     return StmtError();
5126 
5127   if (!getDerived().AlwaysRebuild() &&
5128       Cond.get() == S->getCond() &&
5129       Body.get() == S->getBody())
5130     return SemaRef.Owned(S);
5131 
5132   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
5133                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
5134                                     S->getRParenLoc());
5135 }
5136 
5137 template<typename Derived>
5138 StmtResult
TransformForStmt(ForStmt * S)5139 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
5140   // Transform the initialization statement
5141   StmtResult Init = getDerived().TransformStmt(S->getInit());
5142   if (Init.isInvalid())
5143     return StmtError();
5144 
5145   // Transform the condition
5146   ExprResult Cond;
5147   VarDecl *ConditionVar = 0;
5148   if (S->getConditionVariable()) {
5149     ConditionVar
5150       = cast_or_null<VarDecl>(
5151                    getDerived().TransformDefinition(
5152                                       S->getConditionVariable()->getLocation(),
5153                                                     S->getConditionVariable()));
5154     if (!ConditionVar)
5155       return StmtError();
5156   } else {
5157     Cond = getDerived().TransformExpr(S->getCond());
5158 
5159     if (Cond.isInvalid())
5160       return StmtError();
5161 
5162     if (S->getCond()) {
5163       // Convert the condition to a boolean value.
5164       ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(),
5165                                                          Cond.get());
5166       if (CondE.isInvalid())
5167         return StmtError();
5168 
5169       Cond = CondE.get();
5170     }
5171   }
5172 
5173   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
5174   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5175     return StmtError();
5176 
5177   // Transform the increment
5178   ExprResult Inc = getDerived().TransformExpr(S->getInc());
5179   if (Inc.isInvalid())
5180     return StmtError();
5181 
5182   Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get()));
5183   if (S->getInc() && !FullInc.get())
5184     return StmtError();
5185 
5186   // Transform the body
5187   StmtResult Body = getDerived().TransformStmt(S->getBody());
5188   if (Body.isInvalid())
5189     return StmtError();
5190 
5191   if (!getDerived().AlwaysRebuild() &&
5192       Init.get() == S->getInit() &&
5193       FullCond.get() == S->getCond() &&
5194       Inc.get() == S->getInc() &&
5195       Body.get() == S->getBody())
5196     return SemaRef.Owned(S);
5197 
5198   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
5199                                      Init.get(), FullCond, ConditionVar,
5200                                      FullInc, S->getRParenLoc(), Body.get());
5201 }
5202 
5203 template<typename Derived>
5204 StmtResult
TransformGotoStmt(GotoStmt * S)5205 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
5206   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
5207                                         S->getLabel());
5208   if (!LD)
5209     return StmtError();
5210 
5211   // Goto statements must always be rebuilt, to resolve the label.
5212   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
5213                                       cast<LabelDecl>(LD));
5214 }
5215 
5216 template<typename Derived>
5217 StmtResult
TransformIndirectGotoStmt(IndirectGotoStmt * S)5218 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
5219   ExprResult Target = getDerived().TransformExpr(S->getTarget());
5220   if (Target.isInvalid())
5221     return StmtError();
5222 
5223   if (!getDerived().AlwaysRebuild() &&
5224       Target.get() == S->getTarget())
5225     return SemaRef.Owned(S);
5226 
5227   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
5228                                               Target.get());
5229 }
5230 
5231 template<typename Derived>
5232 StmtResult
TransformContinueStmt(ContinueStmt * S)5233 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
5234   return SemaRef.Owned(S);
5235 }
5236 
5237 template<typename Derived>
5238 StmtResult
TransformBreakStmt(BreakStmt * S)5239 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
5240   return SemaRef.Owned(S);
5241 }
5242 
5243 template<typename Derived>
5244 StmtResult
TransformReturnStmt(ReturnStmt * S)5245 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
5246   ExprResult Result = getDerived().TransformExpr(S->getRetValue());
5247   if (Result.isInvalid())
5248     return StmtError();
5249 
5250   // FIXME: We always rebuild the return statement because there is no way
5251   // to tell whether the return type of the function has changed.
5252   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
5253 }
5254 
5255 template<typename Derived>
5256 StmtResult
TransformDeclStmt(DeclStmt * S)5257 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
5258   bool DeclChanged = false;
5259   llvm::SmallVector<Decl *, 4> Decls;
5260   for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
5261        D != DEnd; ++D) {
5262     Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
5263                                                          *D);
5264     if (!Transformed)
5265       return StmtError();
5266 
5267     if (Transformed != *D)
5268       DeclChanged = true;
5269 
5270     Decls.push_back(Transformed);
5271   }
5272 
5273   if (!getDerived().AlwaysRebuild() && !DeclChanged)
5274     return SemaRef.Owned(S);
5275 
5276   return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
5277                                       S->getStartLoc(), S->getEndLoc());
5278 }
5279 
5280 template<typename Derived>
5281 StmtResult
TransformAsmStmt(AsmStmt * S)5282 TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
5283 
5284   ASTOwningVector<Expr*> Constraints(getSema());
5285   ASTOwningVector<Expr*> Exprs(getSema());
5286   llvm::SmallVector<IdentifierInfo *, 4> Names;
5287 
5288   ExprResult AsmString;
5289   ASTOwningVector<Expr*> Clobbers(getSema());
5290 
5291   bool ExprsChanged = false;
5292 
5293   // Go through the outputs.
5294   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
5295     Names.push_back(S->getOutputIdentifier(I));
5296 
5297     // No need to transform the constraint literal.
5298     Constraints.push_back(S->getOutputConstraintLiteral(I));
5299 
5300     // Transform the output expr.
5301     Expr *OutputExpr = S->getOutputExpr(I);
5302     ExprResult Result = getDerived().TransformExpr(OutputExpr);
5303     if (Result.isInvalid())
5304       return StmtError();
5305 
5306     ExprsChanged |= Result.get() != OutputExpr;
5307 
5308     Exprs.push_back(Result.get());
5309   }
5310 
5311   // Go through the inputs.
5312   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
5313     Names.push_back(S->getInputIdentifier(I));
5314 
5315     // No need to transform the constraint literal.
5316     Constraints.push_back(S->getInputConstraintLiteral(I));
5317 
5318     // Transform the input expr.
5319     Expr *InputExpr = S->getInputExpr(I);
5320     ExprResult Result = getDerived().TransformExpr(InputExpr);
5321     if (Result.isInvalid())
5322       return StmtError();
5323 
5324     ExprsChanged |= Result.get() != InputExpr;
5325 
5326     Exprs.push_back(Result.get());
5327   }
5328 
5329   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
5330     return SemaRef.Owned(S);
5331 
5332   // Go through the clobbers.
5333   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
5334     Clobbers.push_back(S->getClobber(I));
5335 
5336   // No need to transform the asm string literal.
5337   AsmString = SemaRef.Owned(S->getAsmString());
5338 
5339   return getDerived().RebuildAsmStmt(S->getAsmLoc(),
5340                                      S->isSimple(),
5341                                      S->isVolatile(),
5342                                      S->getNumOutputs(),
5343                                      S->getNumInputs(),
5344                                      Names.data(),
5345                                      move_arg(Constraints),
5346                                      move_arg(Exprs),
5347                                      AsmString.get(),
5348                                      move_arg(Clobbers),
5349                                      S->getRParenLoc(),
5350                                      S->isMSAsm());
5351 }
5352 
5353 
5354 template<typename Derived>
5355 StmtResult
TransformObjCAtTryStmt(ObjCAtTryStmt * S)5356 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
5357   // Transform the body of the @try.
5358   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
5359   if (TryBody.isInvalid())
5360     return StmtError();
5361 
5362   // Transform the @catch statements (if present).
5363   bool AnyCatchChanged = false;
5364   ASTOwningVector<Stmt*> CatchStmts(SemaRef);
5365   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
5366     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
5367     if (Catch.isInvalid())
5368       return StmtError();
5369     if (Catch.get() != S->getCatchStmt(I))
5370       AnyCatchChanged = true;
5371     CatchStmts.push_back(Catch.release());
5372   }
5373 
5374   // Transform the @finally statement (if present).
5375   StmtResult Finally;
5376   if (S->getFinallyStmt()) {
5377     Finally = getDerived().TransformStmt(S->getFinallyStmt());
5378     if (Finally.isInvalid())
5379       return StmtError();
5380   }
5381 
5382   // If nothing changed, just retain this statement.
5383   if (!getDerived().AlwaysRebuild() &&
5384       TryBody.get() == S->getTryBody() &&
5385       !AnyCatchChanged &&
5386       Finally.get() == S->getFinallyStmt())
5387     return SemaRef.Owned(S);
5388 
5389   // Build a new statement.
5390   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
5391                                            move_arg(CatchStmts), Finally.get());
5392 }
5393 
5394 template<typename Derived>
5395 StmtResult
TransformObjCAtCatchStmt(ObjCAtCatchStmt * S)5396 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
5397   // Transform the @catch parameter, if there is one.
5398   VarDecl *Var = 0;
5399   if (VarDecl *FromVar = S->getCatchParamDecl()) {
5400     TypeSourceInfo *TSInfo = 0;
5401     if (FromVar->getTypeSourceInfo()) {
5402       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
5403       if (!TSInfo)
5404         return StmtError();
5405     }
5406 
5407     QualType T;
5408     if (TSInfo)
5409       T = TSInfo->getType();
5410     else {
5411       T = getDerived().TransformType(FromVar->getType());
5412       if (T.isNull())
5413         return StmtError();
5414     }
5415 
5416     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
5417     if (!Var)
5418       return StmtError();
5419   }
5420 
5421   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
5422   if (Body.isInvalid())
5423     return StmtError();
5424 
5425   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
5426                                              S->getRParenLoc(),
5427                                              Var, Body.get());
5428 }
5429 
5430 template<typename Derived>
5431 StmtResult
TransformObjCAtFinallyStmt(ObjCAtFinallyStmt * S)5432 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
5433   // Transform the body.
5434   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
5435   if (Body.isInvalid())
5436     return StmtError();
5437 
5438   // If nothing changed, just retain this statement.
5439   if (!getDerived().AlwaysRebuild() &&
5440       Body.get() == S->getFinallyBody())
5441     return SemaRef.Owned(S);
5442 
5443   // Build a new statement.
5444   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
5445                                                Body.get());
5446 }
5447 
5448 template<typename Derived>
5449 StmtResult
TransformObjCAtThrowStmt(ObjCAtThrowStmt * S)5450 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
5451   ExprResult Operand;
5452   if (S->getThrowExpr()) {
5453     Operand = getDerived().TransformExpr(S->getThrowExpr());
5454     if (Operand.isInvalid())
5455       return StmtError();
5456   }
5457 
5458   if (!getDerived().AlwaysRebuild() &&
5459       Operand.get() == S->getThrowExpr())
5460     return getSema().Owned(S);
5461 
5462   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
5463 }
5464 
5465 template<typename Derived>
5466 StmtResult
TransformObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)5467 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
5468                                                   ObjCAtSynchronizedStmt *S) {
5469   // Transform the object we are locking.
5470   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
5471   if (Object.isInvalid())
5472     return StmtError();
5473 
5474   // Transform the body.
5475   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
5476   if (Body.isInvalid())
5477     return StmtError();
5478 
5479   // If nothing change, just retain the current statement.
5480   if (!getDerived().AlwaysRebuild() &&
5481       Object.get() == S->getSynchExpr() &&
5482       Body.get() == S->getSynchBody())
5483     return SemaRef.Owned(S);
5484 
5485   // Build a new statement.
5486   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
5487                                                     Object.get(), Body.get());
5488 }
5489 
5490 template<typename Derived>
5491 StmtResult
TransformObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)5492 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
5493                                               ObjCAutoreleasePoolStmt *S) {
5494   // Transform the body.
5495   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
5496   if (Body.isInvalid())
5497     return StmtError();
5498 
5499   // If nothing changed, just retain this statement.
5500   if (!getDerived().AlwaysRebuild() &&
5501       Body.get() == S->getSubStmt())
5502     return SemaRef.Owned(S);
5503 
5504   // Build a new statement.
5505   return getDerived().RebuildObjCAutoreleasePoolStmt(
5506                         S->getAtLoc(), Body.get());
5507 }
5508 
5509 template<typename Derived>
5510 StmtResult
TransformObjCForCollectionStmt(ObjCForCollectionStmt * S)5511 TreeTransform<Derived>::TransformObjCForCollectionStmt(
5512                                                   ObjCForCollectionStmt *S) {
5513   // Transform the element statement.
5514   StmtResult Element = getDerived().TransformStmt(S->getElement());
5515   if (Element.isInvalid())
5516     return StmtError();
5517 
5518   // Transform the collection expression.
5519   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
5520   if (Collection.isInvalid())
5521     return StmtError();
5522 
5523   // Transform the body.
5524   StmtResult Body = getDerived().TransformStmt(S->getBody());
5525   if (Body.isInvalid())
5526     return StmtError();
5527 
5528   // If nothing changed, just retain this statement.
5529   if (!getDerived().AlwaysRebuild() &&
5530       Element.get() == S->getElement() &&
5531       Collection.get() == S->getCollection() &&
5532       Body.get() == S->getBody())
5533     return SemaRef.Owned(S);
5534 
5535   // Build a new statement.
5536   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
5537                                                    /*FIXME:*/S->getForLoc(),
5538                                                    Element.get(),
5539                                                    Collection.get(),
5540                                                    S->getRParenLoc(),
5541                                                    Body.get());
5542 }
5543 
5544 
5545 template<typename Derived>
5546 StmtResult
TransformCXXCatchStmt(CXXCatchStmt * S)5547 TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
5548   // Transform the exception declaration, if any.
5549   VarDecl *Var = 0;
5550   if (S->getExceptionDecl()) {
5551     VarDecl *ExceptionDecl = S->getExceptionDecl();
5552     TypeSourceInfo *T = getDerived().TransformType(
5553                                             ExceptionDecl->getTypeSourceInfo());
5554     if (!T)
5555       return StmtError();
5556 
5557     Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T,
5558                                             ExceptionDecl->getInnerLocStart(),
5559                                             ExceptionDecl->getLocation(),
5560                                             ExceptionDecl->getIdentifier());
5561     if (!Var || Var->isInvalidDecl())
5562       return StmtError();
5563   }
5564 
5565   // Transform the actual exception handler.
5566   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
5567   if (Handler.isInvalid())
5568     return StmtError();
5569 
5570   if (!getDerived().AlwaysRebuild() &&
5571       !Var &&
5572       Handler.get() == S->getHandlerBlock())
5573     return SemaRef.Owned(S);
5574 
5575   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
5576                                           Var,
5577                                           Handler.get());
5578 }
5579 
5580 template<typename Derived>
5581 StmtResult
TransformCXXTryStmt(CXXTryStmt * S)5582 TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
5583   // Transform the try block itself.
5584   StmtResult TryBlock
5585     = getDerived().TransformCompoundStmt(S->getTryBlock());
5586   if (TryBlock.isInvalid())
5587     return StmtError();
5588 
5589   // Transform the handlers.
5590   bool HandlerChanged = false;
5591   ASTOwningVector<Stmt*> Handlers(SemaRef);
5592   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
5593     StmtResult Handler
5594       = getDerived().TransformCXXCatchStmt(S->getHandler(I));
5595     if (Handler.isInvalid())
5596       return StmtError();
5597 
5598     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
5599     Handlers.push_back(Handler.takeAs<Stmt>());
5600   }
5601 
5602   if (!getDerived().AlwaysRebuild() &&
5603       TryBlock.get() == S->getTryBlock() &&
5604       !HandlerChanged)
5605     return SemaRef.Owned(S);
5606 
5607   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
5608                                         move_arg(Handlers));
5609 }
5610 
5611 template<typename Derived>
5612 StmtResult
TransformCXXForRangeStmt(CXXForRangeStmt * S)5613 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
5614   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
5615   if (Range.isInvalid())
5616     return StmtError();
5617 
5618   StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt());
5619   if (BeginEnd.isInvalid())
5620     return StmtError();
5621 
5622   ExprResult Cond = getDerived().TransformExpr(S->getCond());
5623   if (Cond.isInvalid())
5624     return StmtError();
5625 
5626   ExprResult Inc = getDerived().TransformExpr(S->getInc());
5627   if (Inc.isInvalid())
5628     return StmtError();
5629 
5630   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
5631   if (LoopVar.isInvalid())
5632     return StmtError();
5633 
5634   StmtResult NewStmt = S;
5635   if (getDerived().AlwaysRebuild() ||
5636       Range.get() != S->getRangeStmt() ||
5637       BeginEnd.get() != S->getBeginEndStmt() ||
5638       Cond.get() != S->getCond() ||
5639       Inc.get() != S->getInc() ||
5640       LoopVar.get() != S->getLoopVarStmt())
5641     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
5642                                                   S->getColonLoc(), Range.get(),
5643                                                   BeginEnd.get(), Cond.get(),
5644                                                   Inc.get(), LoopVar.get(),
5645                                                   S->getRParenLoc());
5646 
5647   StmtResult Body = getDerived().TransformStmt(S->getBody());
5648   if (Body.isInvalid())
5649     return StmtError();
5650 
5651   // Body has changed but we didn't rebuild the for-range statement. Rebuild
5652   // it now so we have a new statement to attach the body to.
5653   if (Body.get() != S->getBody() && NewStmt.get() == S)
5654     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
5655                                                   S->getColonLoc(), Range.get(),
5656                                                   BeginEnd.get(), Cond.get(),
5657                                                   Inc.get(), LoopVar.get(),
5658                                                   S->getRParenLoc());
5659 
5660   if (NewStmt.get() == S)
5661     return SemaRef.Owned(S);
5662 
5663   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
5664 }
5665 
5666 template<typename Derived>
5667 StmtResult
TransformSEHTryStmt(SEHTryStmt * S)5668 TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
5669   StmtResult TryBlock; //  = getDerived().TransformCompoundStmt(S->getTryBlock());
5670   if(TryBlock.isInvalid()) return StmtError();
5671 
5672   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
5673   if(!getDerived().AlwaysRebuild() &&
5674      TryBlock.get() == S->getTryBlock() &&
5675      Handler.get() == S->getHandler())
5676     return SemaRef.Owned(S);
5677 
5678   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(),
5679                                         S->getTryLoc(),
5680                                         TryBlock.take(),
5681                                         Handler.take());
5682 }
5683 
5684 template<typename Derived>
5685 StmtResult
TransformSEHFinallyStmt(SEHFinallyStmt * S)5686 TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
5687   StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());
5688   if(Block.isInvalid()) return StmtError();
5689 
5690   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(),
5691                                             Block.take());
5692 }
5693 
5694 template<typename Derived>
5695 StmtResult
TransformSEHExceptStmt(SEHExceptStmt * S)5696 TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
5697   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
5698   if(FilterExpr.isInvalid()) return StmtError();
5699 
5700   StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());
5701   if(Block.isInvalid()) return StmtError();
5702 
5703   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(),
5704                                            FilterExpr.take(),
5705                                            Block.take());
5706 }
5707 
5708 template<typename Derived>
5709 StmtResult
TransformSEHHandler(Stmt * Handler)5710 TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
5711   if(isa<SEHFinallyStmt>(Handler))
5712     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
5713   else
5714     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
5715 }
5716 
5717 //===----------------------------------------------------------------------===//
5718 // Expression transformation
5719 //===----------------------------------------------------------------------===//
5720 template<typename Derived>
5721 ExprResult
TransformPredefinedExpr(PredefinedExpr * E)5722 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
5723   return SemaRef.Owned(E);
5724 }
5725 
5726 template<typename Derived>
5727 ExprResult
TransformDeclRefExpr(DeclRefExpr * E)5728 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
5729   NestedNameSpecifierLoc QualifierLoc;
5730   if (E->getQualifierLoc()) {
5731     QualifierLoc
5732       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
5733     if (!QualifierLoc)
5734       return ExprError();
5735   }
5736 
5737   ValueDecl *ND
5738     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
5739                                                          E->getDecl()));
5740   if (!ND)
5741     return ExprError();
5742 
5743   DeclarationNameInfo NameInfo = E->getNameInfo();
5744   if (NameInfo.getName()) {
5745     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
5746     if (!NameInfo.getName())
5747       return ExprError();
5748   }
5749 
5750   if (!getDerived().AlwaysRebuild() &&
5751       QualifierLoc == E->getQualifierLoc() &&
5752       ND == E->getDecl() &&
5753       NameInfo.getName() == E->getDecl()->getDeclName() &&
5754       !E->hasExplicitTemplateArgs()) {
5755 
5756     // Mark it referenced in the new context regardless.
5757     // FIXME: this is a bit instantiation-specific.
5758     SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
5759 
5760     return SemaRef.Owned(E);
5761   }
5762 
5763   TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
5764   if (E->hasExplicitTemplateArgs()) {
5765     TemplateArgs = &TransArgs;
5766     TransArgs.setLAngleLoc(E->getLAngleLoc());
5767     TransArgs.setRAngleLoc(E->getRAngleLoc());
5768     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
5769                                                 E->getNumTemplateArgs(),
5770                                                 TransArgs))
5771       return ExprError();
5772   }
5773 
5774   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
5775                                          TemplateArgs);
5776 }
5777 
5778 template<typename Derived>
5779 ExprResult
TransformIntegerLiteral(IntegerLiteral * E)5780 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
5781   return SemaRef.Owned(E);
5782 }
5783 
5784 template<typename Derived>
5785 ExprResult
TransformFloatingLiteral(FloatingLiteral * E)5786 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
5787   return SemaRef.Owned(E);
5788 }
5789 
5790 template<typename Derived>
5791 ExprResult
TransformImaginaryLiteral(ImaginaryLiteral * E)5792 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
5793   return SemaRef.Owned(E);
5794 }
5795 
5796 template<typename Derived>
5797 ExprResult
TransformStringLiteral(StringLiteral * E)5798 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
5799   return SemaRef.Owned(E);
5800 }
5801 
5802 template<typename Derived>
5803 ExprResult
TransformCharacterLiteral(CharacterLiteral * E)5804 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
5805   return SemaRef.Owned(E);
5806 }
5807 
5808 template<typename Derived>
5809 ExprResult
TransformGenericSelectionExpr(GenericSelectionExpr * E)5810 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
5811   ExprResult ControllingExpr =
5812     getDerived().TransformExpr(E->getControllingExpr());
5813   if (ControllingExpr.isInvalid())
5814     return ExprError();
5815 
5816   llvm::SmallVector<Expr *, 4> AssocExprs;
5817   llvm::SmallVector<TypeSourceInfo *, 4> AssocTypes;
5818   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
5819     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
5820     if (TS) {
5821       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
5822       if (!AssocType)
5823         return ExprError();
5824       AssocTypes.push_back(AssocType);
5825     } else {
5826       AssocTypes.push_back(0);
5827     }
5828 
5829     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
5830     if (AssocExpr.isInvalid())
5831       return ExprError();
5832     AssocExprs.push_back(AssocExpr.release());
5833   }
5834 
5835   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
5836                                                   E->getDefaultLoc(),
5837                                                   E->getRParenLoc(),
5838                                                   ControllingExpr.release(),
5839                                                   AssocTypes.data(),
5840                                                   AssocExprs.data(),
5841                                                   E->getNumAssocs());
5842 }
5843 
5844 template<typename Derived>
5845 ExprResult
TransformParenExpr(ParenExpr * E)5846 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
5847   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5848   if (SubExpr.isInvalid())
5849     return ExprError();
5850 
5851   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
5852     return SemaRef.Owned(E);
5853 
5854   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
5855                                        E->getRParen());
5856 }
5857 
5858 template<typename Derived>
5859 ExprResult
TransformUnaryOperator(UnaryOperator * E)5860 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
5861   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5862   if (SubExpr.isInvalid())
5863     return ExprError();
5864 
5865   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
5866     return SemaRef.Owned(E);
5867 
5868   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
5869                                            E->getOpcode(),
5870                                            SubExpr.get());
5871 }
5872 
5873 template<typename Derived>
5874 ExprResult
TransformOffsetOfExpr(OffsetOfExpr * E)5875 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
5876   // Transform the type.
5877   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
5878   if (!Type)
5879     return ExprError();
5880 
5881   // Transform all of the components into components similar to what the
5882   // parser uses.
5883   // FIXME: It would be slightly more efficient in the non-dependent case to
5884   // just map FieldDecls, rather than requiring the rebuilder to look for
5885   // the fields again. However, __builtin_offsetof is rare enough in
5886   // template code that we don't care.
5887   bool ExprChanged = false;
5888   typedef Sema::OffsetOfComponent Component;
5889   typedef OffsetOfExpr::OffsetOfNode Node;
5890   llvm::SmallVector<Component, 4> Components;
5891   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
5892     const Node &ON = E->getComponent(I);
5893     Component Comp;
5894     Comp.isBrackets = true;
5895     Comp.LocStart = ON.getSourceRange().getBegin();
5896     Comp.LocEnd = ON.getSourceRange().getEnd();
5897     switch (ON.getKind()) {
5898     case Node::Array: {
5899       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
5900       ExprResult Index = getDerived().TransformExpr(FromIndex);
5901       if (Index.isInvalid())
5902         return ExprError();
5903 
5904       ExprChanged = ExprChanged || Index.get() != FromIndex;
5905       Comp.isBrackets = true;
5906       Comp.U.E = Index.get();
5907       break;
5908     }
5909 
5910     case Node::Field:
5911     case Node::Identifier:
5912       Comp.isBrackets = false;
5913       Comp.U.IdentInfo = ON.getFieldName();
5914       if (!Comp.U.IdentInfo)
5915         continue;
5916 
5917       break;
5918 
5919     case Node::Base:
5920       // Will be recomputed during the rebuild.
5921       continue;
5922     }
5923 
5924     Components.push_back(Comp);
5925   }
5926 
5927   // If nothing changed, retain the existing expression.
5928   if (!getDerived().AlwaysRebuild() &&
5929       Type == E->getTypeSourceInfo() &&
5930       !ExprChanged)
5931     return SemaRef.Owned(E);
5932 
5933   // Build a new offsetof expression.
5934   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
5935                                           Components.data(), Components.size(),
5936                                           E->getRParenLoc());
5937 }
5938 
5939 template<typename Derived>
5940 ExprResult
TransformOpaqueValueExpr(OpaqueValueExpr * E)5941 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
5942   assert(getDerived().AlreadyTransformed(E->getType()) &&
5943          "opaque value expression requires transformation");
5944   return SemaRef.Owned(E);
5945 }
5946 
5947 template<typename Derived>
5948 ExprResult
TransformUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)5949 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
5950                                                 UnaryExprOrTypeTraitExpr *E) {
5951   if (E->isArgumentType()) {
5952     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
5953 
5954     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
5955     if (!NewT)
5956       return ExprError();
5957 
5958     if (!getDerived().AlwaysRebuild() && OldT == NewT)
5959       return SemaRef.Owned(E);
5960 
5961     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
5962                                                     E->getKind(),
5963                                                     E->getSourceRange());
5964   }
5965 
5966   ExprResult SubExpr;
5967   {
5968     // C++0x [expr.sizeof]p1:
5969     //   The operand is either an expression, which is an unevaluated operand
5970     //   [...]
5971     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
5972 
5973     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
5974     if (SubExpr.isInvalid())
5975       return ExprError();
5976 
5977     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
5978       return SemaRef.Owned(E);
5979   }
5980 
5981   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
5982                                                   E->getOperatorLoc(),
5983                                                   E->getKind(),
5984                                                   E->getSourceRange());
5985 }
5986 
5987 template<typename Derived>
5988 ExprResult
TransformArraySubscriptExpr(ArraySubscriptExpr * E)5989 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
5990   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
5991   if (LHS.isInvalid())
5992     return ExprError();
5993 
5994   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
5995   if (RHS.isInvalid())
5996     return ExprError();
5997 
5998 
5999   if (!getDerived().AlwaysRebuild() &&
6000       LHS.get() == E->getLHS() &&
6001       RHS.get() == E->getRHS())
6002     return SemaRef.Owned(E);
6003 
6004   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
6005                                            /*FIXME:*/E->getLHS()->getLocStart(),
6006                                                 RHS.get(),
6007                                                 E->getRBracketLoc());
6008 }
6009 
6010 template<typename Derived>
6011 ExprResult
TransformCallExpr(CallExpr * E)6012 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
6013   // Transform the callee.
6014   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
6015   if (Callee.isInvalid())
6016     return ExprError();
6017 
6018   // Transform arguments.
6019   bool ArgChanged = false;
6020   ASTOwningVector<Expr*> Args(SemaRef);
6021   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
6022                                   &ArgChanged))
6023     return ExprError();
6024 
6025   if (!getDerived().AlwaysRebuild() &&
6026       Callee.get() == E->getCallee() &&
6027       !ArgChanged)
6028     return SemaRef.Owned(E);
6029 
6030   // FIXME: Wrong source location information for the '('.
6031   SourceLocation FakeLParenLoc
6032     = ((Expr *)Callee.get())->getSourceRange().getBegin();
6033   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
6034                                       move_arg(Args),
6035                                       E->getRParenLoc());
6036 }
6037 
6038 template<typename Derived>
6039 ExprResult
TransformMemberExpr(MemberExpr * E)6040 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
6041   ExprResult Base = getDerived().TransformExpr(E->getBase());
6042   if (Base.isInvalid())
6043     return ExprError();
6044 
6045   NestedNameSpecifierLoc QualifierLoc;
6046   if (E->hasQualifier()) {
6047     QualifierLoc
6048       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
6049 
6050     if (!QualifierLoc)
6051       return ExprError();
6052   }
6053 
6054   ValueDecl *Member
6055     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
6056                                                          E->getMemberDecl()));
6057   if (!Member)
6058     return ExprError();
6059 
6060   NamedDecl *FoundDecl = E->getFoundDecl();
6061   if (FoundDecl == E->getMemberDecl()) {
6062     FoundDecl = Member;
6063   } else {
6064     FoundDecl = cast_or_null<NamedDecl>(
6065                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
6066     if (!FoundDecl)
6067       return ExprError();
6068   }
6069 
6070   if (!getDerived().AlwaysRebuild() &&
6071       Base.get() == E->getBase() &&
6072       QualifierLoc == E->getQualifierLoc() &&
6073       Member == E->getMemberDecl() &&
6074       FoundDecl == E->getFoundDecl() &&
6075       !E->hasExplicitTemplateArgs()) {
6076 
6077     // Mark it referenced in the new context regardless.
6078     // FIXME: this is a bit instantiation-specific.
6079     SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
6080     return SemaRef.Owned(E);
6081   }
6082 
6083   TemplateArgumentListInfo TransArgs;
6084   if (E->hasExplicitTemplateArgs()) {
6085     TransArgs.setLAngleLoc(E->getLAngleLoc());
6086     TransArgs.setRAngleLoc(E->getRAngleLoc());
6087     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
6088                                                 E->getNumTemplateArgs(),
6089                                                 TransArgs))
6090       return ExprError();
6091   }
6092 
6093   // FIXME: Bogus source location for the operator
6094   SourceLocation FakeOperatorLoc
6095     = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
6096 
6097   // FIXME: to do this check properly, we will need to preserve the
6098   // first-qualifier-in-scope here, just in case we had a dependent
6099   // base (and therefore couldn't do the check) and a
6100   // nested-name-qualifier (and therefore could do the lookup).
6101   NamedDecl *FirstQualifierInScope = 0;
6102 
6103   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
6104                                         E->isArrow(),
6105                                         QualifierLoc,
6106                                         E->getMemberNameInfo(),
6107                                         Member,
6108                                         FoundDecl,
6109                                         (E->hasExplicitTemplateArgs()
6110                                            ? &TransArgs : 0),
6111                                         FirstQualifierInScope);
6112 }
6113 
6114 template<typename Derived>
6115 ExprResult
TransformBinaryOperator(BinaryOperator * E)6116 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
6117   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
6118   if (LHS.isInvalid())
6119     return ExprError();
6120 
6121   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
6122   if (RHS.isInvalid())
6123     return ExprError();
6124 
6125   if (!getDerived().AlwaysRebuild() &&
6126       LHS.get() == E->getLHS() &&
6127       RHS.get() == E->getRHS())
6128     return SemaRef.Owned(E);
6129 
6130   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
6131                                             LHS.get(), RHS.get());
6132 }
6133 
6134 template<typename Derived>
6135 ExprResult
TransformCompoundAssignOperator(CompoundAssignOperator * E)6136 TreeTransform<Derived>::TransformCompoundAssignOperator(
6137                                                       CompoundAssignOperator *E) {
6138   return getDerived().TransformBinaryOperator(E);
6139 }
6140 
6141 template<typename Derived>
6142 ExprResult TreeTransform<Derived>::
TransformBinaryConditionalOperator(BinaryConditionalOperator * e)6143 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
6144   // Just rebuild the common and RHS expressions and see whether we
6145   // get any changes.
6146 
6147   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
6148   if (commonExpr.isInvalid())
6149     return ExprError();
6150 
6151   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
6152   if (rhs.isInvalid())
6153     return ExprError();
6154 
6155   if (!getDerived().AlwaysRebuild() &&
6156       commonExpr.get() == e->getCommon() &&
6157       rhs.get() == e->getFalseExpr())
6158     return SemaRef.Owned(e);
6159 
6160   return getDerived().RebuildConditionalOperator(commonExpr.take(),
6161                                                  e->getQuestionLoc(),
6162                                                  0,
6163                                                  e->getColonLoc(),
6164                                                  rhs.get());
6165 }
6166 
6167 template<typename Derived>
6168 ExprResult
TransformConditionalOperator(ConditionalOperator * E)6169 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
6170   ExprResult Cond = getDerived().TransformExpr(E->getCond());
6171   if (Cond.isInvalid())
6172     return ExprError();
6173 
6174   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
6175   if (LHS.isInvalid())
6176     return ExprError();
6177 
6178   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
6179   if (RHS.isInvalid())
6180     return ExprError();
6181 
6182   if (!getDerived().AlwaysRebuild() &&
6183       Cond.get() == E->getCond() &&
6184       LHS.get() == E->getLHS() &&
6185       RHS.get() == E->getRHS())
6186     return SemaRef.Owned(E);
6187 
6188   return getDerived().RebuildConditionalOperator(Cond.get(),
6189                                                  E->getQuestionLoc(),
6190                                                  LHS.get(),
6191                                                  E->getColonLoc(),
6192                                                  RHS.get());
6193 }
6194 
6195 template<typename Derived>
6196 ExprResult
TransformImplicitCastExpr(ImplicitCastExpr * E)6197 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
6198   // Implicit casts are eliminated during transformation, since they
6199   // will be recomputed by semantic analysis after transformation.
6200   return getDerived().TransformExpr(E->getSubExprAsWritten());
6201 }
6202 
6203 template<typename Derived>
6204 ExprResult
TransformCStyleCastExpr(CStyleCastExpr * E)6205 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
6206   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6207   if (!Type)
6208     return ExprError();
6209 
6210   ExprResult SubExpr
6211     = getDerived().TransformExpr(E->getSubExprAsWritten());
6212   if (SubExpr.isInvalid())
6213     return ExprError();
6214 
6215   if (!getDerived().AlwaysRebuild() &&
6216       Type == E->getTypeInfoAsWritten() &&
6217       SubExpr.get() == E->getSubExpr())
6218     return SemaRef.Owned(E);
6219 
6220   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
6221                                             Type,
6222                                             E->getRParenLoc(),
6223                                             SubExpr.get());
6224 }
6225 
6226 template<typename Derived>
6227 ExprResult
TransformCompoundLiteralExpr(CompoundLiteralExpr * E)6228 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
6229   TypeSourceInfo *OldT = E->getTypeSourceInfo();
6230   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
6231   if (!NewT)
6232     return ExprError();
6233 
6234   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
6235   if (Init.isInvalid())
6236     return ExprError();
6237 
6238   if (!getDerived().AlwaysRebuild() &&
6239       OldT == NewT &&
6240       Init.get() == E->getInitializer())
6241     return SemaRef.Owned(E);
6242 
6243   // Note: the expression type doesn't necessarily match the
6244   // type-as-written, but that's okay, because it should always be
6245   // derivable from the initializer.
6246 
6247   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
6248                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
6249                                                  Init.get());
6250 }
6251 
6252 template<typename Derived>
6253 ExprResult
TransformExtVectorElementExpr(ExtVectorElementExpr * E)6254 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
6255   ExprResult Base = getDerived().TransformExpr(E->getBase());
6256   if (Base.isInvalid())
6257     return ExprError();
6258 
6259   if (!getDerived().AlwaysRebuild() &&
6260       Base.get() == E->getBase())
6261     return SemaRef.Owned(E);
6262 
6263   // FIXME: Bad source location
6264   SourceLocation FakeOperatorLoc
6265     = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
6266   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
6267                                                   E->getAccessorLoc(),
6268                                                   E->getAccessor());
6269 }
6270 
6271 template<typename Derived>
6272 ExprResult
TransformInitListExpr(InitListExpr * E)6273 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
6274   bool InitChanged = false;
6275 
6276   ASTOwningVector<Expr*, 4> Inits(SemaRef);
6277   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
6278                                   Inits, &InitChanged))
6279     return ExprError();
6280 
6281   if (!getDerived().AlwaysRebuild() && !InitChanged)
6282     return SemaRef.Owned(E);
6283 
6284   return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
6285                                       E->getRBraceLoc(), E->getType());
6286 }
6287 
6288 template<typename Derived>
6289 ExprResult
TransformDesignatedInitExpr(DesignatedInitExpr * E)6290 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
6291   Designation Desig;
6292 
6293   // transform the initializer value
6294   ExprResult Init = getDerived().TransformExpr(E->getInit());
6295   if (Init.isInvalid())
6296     return ExprError();
6297 
6298   // transform the designators.
6299   ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef);
6300   bool ExprChanged = false;
6301   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
6302                                              DEnd = E->designators_end();
6303        D != DEnd; ++D) {
6304     if (D->isFieldDesignator()) {
6305       Desig.AddDesignator(Designator::getField(D->getFieldName(),
6306                                                D->getDotLoc(),
6307                                                D->getFieldLoc()));
6308       continue;
6309     }
6310 
6311     if (D->isArrayDesignator()) {
6312       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
6313       if (Index.isInvalid())
6314         return ExprError();
6315 
6316       Desig.AddDesignator(Designator::getArray(Index.get(),
6317                                                D->getLBracketLoc()));
6318 
6319       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
6320       ArrayExprs.push_back(Index.release());
6321       continue;
6322     }
6323 
6324     assert(D->isArrayRangeDesignator() && "New kind of designator?");
6325     ExprResult Start
6326       = getDerived().TransformExpr(E->getArrayRangeStart(*D));
6327     if (Start.isInvalid())
6328       return ExprError();
6329 
6330     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
6331     if (End.isInvalid())
6332       return ExprError();
6333 
6334     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
6335                                                   End.get(),
6336                                                   D->getLBracketLoc(),
6337                                                   D->getEllipsisLoc()));
6338 
6339     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
6340       End.get() != E->getArrayRangeEnd(*D);
6341 
6342     ArrayExprs.push_back(Start.release());
6343     ArrayExprs.push_back(End.release());
6344   }
6345 
6346   if (!getDerived().AlwaysRebuild() &&
6347       Init.get() == E->getInit() &&
6348       !ExprChanged)
6349     return SemaRef.Owned(E);
6350 
6351   return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
6352                                                 E->getEqualOrColonLoc(),
6353                                                 E->usesGNUSyntax(), Init.get());
6354 }
6355 
6356 template<typename Derived>
6357 ExprResult
TransformImplicitValueInitExpr(ImplicitValueInitExpr * E)6358 TreeTransform<Derived>::TransformImplicitValueInitExpr(
6359                                                      ImplicitValueInitExpr *E) {
6360   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
6361 
6362   // FIXME: Will we ever have proper type location here? Will we actually
6363   // need to transform the type?
6364   QualType T = getDerived().TransformType(E->getType());
6365   if (T.isNull())
6366     return ExprError();
6367 
6368   if (!getDerived().AlwaysRebuild() &&
6369       T == E->getType())
6370     return SemaRef.Owned(E);
6371 
6372   return getDerived().RebuildImplicitValueInitExpr(T);
6373 }
6374 
6375 template<typename Derived>
6376 ExprResult
TransformVAArgExpr(VAArgExpr * E)6377 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
6378   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
6379   if (!TInfo)
6380     return ExprError();
6381 
6382   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
6383   if (SubExpr.isInvalid())
6384     return ExprError();
6385 
6386   if (!getDerived().AlwaysRebuild() &&
6387       TInfo == E->getWrittenTypeInfo() &&
6388       SubExpr.get() == E->getSubExpr())
6389     return SemaRef.Owned(E);
6390 
6391   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
6392                                        TInfo, E->getRParenLoc());
6393 }
6394 
6395 template<typename Derived>
6396 ExprResult
TransformParenListExpr(ParenListExpr * E)6397 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
6398   bool ArgumentChanged = false;
6399   ASTOwningVector<Expr*, 4> Inits(SemaRef);
6400   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
6401                      &ArgumentChanged))
6402     return ExprError();
6403 
6404   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
6405                                            move_arg(Inits),
6406                                            E->getRParenLoc());
6407 }
6408 
6409 /// \brief Transform an address-of-label expression.
6410 ///
6411 /// By default, the transformation of an address-of-label expression always
6412 /// rebuilds the expression, so that the label identifier can be resolved to
6413 /// the corresponding label statement by semantic analysis.
6414 template<typename Derived>
6415 ExprResult
TransformAddrLabelExpr(AddrLabelExpr * E)6416 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
6417   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
6418                                         E->getLabel());
6419   if (!LD)
6420     return ExprError();
6421 
6422   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
6423                                            cast<LabelDecl>(LD));
6424 }
6425 
6426 template<typename Derived>
6427 ExprResult
TransformStmtExpr(StmtExpr * E)6428 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
6429   StmtResult SubStmt
6430     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
6431   if (SubStmt.isInvalid())
6432     return ExprError();
6433 
6434   if (!getDerived().AlwaysRebuild() &&
6435       SubStmt.get() == E->getSubStmt())
6436     return SemaRef.Owned(E);
6437 
6438   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
6439                                       SubStmt.get(),
6440                                       E->getRParenLoc());
6441 }
6442 
6443 template<typename Derived>
6444 ExprResult
TransformChooseExpr(ChooseExpr * E)6445 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
6446   ExprResult Cond = getDerived().TransformExpr(E->getCond());
6447   if (Cond.isInvalid())
6448     return ExprError();
6449 
6450   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
6451   if (LHS.isInvalid())
6452     return ExprError();
6453 
6454   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
6455   if (RHS.isInvalid())
6456     return ExprError();
6457 
6458   if (!getDerived().AlwaysRebuild() &&
6459       Cond.get() == E->getCond() &&
6460       LHS.get() == E->getLHS() &&
6461       RHS.get() == E->getRHS())
6462     return SemaRef.Owned(E);
6463 
6464   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
6465                                         Cond.get(), LHS.get(), RHS.get(),
6466                                         E->getRParenLoc());
6467 }
6468 
6469 template<typename Derived>
6470 ExprResult
TransformGNUNullExpr(GNUNullExpr * E)6471 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
6472   return SemaRef.Owned(E);
6473 }
6474 
6475 template<typename Derived>
6476 ExprResult
TransformCXXOperatorCallExpr(CXXOperatorCallExpr * E)6477 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
6478   switch (E->getOperator()) {
6479   case OO_New:
6480   case OO_Delete:
6481   case OO_Array_New:
6482   case OO_Array_Delete:
6483     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
6484     return ExprError();
6485 
6486   case OO_Call: {
6487     // This is a call to an object's operator().
6488     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
6489 
6490     // Transform the object itself.
6491     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
6492     if (Object.isInvalid())
6493       return ExprError();
6494 
6495     // FIXME: Poor location information
6496     SourceLocation FakeLParenLoc
6497       = SemaRef.PP.getLocForEndOfToken(
6498                               static_cast<Expr *>(Object.get())->getLocEnd());
6499 
6500     // Transform the call arguments.
6501     ASTOwningVector<Expr*> Args(SemaRef);
6502     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
6503                                     Args))
6504       return ExprError();
6505 
6506     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
6507                                         move_arg(Args),
6508                                         E->getLocEnd());
6509   }
6510 
6511 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
6512   case OO_##Name:
6513 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
6514 #include "clang/Basic/OperatorKinds.def"
6515   case OO_Subscript:
6516     // Handled below.
6517     break;
6518 
6519   case OO_Conditional:
6520     llvm_unreachable("conditional operator is not actually overloadable");
6521     return ExprError();
6522 
6523   case OO_None:
6524   case NUM_OVERLOADED_OPERATORS:
6525     llvm_unreachable("not an overloaded operator?");
6526     return ExprError();
6527   }
6528 
6529   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
6530   if (Callee.isInvalid())
6531     return ExprError();
6532 
6533   ExprResult First = getDerived().TransformExpr(E->getArg(0));
6534   if (First.isInvalid())
6535     return ExprError();
6536 
6537   ExprResult Second;
6538   if (E->getNumArgs() == 2) {
6539     Second = getDerived().TransformExpr(E->getArg(1));
6540     if (Second.isInvalid())
6541       return ExprError();
6542   }
6543 
6544   if (!getDerived().AlwaysRebuild() &&
6545       Callee.get() == E->getCallee() &&
6546       First.get() == E->getArg(0) &&
6547       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
6548     return SemaRef.Owned(E);
6549 
6550   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
6551                                                  E->getOperatorLoc(),
6552                                                  Callee.get(),
6553                                                  First.get(),
6554                                                  Second.get());
6555 }
6556 
6557 template<typename Derived>
6558 ExprResult
TransformCXXMemberCallExpr(CXXMemberCallExpr * E)6559 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
6560   return getDerived().TransformCallExpr(E);
6561 }
6562 
6563 template<typename Derived>
6564 ExprResult
TransformCUDAKernelCallExpr(CUDAKernelCallExpr * E)6565 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
6566   // Transform the callee.
6567   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
6568   if (Callee.isInvalid())
6569     return ExprError();
6570 
6571   // Transform exec config.
6572   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
6573   if (EC.isInvalid())
6574     return ExprError();
6575 
6576   // Transform arguments.
6577   bool ArgChanged = false;
6578   ASTOwningVector<Expr*> Args(SemaRef);
6579   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
6580                                   &ArgChanged))
6581     return ExprError();
6582 
6583   if (!getDerived().AlwaysRebuild() &&
6584       Callee.get() == E->getCallee() &&
6585       !ArgChanged)
6586     return SemaRef.Owned(E);
6587 
6588   // FIXME: Wrong source location information for the '('.
6589   SourceLocation FakeLParenLoc
6590     = ((Expr *)Callee.get())->getSourceRange().getBegin();
6591   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
6592                                       move_arg(Args),
6593                                       E->getRParenLoc(), EC.get());
6594 }
6595 
6596 template<typename Derived>
6597 ExprResult
TransformCXXNamedCastExpr(CXXNamedCastExpr * E)6598 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
6599   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6600   if (!Type)
6601     return ExprError();
6602 
6603   ExprResult SubExpr
6604     = getDerived().TransformExpr(E->getSubExprAsWritten());
6605   if (SubExpr.isInvalid())
6606     return ExprError();
6607 
6608   if (!getDerived().AlwaysRebuild() &&
6609       Type == E->getTypeInfoAsWritten() &&
6610       SubExpr.get() == E->getSubExpr())
6611     return SemaRef.Owned(E);
6612 
6613   // FIXME: Poor source location information here.
6614   SourceLocation FakeLAngleLoc
6615     = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
6616   SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
6617   SourceLocation FakeRParenLoc
6618     = SemaRef.PP.getLocForEndOfToken(
6619                                   E->getSubExpr()->getSourceRange().getEnd());
6620   return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
6621                                               E->getStmtClass(),
6622                                               FakeLAngleLoc,
6623                                               Type,
6624                                               FakeRAngleLoc,
6625                                               FakeRAngleLoc,
6626                                               SubExpr.get(),
6627                                               FakeRParenLoc);
6628 }
6629 
6630 template<typename Derived>
6631 ExprResult
TransformCXXStaticCastExpr(CXXStaticCastExpr * E)6632 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
6633   return getDerived().TransformCXXNamedCastExpr(E);
6634 }
6635 
6636 template<typename Derived>
6637 ExprResult
TransformCXXDynamicCastExpr(CXXDynamicCastExpr * E)6638 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
6639   return getDerived().TransformCXXNamedCastExpr(E);
6640 }
6641 
6642 template<typename Derived>
6643 ExprResult
TransformCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)6644 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
6645                                                       CXXReinterpretCastExpr *E) {
6646   return getDerived().TransformCXXNamedCastExpr(E);
6647 }
6648 
6649 template<typename Derived>
6650 ExprResult
TransformCXXConstCastExpr(CXXConstCastExpr * E)6651 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
6652   return getDerived().TransformCXXNamedCastExpr(E);
6653 }
6654 
6655 template<typename Derived>
6656 ExprResult
TransformCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)6657 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
6658                                                      CXXFunctionalCastExpr *E) {
6659   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6660   if (!Type)
6661     return ExprError();
6662 
6663   ExprResult SubExpr
6664     = getDerived().TransformExpr(E->getSubExprAsWritten());
6665   if (SubExpr.isInvalid())
6666     return ExprError();
6667 
6668   if (!getDerived().AlwaysRebuild() &&
6669       Type == E->getTypeInfoAsWritten() &&
6670       SubExpr.get() == E->getSubExpr())
6671     return SemaRef.Owned(E);
6672 
6673   return getDerived().RebuildCXXFunctionalCastExpr(Type,
6674                                       /*FIXME:*/E->getSubExpr()->getLocStart(),
6675                                                    SubExpr.get(),
6676                                                    E->getRParenLoc());
6677 }
6678 
6679 template<typename Derived>
6680 ExprResult
TransformCXXTypeidExpr(CXXTypeidExpr * E)6681 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
6682   if (E->isTypeOperand()) {
6683     TypeSourceInfo *TInfo
6684       = getDerived().TransformType(E->getTypeOperandSourceInfo());
6685     if (!TInfo)
6686       return ExprError();
6687 
6688     if (!getDerived().AlwaysRebuild() &&
6689         TInfo == E->getTypeOperandSourceInfo())
6690       return SemaRef.Owned(E);
6691 
6692     return getDerived().RebuildCXXTypeidExpr(E->getType(),
6693                                              E->getLocStart(),
6694                                              TInfo,
6695                                              E->getLocEnd());
6696   }
6697 
6698   // We don't know whether the expression is potentially evaluated until
6699   // after we perform semantic analysis, so the expression is potentially
6700   // potentially evaluated.
6701   EnterExpressionEvaluationContext Unevaluated(SemaRef,
6702                                       Sema::PotentiallyPotentiallyEvaluated);
6703 
6704   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
6705   if (SubExpr.isInvalid())
6706     return ExprError();
6707 
6708   if (!getDerived().AlwaysRebuild() &&
6709       SubExpr.get() == E->getExprOperand())
6710     return SemaRef.Owned(E);
6711 
6712   return getDerived().RebuildCXXTypeidExpr(E->getType(),
6713                                            E->getLocStart(),
6714                                            SubExpr.get(),
6715                                            E->getLocEnd());
6716 }
6717 
6718 template<typename Derived>
6719 ExprResult
TransformCXXUuidofExpr(CXXUuidofExpr * E)6720 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
6721   if (E->isTypeOperand()) {
6722     TypeSourceInfo *TInfo
6723       = getDerived().TransformType(E->getTypeOperandSourceInfo());
6724     if (!TInfo)
6725       return ExprError();
6726 
6727     if (!getDerived().AlwaysRebuild() &&
6728         TInfo == E->getTypeOperandSourceInfo())
6729       return SemaRef.Owned(E);
6730 
6731     return getDerived().RebuildCXXUuidofExpr(E->getType(),
6732                                              E->getLocStart(),
6733                                              TInfo,
6734                                              E->getLocEnd());
6735   }
6736 
6737   // We don't know whether the expression is potentially evaluated until
6738   // after we perform semantic analysis, so the expression is potentially
6739   // potentially evaluated.
6740   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
6741 
6742   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
6743   if (SubExpr.isInvalid())
6744     return ExprError();
6745 
6746   if (!getDerived().AlwaysRebuild() &&
6747       SubExpr.get() == E->getExprOperand())
6748     return SemaRef.Owned(E);
6749 
6750   return getDerived().RebuildCXXUuidofExpr(E->getType(),
6751                                            E->getLocStart(),
6752                                            SubExpr.get(),
6753                                            E->getLocEnd());
6754 }
6755 
6756 template<typename Derived>
6757 ExprResult
TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)6758 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
6759   return SemaRef.Owned(E);
6760 }
6761 
6762 template<typename Derived>
6763 ExprResult
TransformCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)6764 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
6765                                                      CXXNullPtrLiteralExpr *E) {
6766   return SemaRef.Owned(E);
6767 }
6768 
6769 template<typename Derived>
6770 ExprResult
TransformCXXThisExpr(CXXThisExpr * E)6771 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
6772   DeclContext *DC = getSema().getFunctionLevelDeclContext();
6773   QualType T;
6774   if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC))
6775     T = MD->getThisType(getSema().Context);
6776   else
6777     T = getSema().Context.getPointerType(
6778       getSema().Context.getRecordType(cast<CXXRecordDecl>(DC)));
6779 
6780   if (!getDerived().AlwaysRebuild() && T == E->getType())
6781     return SemaRef.Owned(E);
6782 
6783   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
6784 }
6785 
6786 template<typename Derived>
6787 ExprResult
TransformCXXThrowExpr(CXXThrowExpr * E)6788 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
6789   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
6790   if (SubExpr.isInvalid())
6791     return ExprError();
6792 
6793   if (!getDerived().AlwaysRebuild() &&
6794       SubExpr.get() == E->getSubExpr())
6795     return SemaRef.Owned(E);
6796 
6797   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
6798                                           E->isThrownVariableInScope());
6799 }
6800 
6801 template<typename Derived>
6802 ExprResult
TransformCXXDefaultArgExpr(CXXDefaultArgExpr * E)6803 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
6804   ParmVarDecl *Param
6805     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
6806                                                            E->getParam()));
6807   if (!Param)
6808     return ExprError();
6809 
6810   if (!getDerived().AlwaysRebuild() &&
6811       Param == E->getParam())
6812     return SemaRef.Owned(E);
6813 
6814   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
6815 }
6816 
6817 template<typename Derived>
6818 ExprResult
TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)6819 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
6820                                                     CXXScalarValueInitExpr *E) {
6821   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
6822   if (!T)
6823     return ExprError();
6824 
6825   if (!getDerived().AlwaysRebuild() &&
6826       T == E->getTypeSourceInfo())
6827     return SemaRef.Owned(E);
6828 
6829   return getDerived().RebuildCXXScalarValueInitExpr(T,
6830                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
6831                                                     E->getRParenLoc());
6832 }
6833 
6834 template<typename Derived>
6835 ExprResult
TransformCXXNewExpr(CXXNewExpr * E)6836 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
6837   // Transform the type that we're allocating
6838   TypeSourceInfo *AllocTypeInfo
6839     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
6840   if (!AllocTypeInfo)
6841     return ExprError();
6842 
6843   // Transform the size of the array we're allocating (if any).
6844   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
6845   if (ArraySize.isInvalid())
6846     return ExprError();
6847 
6848   // Transform the placement arguments (if any).
6849   bool ArgumentChanged = false;
6850   ASTOwningVector<Expr*> PlacementArgs(SemaRef);
6851   if (getDerived().TransformExprs(E->getPlacementArgs(),
6852                                   E->getNumPlacementArgs(), true,
6853                                   PlacementArgs, &ArgumentChanged))
6854     return ExprError();
6855 
6856   // transform the constructor arguments (if any).
6857   ASTOwningVector<Expr*> ConstructorArgs(SemaRef);
6858   if (TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true,
6859                      ConstructorArgs, &ArgumentChanged))
6860     return ExprError();
6861 
6862   // Transform constructor, new operator, and delete operator.
6863   CXXConstructorDecl *Constructor = 0;
6864   if (E->getConstructor()) {
6865     Constructor = cast_or_null<CXXConstructorDecl>(
6866                                    getDerived().TransformDecl(E->getLocStart(),
6867                                                          E->getConstructor()));
6868     if (!Constructor)
6869       return ExprError();
6870   }
6871 
6872   FunctionDecl *OperatorNew = 0;
6873   if (E->getOperatorNew()) {
6874     OperatorNew = cast_or_null<FunctionDecl>(
6875                                  getDerived().TransformDecl(E->getLocStart(),
6876                                                          E->getOperatorNew()));
6877     if (!OperatorNew)
6878       return ExprError();
6879   }
6880 
6881   FunctionDecl *OperatorDelete = 0;
6882   if (E->getOperatorDelete()) {
6883     OperatorDelete = cast_or_null<FunctionDecl>(
6884                                    getDerived().TransformDecl(E->getLocStart(),
6885                                                        E->getOperatorDelete()));
6886     if (!OperatorDelete)
6887       return ExprError();
6888   }
6889 
6890   if (!getDerived().AlwaysRebuild() &&
6891       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
6892       ArraySize.get() == E->getArraySize() &&
6893       Constructor == E->getConstructor() &&
6894       OperatorNew == E->getOperatorNew() &&
6895       OperatorDelete == E->getOperatorDelete() &&
6896       !ArgumentChanged) {
6897     // Mark any declarations we need as referenced.
6898     // FIXME: instantiation-specific.
6899     if (Constructor)
6900       SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
6901     if (OperatorNew)
6902       SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
6903     if (OperatorDelete)
6904       SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
6905     return SemaRef.Owned(E);
6906   }
6907 
6908   QualType AllocType = AllocTypeInfo->getType();
6909   if (!ArraySize.get()) {
6910     // If no array size was specified, but the new expression was
6911     // instantiated with an array type (e.g., "new T" where T is
6912     // instantiated with "int[4]"), extract the outer bound from the
6913     // array type as our array size. We do this with constant and
6914     // dependently-sized array types.
6915     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
6916     if (!ArrayT) {
6917       // Do nothing
6918     } else if (const ConstantArrayType *ConsArrayT
6919                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
6920       ArraySize
6921         = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context,
6922                                                ConsArrayT->getSize(),
6923                                                SemaRef.Context.getSizeType(),
6924                                                /*FIXME:*/E->getLocStart()));
6925       AllocType = ConsArrayT->getElementType();
6926     } else if (const DependentSizedArrayType *DepArrayT
6927                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
6928       if (DepArrayT->getSizeExpr()) {
6929         ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr());
6930         AllocType = DepArrayT->getElementType();
6931       }
6932     }
6933   }
6934 
6935   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
6936                                         E->isGlobalNew(),
6937                                         /*FIXME:*/E->getLocStart(),
6938                                         move_arg(PlacementArgs),
6939                                         /*FIXME:*/E->getLocStart(),
6940                                         E->getTypeIdParens(),
6941                                         AllocType,
6942                                         AllocTypeInfo,
6943                                         ArraySize.get(),
6944                                         /*FIXME:*/E->hasInitializer()
6945                                           ? E->getLocStart()
6946                                           : SourceLocation(),
6947                                         move_arg(ConstructorArgs),
6948                                         /*FIXME:*/E->hasInitializer()
6949                                           ? E->getLocEnd()
6950                                           : SourceLocation());
6951 }
6952 
6953 template<typename Derived>
6954 ExprResult
TransformCXXDeleteExpr(CXXDeleteExpr * E)6955 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
6956   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
6957   if (Operand.isInvalid())
6958     return ExprError();
6959 
6960   // Transform the delete operator, if known.
6961   FunctionDecl *OperatorDelete = 0;
6962   if (E->getOperatorDelete()) {
6963     OperatorDelete = cast_or_null<FunctionDecl>(
6964                                    getDerived().TransformDecl(E->getLocStart(),
6965                                                        E->getOperatorDelete()));
6966     if (!OperatorDelete)
6967       return ExprError();
6968   }
6969 
6970   if (!getDerived().AlwaysRebuild() &&
6971       Operand.get() == E->getArgument() &&
6972       OperatorDelete == E->getOperatorDelete()) {
6973     // Mark any declarations we need as referenced.
6974     // FIXME: instantiation-specific.
6975     if (OperatorDelete)
6976       SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
6977 
6978     if (!E->getArgument()->isTypeDependent()) {
6979       QualType Destroyed = SemaRef.Context.getBaseElementType(
6980                                                          E->getDestroyedType());
6981       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
6982         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
6983         SemaRef.MarkDeclarationReferenced(E->getLocStart(),
6984                                           SemaRef.LookupDestructor(Record));
6985       }
6986     }
6987 
6988     return SemaRef.Owned(E);
6989   }
6990 
6991   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
6992                                            E->isGlobalDelete(),
6993                                            E->isArrayForm(),
6994                                            Operand.get());
6995 }
6996 
6997 template<typename Derived>
6998 ExprResult
TransformCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)6999 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
7000                                                      CXXPseudoDestructorExpr *E) {
7001   ExprResult Base = getDerived().TransformExpr(E->getBase());
7002   if (Base.isInvalid())
7003     return ExprError();
7004 
7005   ParsedType ObjectTypePtr;
7006   bool MayBePseudoDestructor = false;
7007   Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
7008                                               E->getOperatorLoc(),
7009                                         E->isArrow()? tok::arrow : tok::period,
7010                                               ObjectTypePtr,
7011                                               MayBePseudoDestructor);
7012   if (Base.isInvalid())
7013     return ExprError();
7014 
7015   QualType ObjectType = ObjectTypePtr.get();
7016   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
7017   if (QualifierLoc) {
7018     QualifierLoc
7019       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
7020     if (!QualifierLoc)
7021       return ExprError();
7022   }
7023   CXXScopeSpec SS;
7024   SS.Adopt(QualifierLoc);
7025 
7026   PseudoDestructorTypeStorage Destroyed;
7027   if (E->getDestroyedTypeInfo()) {
7028     TypeSourceInfo *DestroyedTypeInfo
7029       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
7030                                                 ObjectType, 0, SS);
7031     if (!DestroyedTypeInfo)
7032       return ExprError();
7033     Destroyed = DestroyedTypeInfo;
7034   } else if (ObjectType->isDependentType()) {
7035     // We aren't likely to be able to resolve the identifier down to a type
7036     // now anyway, so just retain the identifier.
7037     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
7038                                             E->getDestroyedTypeLoc());
7039   } else {
7040     // Look for a destructor known with the given name.
7041     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
7042                                               *E->getDestroyedTypeIdentifier(),
7043                                                 E->getDestroyedTypeLoc(),
7044                                                 /*Scope=*/0,
7045                                                 SS, ObjectTypePtr,
7046                                                 false);
7047     if (!T)
7048       return ExprError();
7049 
7050     Destroyed
7051       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
7052                                                  E->getDestroyedTypeLoc());
7053   }
7054 
7055   TypeSourceInfo *ScopeTypeInfo = 0;
7056   if (E->getScopeTypeInfo()) {
7057     ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo());
7058     if (!ScopeTypeInfo)
7059       return ExprError();
7060   }
7061 
7062   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
7063                                                      E->getOperatorLoc(),
7064                                                      E->isArrow(),
7065                                                      SS,
7066                                                      ScopeTypeInfo,
7067                                                      E->getColonColonLoc(),
7068                                                      E->getTildeLoc(),
7069                                                      Destroyed);
7070 }
7071 
7072 template<typename Derived>
7073 ExprResult
TransformUnresolvedLookupExpr(UnresolvedLookupExpr * Old)7074 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
7075                                                   UnresolvedLookupExpr *Old) {
7076   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
7077                  Sema::LookupOrdinaryName);
7078 
7079   // Transform all the decls.
7080   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
7081          E = Old->decls_end(); I != E; ++I) {
7082     NamedDecl *InstD = static_cast<NamedDecl*>(
7083                                  getDerived().TransformDecl(Old->getNameLoc(),
7084                                                             *I));
7085     if (!InstD) {
7086       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
7087       // This can happen because of dependent hiding.
7088       if (isa<UsingShadowDecl>(*I))
7089         continue;
7090       else
7091         return ExprError();
7092     }
7093 
7094     // Expand using declarations.
7095     if (isa<UsingDecl>(InstD)) {
7096       UsingDecl *UD = cast<UsingDecl>(InstD);
7097       for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
7098              E = UD->shadow_end(); I != E; ++I)
7099         R.addDecl(*I);
7100       continue;
7101     }
7102 
7103     R.addDecl(InstD);
7104   }
7105 
7106   // Resolve a kind, but don't do any further analysis.  If it's
7107   // ambiguous, the callee needs to deal with it.
7108   R.resolveKind();
7109 
7110   // Rebuild the nested-name qualifier, if present.
7111   CXXScopeSpec SS;
7112   if (Old->getQualifierLoc()) {
7113     NestedNameSpecifierLoc QualifierLoc
7114       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
7115     if (!QualifierLoc)
7116       return ExprError();
7117 
7118     SS.Adopt(QualifierLoc);
7119   }
7120 
7121   if (Old->getNamingClass()) {
7122     CXXRecordDecl *NamingClass
7123       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
7124                                                             Old->getNameLoc(),
7125                                                         Old->getNamingClass()));
7126     if (!NamingClass)
7127       return ExprError();
7128 
7129     R.setNamingClass(NamingClass);
7130   }
7131 
7132   // If we have no template arguments, it's a normal declaration name.
7133   if (!Old->hasExplicitTemplateArgs())
7134     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
7135 
7136   // If we have template arguments, rebuild them, then rebuild the
7137   // templateid expression.
7138   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
7139   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
7140                                               Old->getNumTemplateArgs(),
7141                                               TransArgs))
7142     return ExprError();
7143 
7144   return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
7145                                             TransArgs);
7146 }
7147 
7148 template<typename Derived>
7149 ExprResult
TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr * E)7150 TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
7151   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
7152   if (!T)
7153     return ExprError();
7154 
7155   if (!getDerived().AlwaysRebuild() &&
7156       T == E->getQueriedTypeSourceInfo())
7157     return SemaRef.Owned(E);
7158 
7159   return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
7160                                             E->getLocStart(),
7161                                             T,
7162                                             E->getLocEnd());
7163 }
7164 
7165 template<typename Derived>
7166 ExprResult
TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr * E)7167 TreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
7168   TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo());
7169   if (!LhsT)
7170     return ExprError();
7171 
7172   TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo());
7173   if (!RhsT)
7174     return ExprError();
7175 
7176   if (!getDerived().AlwaysRebuild() &&
7177       LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo())
7178     return SemaRef.Owned(E);
7179 
7180   return getDerived().RebuildBinaryTypeTrait(E->getTrait(),
7181                                             E->getLocStart(),
7182                                             LhsT, RhsT,
7183                                             E->getLocEnd());
7184 }
7185 
7186 template<typename Derived>
7187 ExprResult
TransformArrayTypeTraitExpr(ArrayTypeTraitExpr * E)7188 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
7189   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
7190   if (!T)
7191     return ExprError();
7192 
7193   if (!getDerived().AlwaysRebuild() &&
7194       T == E->getQueriedTypeSourceInfo())
7195     return SemaRef.Owned(E);
7196 
7197   ExprResult SubExpr;
7198   {
7199     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
7200     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
7201     if (SubExpr.isInvalid())
7202       return ExprError();
7203 
7204     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
7205       return SemaRef.Owned(E);
7206   }
7207 
7208   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
7209                                             E->getLocStart(),
7210                                             T,
7211                                             SubExpr.get(),
7212                                             E->getLocEnd());
7213 }
7214 
7215 template<typename Derived>
7216 ExprResult
TransformExpressionTraitExpr(ExpressionTraitExpr * E)7217 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
7218   ExprResult SubExpr;
7219   {
7220     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
7221     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
7222     if (SubExpr.isInvalid())
7223       return ExprError();
7224 
7225     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
7226       return SemaRef.Owned(E);
7227   }
7228 
7229   return getDerived().RebuildExpressionTrait(
7230       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
7231 }
7232 
7233 template<typename Derived>
7234 ExprResult
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)7235 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
7236                                                DependentScopeDeclRefExpr *E) {
7237   NestedNameSpecifierLoc QualifierLoc
7238   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7239   if (!QualifierLoc)
7240     return ExprError();
7241 
7242   // TODO: If this is a conversion-function-id, verify that the
7243   // destination type name (if present) resolves the same way after
7244   // instantiation as it did in the local scope.
7245 
7246   DeclarationNameInfo NameInfo
7247     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
7248   if (!NameInfo.getName())
7249     return ExprError();
7250 
7251   if (!E->hasExplicitTemplateArgs()) {
7252     if (!getDerived().AlwaysRebuild() &&
7253         QualifierLoc == E->getQualifierLoc() &&
7254         // Note: it is sufficient to compare the Name component of NameInfo:
7255         // if name has not changed, DNLoc has not changed either.
7256         NameInfo.getName() == E->getDeclName())
7257       return SemaRef.Owned(E);
7258 
7259     return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
7260                                                          NameInfo,
7261                                                          /*TemplateArgs*/ 0);
7262   }
7263 
7264   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
7265   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7266                                               E->getNumTemplateArgs(),
7267                                               TransArgs))
7268     return ExprError();
7269 
7270   return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
7271                                                        NameInfo,
7272                                                        &TransArgs);
7273 }
7274 
7275 template<typename Derived>
7276 ExprResult
TransformCXXConstructExpr(CXXConstructExpr * E)7277 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
7278   // CXXConstructExprs are always implicit, so when we have a
7279   // 1-argument construction we just transform that argument.
7280   if (E->getNumArgs() == 1 ||
7281       (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
7282     return getDerived().TransformExpr(E->getArg(0));
7283 
7284   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
7285 
7286   QualType T = getDerived().TransformType(E->getType());
7287   if (T.isNull())
7288     return ExprError();
7289 
7290   CXXConstructorDecl *Constructor
7291     = cast_or_null<CXXConstructorDecl>(
7292                                 getDerived().TransformDecl(E->getLocStart(),
7293                                                          E->getConstructor()));
7294   if (!Constructor)
7295     return ExprError();
7296 
7297   bool ArgumentChanged = false;
7298   ASTOwningVector<Expr*> Args(SemaRef);
7299   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7300                                   &ArgumentChanged))
7301     return ExprError();
7302 
7303   if (!getDerived().AlwaysRebuild() &&
7304       T == E->getType() &&
7305       Constructor == E->getConstructor() &&
7306       !ArgumentChanged) {
7307     // Mark the constructor as referenced.
7308     // FIXME: Instantiation-specific
7309     SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
7310     return SemaRef.Owned(E);
7311   }
7312 
7313   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
7314                                               Constructor, E->isElidable(),
7315                                               move_arg(Args),
7316                                               E->requiresZeroInitialization(),
7317                                               E->getConstructionKind(),
7318                                               E->getParenRange());
7319 }
7320 
7321 /// \brief Transform a C++ temporary-binding expression.
7322 ///
7323 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
7324 /// transform the subexpression and return that.
7325 template<typename Derived>
7326 ExprResult
TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)7327 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
7328   return getDerived().TransformExpr(E->getSubExpr());
7329 }
7330 
7331 /// \brief Transform a C++ expression that contains cleanups that should
7332 /// be run after the expression is evaluated.
7333 ///
7334 /// Since ExprWithCleanups nodes are implicitly generated, we
7335 /// just transform the subexpression and return that.
7336 template<typename Derived>
7337 ExprResult
TransformExprWithCleanups(ExprWithCleanups * E)7338 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
7339   return getDerived().TransformExpr(E->getSubExpr());
7340 }
7341 
7342 template<typename Derived>
7343 ExprResult
TransformCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)7344 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
7345                                                     CXXTemporaryObjectExpr *E) {
7346   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
7347   if (!T)
7348     return ExprError();
7349 
7350   CXXConstructorDecl *Constructor
7351     = cast_or_null<CXXConstructorDecl>(
7352                                   getDerived().TransformDecl(E->getLocStart(),
7353                                                          E->getConstructor()));
7354   if (!Constructor)
7355     return ExprError();
7356 
7357   bool ArgumentChanged = false;
7358   ASTOwningVector<Expr*> Args(SemaRef);
7359   Args.reserve(E->getNumArgs());
7360   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7361                      &ArgumentChanged))
7362     return ExprError();
7363 
7364   if (!getDerived().AlwaysRebuild() &&
7365       T == E->getTypeSourceInfo() &&
7366       Constructor == E->getConstructor() &&
7367       !ArgumentChanged) {
7368     // FIXME: Instantiation-specific
7369     SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
7370     return SemaRef.MaybeBindToTemporary(E);
7371   }
7372 
7373   return getDerived().RebuildCXXTemporaryObjectExpr(T,
7374                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
7375                                                     move_arg(Args),
7376                                                     E->getLocEnd());
7377 }
7378 
7379 template<typename Derived>
7380 ExprResult
TransformCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)7381 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
7382                                                   CXXUnresolvedConstructExpr *E) {
7383   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
7384   if (!T)
7385     return ExprError();
7386 
7387   bool ArgumentChanged = false;
7388   ASTOwningVector<Expr*> Args(SemaRef);
7389   Args.reserve(E->arg_size());
7390   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
7391                                   &ArgumentChanged))
7392     return ExprError();
7393 
7394   if (!getDerived().AlwaysRebuild() &&
7395       T == E->getTypeSourceInfo() &&
7396       !ArgumentChanged)
7397     return SemaRef.Owned(E);
7398 
7399   // FIXME: we're faking the locations of the commas
7400   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
7401                                                         E->getLParenLoc(),
7402                                                         move_arg(Args),
7403                                                         E->getRParenLoc());
7404 }
7405 
7406 template<typename Derived>
7407 ExprResult
TransformCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)7408 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
7409                                              CXXDependentScopeMemberExpr *E) {
7410   // Transform the base of the expression.
7411   ExprResult Base((Expr*) 0);
7412   Expr *OldBase;
7413   QualType BaseType;
7414   QualType ObjectType;
7415   if (!E->isImplicitAccess()) {
7416     OldBase = E->getBase();
7417     Base = getDerived().TransformExpr(OldBase);
7418     if (Base.isInvalid())
7419       return ExprError();
7420 
7421     // Start the member reference and compute the object's type.
7422     ParsedType ObjectTy;
7423     bool MayBePseudoDestructor = false;
7424     Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
7425                                                 E->getOperatorLoc(),
7426                                       E->isArrow()? tok::arrow : tok::period,
7427                                                 ObjectTy,
7428                                                 MayBePseudoDestructor);
7429     if (Base.isInvalid())
7430       return ExprError();
7431 
7432     ObjectType = ObjectTy.get();
7433     BaseType = ((Expr*) Base.get())->getType();
7434   } else {
7435     OldBase = 0;
7436     BaseType = getDerived().TransformType(E->getBaseType());
7437     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
7438   }
7439 
7440   // Transform the first part of the nested-name-specifier that qualifies
7441   // the member name.
7442   NamedDecl *FirstQualifierInScope
7443     = getDerived().TransformFirstQualifierInScope(
7444                                             E->getFirstQualifierFoundInScope(),
7445                                             E->getQualifierLoc().getBeginLoc());
7446 
7447   NestedNameSpecifierLoc QualifierLoc;
7448   if (E->getQualifier()) {
7449     QualifierLoc
7450       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
7451                                                      ObjectType,
7452                                                      FirstQualifierInScope);
7453     if (!QualifierLoc)
7454       return ExprError();
7455   }
7456 
7457   // TODO: If this is a conversion-function-id, verify that the
7458   // destination type name (if present) resolves the same way after
7459   // instantiation as it did in the local scope.
7460 
7461   DeclarationNameInfo NameInfo
7462     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
7463   if (!NameInfo.getName())
7464     return ExprError();
7465 
7466   if (!E->hasExplicitTemplateArgs()) {
7467     // This is a reference to a member without an explicitly-specified
7468     // template argument list. Optimize for this common case.
7469     if (!getDerived().AlwaysRebuild() &&
7470         Base.get() == OldBase &&
7471         BaseType == E->getBaseType() &&
7472         QualifierLoc == E->getQualifierLoc() &&
7473         NameInfo.getName() == E->getMember() &&
7474         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
7475       return SemaRef.Owned(E);
7476 
7477     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
7478                                                        BaseType,
7479                                                        E->isArrow(),
7480                                                        E->getOperatorLoc(),
7481                                                        QualifierLoc,
7482                                                        FirstQualifierInScope,
7483                                                        NameInfo,
7484                                                        /*TemplateArgs*/ 0);
7485   }
7486 
7487   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
7488   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7489                                               E->getNumTemplateArgs(),
7490                                               TransArgs))
7491     return ExprError();
7492 
7493   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
7494                                                      BaseType,
7495                                                      E->isArrow(),
7496                                                      E->getOperatorLoc(),
7497                                                      QualifierLoc,
7498                                                      FirstQualifierInScope,
7499                                                      NameInfo,
7500                                                      &TransArgs);
7501 }
7502 
7503 template<typename Derived>
7504 ExprResult
TransformUnresolvedMemberExpr(UnresolvedMemberExpr * Old)7505 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
7506   // Transform the base of the expression.
7507   ExprResult Base((Expr*) 0);
7508   QualType BaseType;
7509   if (!Old->isImplicitAccess()) {
7510     Base = getDerived().TransformExpr(Old->getBase());
7511     if (Base.isInvalid())
7512       return ExprError();
7513     BaseType = ((Expr*) Base.get())->getType();
7514   } else {
7515     BaseType = getDerived().TransformType(Old->getBaseType());
7516   }
7517 
7518   NestedNameSpecifierLoc QualifierLoc;
7519   if (Old->getQualifierLoc()) {
7520     QualifierLoc
7521     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
7522     if (!QualifierLoc)
7523       return ExprError();
7524   }
7525 
7526   LookupResult R(SemaRef, Old->getMemberNameInfo(),
7527                  Sema::LookupOrdinaryName);
7528 
7529   // Transform all the decls.
7530   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
7531          E = Old->decls_end(); I != E; ++I) {
7532     NamedDecl *InstD = static_cast<NamedDecl*>(
7533                                 getDerived().TransformDecl(Old->getMemberLoc(),
7534                                                            *I));
7535     if (!InstD) {
7536       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
7537       // This can happen because of dependent hiding.
7538       if (isa<UsingShadowDecl>(*I))
7539         continue;
7540       else {
7541         R.clear();
7542         return ExprError();
7543       }
7544     }
7545 
7546     // Expand using declarations.
7547     if (isa<UsingDecl>(InstD)) {
7548       UsingDecl *UD = cast<UsingDecl>(InstD);
7549       for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
7550              E = UD->shadow_end(); I != E; ++I)
7551         R.addDecl(*I);
7552       continue;
7553     }
7554 
7555     R.addDecl(InstD);
7556   }
7557 
7558   R.resolveKind();
7559 
7560   // Determine the naming class.
7561   if (Old->getNamingClass()) {
7562     CXXRecordDecl *NamingClass
7563       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
7564                                                           Old->getMemberLoc(),
7565                                                         Old->getNamingClass()));
7566     if (!NamingClass)
7567       return ExprError();
7568 
7569     R.setNamingClass(NamingClass);
7570   }
7571 
7572   TemplateArgumentListInfo TransArgs;
7573   if (Old->hasExplicitTemplateArgs()) {
7574     TransArgs.setLAngleLoc(Old->getLAngleLoc());
7575     TransArgs.setRAngleLoc(Old->getRAngleLoc());
7576     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
7577                                                 Old->getNumTemplateArgs(),
7578                                                 TransArgs))
7579       return ExprError();
7580   }
7581 
7582   // FIXME: to do this check properly, we will need to preserve the
7583   // first-qualifier-in-scope here, just in case we had a dependent
7584   // base (and therefore couldn't do the check) and a
7585   // nested-name-qualifier (and therefore could do the lookup).
7586   NamedDecl *FirstQualifierInScope = 0;
7587 
7588   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
7589                                                   BaseType,
7590                                                   Old->getOperatorLoc(),
7591                                                   Old->isArrow(),
7592                                                   QualifierLoc,
7593                                                   FirstQualifierInScope,
7594                                                   R,
7595                                               (Old->hasExplicitTemplateArgs()
7596                                                   ? &TransArgs : 0));
7597 }
7598 
7599 template<typename Derived>
7600 ExprResult
TransformCXXNoexceptExpr(CXXNoexceptExpr * E)7601 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
7602   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
7603   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
7604   if (SubExpr.isInvalid())
7605     return ExprError();
7606 
7607   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
7608     return SemaRef.Owned(E);
7609 
7610   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
7611 }
7612 
7613 template<typename Derived>
7614 ExprResult
TransformPackExpansionExpr(PackExpansionExpr * E)7615 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
7616   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
7617   if (Pattern.isInvalid())
7618     return ExprError();
7619 
7620   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
7621     return SemaRef.Owned(E);
7622 
7623   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
7624                                            E->getNumExpansions());
7625 }
7626 
7627 template<typename Derived>
7628 ExprResult
TransformSizeOfPackExpr(SizeOfPackExpr * E)7629 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
7630   // If E is not value-dependent, then nothing will change when we transform it.
7631   // Note: This is an instantiation-centric view.
7632   if (!E->isValueDependent())
7633     return SemaRef.Owned(E);
7634 
7635   // Note: None of the implementations of TryExpandParameterPacks can ever
7636   // produce a diagnostic when given only a single unexpanded parameter pack,
7637   // so
7638   UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
7639   bool ShouldExpand = false;
7640   bool RetainExpansion = false;
7641   llvm::Optional<unsigned> NumExpansions;
7642   if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
7643                                            &Unexpanded, 1,
7644                                            ShouldExpand, RetainExpansion,
7645                                            NumExpansions))
7646     return ExprError();
7647 
7648   if (!ShouldExpand || RetainExpansion)
7649     return SemaRef.Owned(E);
7650 
7651   // We now know the length of the parameter pack, so build a new expression
7652   // that stores that length.
7653   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
7654                                             E->getPackLoc(), E->getRParenLoc(),
7655                                             *NumExpansions);
7656 }
7657 
7658 template<typename Derived>
7659 ExprResult
TransformSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)7660 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
7661                                           SubstNonTypeTemplateParmPackExpr *E) {
7662   // Default behavior is to do nothing with this transformation.
7663   return SemaRef.Owned(E);
7664 }
7665 
7666 template<typename Derived>
7667 ExprResult
TransformSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)7668 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
7669                                           SubstNonTypeTemplateParmExpr *E) {
7670   // Default behavior is to do nothing with this transformation.
7671   return SemaRef.Owned(E);
7672 }
7673 
7674 template<typename Derived>
7675 ExprResult
TransformMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)7676 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
7677                                                   MaterializeTemporaryExpr *E) {
7678   return getDerived().TransformExpr(E->GetTemporaryExpr());
7679 }
7680 
7681 template<typename Derived>
7682 ExprResult
TransformObjCStringLiteral(ObjCStringLiteral * E)7683 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
7684   return SemaRef.Owned(E);
7685 }
7686 
7687 template<typename Derived>
7688 ExprResult
TransformObjCEncodeExpr(ObjCEncodeExpr * E)7689 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
7690   TypeSourceInfo *EncodedTypeInfo
7691     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
7692   if (!EncodedTypeInfo)
7693     return ExprError();
7694 
7695   if (!getDerived().AlwaysRebuild() &&
7696       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
7697     return SemaRef.Owned(E);
7698 
7699   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
7700                                             EncodedTypeInfo,
7701                                             E->getRParenLoc());
7702 }
7703 
7704 template<typename Derived>
7705 ExprResult TreeTransform<Derived>::
TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)7706 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
7707   ExprResult result = getDerived().TransformExpr(E->getSubExpr());
7708   if (result.isInvalid()) return ExprError();
7709   Expr *subExpr = result.take();
7710 
7711   if (!getDerived().AlwaysRebuild() &&
7712       subExpr == E->getSubExpr())
7713     return SemaRef.Owned(E);
7714 
7715   return SemaRef.Owned(new(SemaRef.Context)
7716       ObjCIndirectCopyRestoreExpr(subExpr, E->getType(), E->shouldCopy()));
7717 }
7718 
7719 template<typename Derived>
7720 ExprResult TreeTransform<Derived>::
TransformObjCBridgedCastExpr(ObjCBridgedCastExpr * E)7721 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
7722   TypeSourceInfo *TSInfo
7723     = getDerived().TransformType(E->getTypeInfoAsWritten());
7724   if (!TSInfo)
7725     return ExprError();
7726 
7727   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
7728   if (Result.isInvalid())
7729     return ExprError();
7730 
7731   if (!getDerived().AlwaysRebuild() &&
7732       TSInfo == E->getTypeInfoAsWritten() &&
7733       Result.get() == E->getSubExpr())
7734     return SemaRef.Owned(E);
7735 
7736   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
7737                                       E->getBridgeKeywordLoc(), TSInfo,
7738                                       Result.get());
7739 }
7740 
7741 template<typename Derived>
7742 ExprResult
TransformObjCMessageExpr(ObjCMessageExpr * E)7743 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
7744   // Transform arguments.
7745   bool ArgChanged = false;
7746   ASTOwningVector<Expr*> Args(SemaRef);
7747   Args.reserve(E->getNumArgs());
7748   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
7749                                   &ArgChanged))
7750     return ExprError();
7751 
7752   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
7753     // Class message: transform the receiver type.
7754     TypeSourceInfo *ReceiverTypeInfo
7755       = getDerived().TransformType(E->getClassReceiverTypeInfo());
7756     if (!ReceiverTypeInfo)
7757       return ExprError();
7758 
7759     // If nothing changed, just retain the existing message send.
7760     if (!getDerived().AlwaysRebuild() &&
7761         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
7762       return SemaRef.Owned(E);
7763 
7764     // Build a new class message send.
7765     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
7766                                                E->getSelector(),
7767                                                E->getSelectorLoc(),
7768                                                E->getMethodDecl(),
7769                                                E->getLeftLoc(),
7770                                                move_arg(Args),
7771                                                E->getRightLoc());
7772   }
7773 
7774   // Instance message: transform the receiver
7775   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
7776          "Only class and instance messages may be instantiated");
7777   ExprResult Receiver
7778     = getDerived().TransformExpr(E->getInstanceReceiver());
7779   if (Receiver.isInvalid())
7780     return ExprError();
7781 
7782   // If nothing changed, just retain the existing message send.
7783   if (!getDerived().AlwaysRebuild() &&
7784       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
7785     return SemaRef.Owned(E);
7786 
7787   // Build a new instance message send.
7788   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
7789                                              E->getSelector(),
7790                                              E->getSelectorLoc(),
7791                                              E->getMethodDecl(),
7792                                              E->getLeftLoc(),
7793                                              move_arg(Args),
7794                                              E->getRightLoc());
7795 }
7796 
7797 template<typename Derived>
7798 ExprResult
TransformObjCSelectorExpr(ObjCSelectorExpr * E)7799 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
7800   return SemaRef.Owned(E);
7801 }
7802 
7803 template<typename Derived>
7804 ExprResult
TransformObjCProtocolExpr(ObjCProtocolExpr * E)7805 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
7806   return SemaRef.Owned(E);
7807 }
7808 
7809 template<typename Derived>
7810 ExprResult
TransformObjCIvarRefExpr(ObjCIvarRefExpr * E)7811 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
7812   // Transform the base expression.
7813   ExprResult Base = getDerived().TransformExpr(E->getBase());
7814   if (Base.isInvalid())
7815     return ExprError();
7816 
7817   // We don't need to transform the ivar; it will never change.
7818 
7819   // If nothing changed, just retain the existing expression.
7820   if (!getDerived().AlwaysRebuild() &&
7821       Base.get() == E->getBase())
7822     return SemaRef.Owned(E);
7823 
7824   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
7825                                              E->getLocation(),
7826                                              E->isArrow(), E->isFreeIvar());
7827 }
7828 
7829 template<typename Derived>
7830 ExprResult
TransformObjCPropertyRefExpr(ObjCPropertyRefExpr * E)7831 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
7832   // 'super' and types never change. Property never changes. Just
7833   // retain the existing expression.
7834   if (!E->isObjectReceiver())
7835     return SemaRef.Owned(E);
7836 
7837   // Transform the base expression.
7838   ExprResult Base = getDerived().TransformExpr(E->getBase());
7839   if (Base.isInvalid())
7840     return ExprError();
7841 
7842   // We don't need to transform the property; it will never change.
7843 
7844   // If nothing changed, just retain the existing expression.
7845   if (!getDerived().AlwaysRebuild() &&
7846       Base.get() == E->getBase())
7847     return SemaRef.Owned(E);
7848 
7849   if (E->isExplicitProperty())
7850     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
7851                                                    E->getExplicitProperty(),
7852                                                    E->getLocation());
7853 
7854   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
7855                                                  E->getType(),
7856                                                  E->getImplicitPropertyGetter(),
7857                                                  E->getImplicitPropertySetter(),
7858                                                  E->getLocation());
7859 }
7860 
7861 template<typename Derived>
7862 ExprResult
TransformObjCIsaExpr(ObjCIsaExpr * E)7863 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
7864   // Transform the base expression.
7865   ExprResult Base = getDerived().TransformExpr(E->getBase());
7866   if (Base.isInvalid())
7867     return ExprError();
7868 
7869   // If nothing changed, just retain the existing expression.
7870   if (!getDerived().AlwaysRebuild() &&
7871       Base.get() == E->getBase())
7872     return SemaRef.Owned(E);
7873 
7874   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
7875                                          E->isArrow());
7876 }
7877 
7878 template<typename Derived>
7879 ExprResult
TransformShuffleVectorExpr(ShuffleVectorExpr * E)7880 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
7881   bool ArgumentChanged = false;
7882   ASTOwningVector<Expr*> SubExprs(SemaRef);
7883   SubExprs.reserve(E->getNumSubExprs());
7884   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
7885                                   SubExprs, &ArgumentChanged))
7886     return ExprError();
7887 
7888   if (!getDerived().AlwaysRebuild() &&
7889       !ArgumentChanged)
7890     return SemaRef.Owned(E);
7891 
7892   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
7893                                                move_arg(SubExprs),
7894                                                E->getRParenLoc());
7895 }
7896 
7897 template<typename Derived>
7898 ExprResult
TransformBlockExpr(BlockExpr * E)7899 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
7900   BlockDecl *oldBlock = E->getBlockDecl();
7901 
7902   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0);
7903   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
7904 
7905   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
7906   // We built a new blockScopeInfo in call to ActOnBlockStart
7907   // in above, CapturesCXXThis need be set here from the block
7908   // expression.
7909   blockScope->CapturesCXXThis = oldBlock->capturesCXXThis();
7910 
7911   llvm::SmallVector<ParmVarDecl*, 4> params;
7912   llvm::SmallVector<QualType, 4> paramTypes;
7913 
7914   // Parameter substitution.
7915   if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
7916                                                oldBlock->param_begin(),
7917                                                oldBlock->param_size(),
7918                                                0, paramTypes, &params))
7919     return true;
7920 
7921   const FunctionType *exprFunctionType = E->getFunctionType();
7922   QualType exprResultType = exprFunctionType->getResultType();
7923   if (!exprResultType.isNull()) {
7924     if (!exprResultType->isDependentType())
7925       blockScope->ReturnType = exprResultType;
7926     else if (exprResultType != getSema().Context.DependentTy)
7927       blockScope->ReturnType = getDerived().TransformType(exprResultType);
7928   }
7929 
7930   // If the return type has not been determined yet, leave it as a dependent
7931   // type; it'll get set when we process the body.
7932   if (blockScope->ReturnType.isNull())
7933     blockScope->ReturnType = getSema().Context.DependentTy;
7934 
7935   // Don't allow returning a objc interface by value.
7936   if (blockScope->ReturnType->isObjCObjectType()) {
7937     getSema().Diag(E->getCaretLocation(),
7938                    diag::err_object_cannot_be_passed_returned_by_value)
7939       << 0 << blockScope->ReturnType;
7940     return ExprError();
7941   }
7942 
7943   QualType functionType = getDerived().RebuildFunctionProtoType(
7944                                                         blockScope->ReturnType,
7945                                                         paramTypes.data(),
7946                                                         paramTypes.size(),
7947                                                         oldBlock->isVariadic(),
7948                                                         0, RQ_None,
7949                                                exprFunctionType->getExtInfo());
7950   blockScope->FunctionType = functionType;
7951 
7952   // Set the parameters on the block decl.
7953   if (!params.empty())
7954     blockScope->TheDecl->setParams(params.data(), params.size());
7955 
7956   // If the return type wasn't explicitly set, it will have been marked as a
7957   // dependent type (DependentTy); clear out the return type setting so
7958   // we will deduce the return type when type-checking the block's body.
7959   if (blockScope->ReturnType == getSema().Context.DependentTy)
7960     blockScope->ReturnType = QualType();
7961 
7962   // Transform the body
7963   StmtResult body = getDerived().TransformStmt(E->getBody());
7964   if (body.isInvalid())
7965     return ExprError();
7966 
7967 #ifndef NDEBUG
7968   // In builds with assertions, make sure that we captured everything we
7969   // captured before.
7970   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
7971     for (BlockDecl::capture_iterator i = oldBlock->capture_begin(),
7972            e = oldBlock->capture_end(); i != e; ++i) {
7973       VarDecl *oldCapture = i->getVariable();
7974 
7975       // Ignore parameter packs.
7976       if (isa<ParmVarDecl>(oldCapture) &&
7977           cast<ParmVarDecl>(oldCapture)->isParameterPack())
7978         continue;
7979 
7980       VarDecl *newCapture =
7981         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
7982                                                  oldCapture));
7983       assert(blockScope->CaptureMap.count(newCapture));
7984     }
7985   }
7986 #endif
7987 
7988   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
7989                                     /*Scope=*/0);
7990 }
7991 
7992 template<typename Derived>
7993 ExprResult
TransformBlockDeclRefExpr(BlockDeclRefExpr * E)7994 TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
7995   ValueDecl *ND
7996   = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
7997                                                        E->getDecl()));
7998   if (!ND)
7999     return ExprError();
8000 
8001   if (!getDerived().AlwaysRebuild() &&
8002       ND == E->getDecl()) {
8003     // Mark it referenced in the new context regardless.
8004     // FIXME: this is a bit instantiation-specific.
8005     SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
8006 
8007     return SemaRef.Owned(E);
8008   }
8009 
8010   DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation());
8011   return getDerived().RebuildDeclRefExpr(NestedNameSpecifierLoc(),
8012                                          ND, NameInfo, 0);
8013 }
8014 
8015 template<typename Derived>
8016 ExprResult
TransformAsTypeExpr(AsTypeExpr * E)8017 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
8018   assert(false && "Cannot transform asType expressions yet");
8019   return SemaRef.Owned(E);
8020 }
8021 
8022 //===----------------------------------------------------------------------===//
8023 // Type reconstruction
8024 //===----------------------------------------------------------------------===//
8025 
8026 template<typename Derived>
RebuildPointerType(QualType PointeeType,SourceLocation Star)8027 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
8028                                                     SourceLocation Star) {
8029   return SemaRef.BuildPointerType(PointeeType, Star,
8030                                   getDerived().getBaseEntity());
8031 }
8032 
8033 template<typename Derived>
RebuildBlockPointerType(QualType PointeeType,SourceLocation Star)8034 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
8035                                                          SourceLocation Star) {
8036   return SemaRef.BuildBlockPointerType(PointeeType, Star,
8037                                        getDerived().getBaseEntity());
8038 }
8039 
8040 template<typename Derived>
8041 QualType
RebuildReferenceType(QualType ReferentType,bool WrittenAsLValue,SourceLocation Sigil)8042 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
8043                                              bool WrittenAsLValue,
8044                                              SourceLocation Sigil) {
8045   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
8046                                     Sigil, getDerived().getBaseEntity());
8047 }
8048 
8049 template<typename Derived>
8050 QualType
RebuildMemberPointerType(QualType PointeeType,QualType ClassType,SourceLocation Sigil)8051 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
8052                                                  QualType ClassType,
8053                                                  SourceLocation Sigil) {
8054   return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
8055                                         Sigil, getDerived().getBaseEntity());
8056 }
8057 
8058 template<typename Derived>
8059 QualType
RebuildArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt * Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)8060 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
8061                                          ArrayType::ArraySizeModifier SizeMod,
8062                                          const llvm::APInt *Size,
8063                                          Expr *SizeExpr,
8064                                          unsigned IndexTypeQuals,
8065                                          SourceRange BracketsRange) {
8066   if (SizeExpr || !Size)
8067     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
8068                                   IndexTypeQuals, BracketsRange,
8069                                   getDerived().getBaseEntity());
8070 
8071   QualType Types[] = {
8072     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
8073     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
8074     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
8075   };
8076   const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
8077   QualType SizeType;
8078   for (unsigned I = 0; I != NumTypes; ++I)
8079     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
8080       SizeType = Types[I];
8081       break;
8082     }
8083 
8084   IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType,
8085                            /*FIXME*/BracketsRange.getBegin());
8086   return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
8087                                 IndexTypeQuals, BracketsRange,
8088                                 getDerived().getBaseEntity());
8089 }
8090 
8091 template<typename Derived>
8092 QualType
RebuildConstantArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt & Size,unsigned IndexTypeQuals,SourceRange BracketsRange)8093 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
8094                                                  ArrayType::ArraySizeModifier SizeMod,
8095                                                  const llvm::APInt &Size,
8096                                                  unsigned IndexTypeQuals,
8097                                                  SourceRange BracketsRange) {
8098   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
8099                                         IndexTypeQuals, BracketsRange);
8100 }
8101 
8102 template<typename Derived>
8103 QualType
RebuildIncompleteArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,unsigned IndexTypeQuals,SourceRange BracketsRange)8104 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
8105                                           ArrayType::ArraySizeModifier SizeMod,
8106                                                  unsigned IndexTypeQuals,
8107                                                    SourceRange BracketsRange) {
8108   return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
8109                                        IndexTypeQuals, BracketsRange);
8110 }
8111 
8112 template<typename Derived>
8113 QualType
RebuildVariableArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)8114 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
8115                                           ArrayType::ArraySizeModifier SizeMod,
8116                                                  Expr *SizeExpr,
8117                                                  unsigned IndexTypeQuals,
8118                                                  SourceRange BracketsRange) {
8119   return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
8120                                        SizeExpr,
8121                                        IndexTypeQuals, BracketsRange);
8122 }
8123 
8124 template<typename Derived>
8125 QualType
RebuildDependentSizedArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)8126 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
8127                                           ArrayType::ArraySizeModifier SizeMod,
8128                                                        Expr *SizeExpr,
8129                                                        unsigned IndexTypeQuals,
8130                                                    SourceRange BracketsRange) {
8131   return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
8132                                        SizeExpr,
8133                                        IndexTypeQuals, BracketsRange);
8134 }
8135 
8136 template<typename Derived>
RebuildVectorType(QualType ElementType,unsigned NumElements,VectorType::VectorKind VecKind)8137 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
8138                                                unsigned NumElements,
8139                                                VectorType::VectorKind VecKind) {
8140   // FIXME: semantic checking!
8141   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
8142 }
8143 
8144 template<typename Derived>
RebuildExtVectorType(QualType ElementType,unsigned NumElements,SourceLocation AttributeLoc)8145 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
8146                                                       unsigned NumElements,
8147                                                  SourceLocation AttributeLoc) {
8148   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
8149                           NumElements, true);
8150   IntegerLiteral *VectorSize
8151     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
8152                              AttributeLoc);
8153   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
8154 }
8155 
8156 template<typename Derived>
8157 QualType
RebuildDependentSizedExtVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc)8158 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
8159                                                            Expr *SizeExpr,
8160                                                   SourceLocation AttributeLoc) {
8161   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
8162 }
8163 
8164 template<typename Derived>
RebuildFunctionProtoType(QualType T,QualType * ParamTypes,unsigned NumParamTypes,bool Variadic,unsigned Quals,RefQualifierKind RefQualifier,const FunctionType::ExtInfo & Info)8165 QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
8166                                                           QualType *ParamTypes,
8167                                                         unsigned NumParamTypes,
8168                                                           bool Variadic,
8169                                                           unsigned Quals,
8170                                                   RefQualifierKind RefQualifier,
8171                                             const FunctionType::ExtInfo &Info) {
8172   return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
8173                                    Quals, RefQualifier,
8174                                    getDerived().getBaseLocation(),
8175                                    getDerived().getBaseEntity(),
8176                                    Info);
8177 }
8178 
8179 template<typename Derived>
RebuildFunctionNoProtoType(QualType T)8180 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
8181   return SemaRef.Context.getFunctionNoProtoType(T);
8182 }
8183 
8184 template<typename Derived>
RebuildUnresolvedUsingType(Decl * D)8185 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
8186   assert(D && "no decl found");
8187   if (D->isInvalidDecl()) return QualType();
8188 
8189   // FIXME: Doesn't account for ObjCInterfaceDecl!
8190   TypeDecl *Ty;
8191   if (isa<UsingDecl>(D)) {
8192     UsingDecl *Using = cast<UsingDecl>(D);
8193     assert(Using->isTypeName() &&
8194            "UnresolvedUsingTypenameDecl transformed to non-typename using");
8195 
8196     // A valid resolved using typename decl points to exactly one type decl.
8197     assert(++Using->shadow_begin() == Using->shadow_end());
8198     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
8199 
8200   } else {
8201     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
8202            "UnresolvedUsingTypenameDecl transformed to non-using decl");
8203     Ty = cast<UnresolvedUsingTypenameDecl>(D);
8204   }
8205 
8206   return SemaRef.Context.getTypeDeclType(Ty);
8207 }
8208 
8209 template<typename Derived>
RebuildTypeOfExprType(Expr * E,SourceLocation Loc)8210 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
8211                                                        SourceLocation Loc) {
8212   return SemaRef.BuildTypeofExprType(E, Loc);
8213 }
8214 
8215 template<typename Derived>
RebuildTypeOfType(QualType Underlying)8216 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
8217   return SemaRef.Context.getTypeOfType(Underlying);
8218 }
8219 
8220 template<typename Derived>
RebuildDecltypeType(Expr * E,SourceLocation Loc)8221 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
8222                                                      SourceLocation Loc) {
8223   return SemaRef.BuildDecltypeType(E, Loc);
8224 }
8225 
8226 template<typename Derived>
RebuildUnaryTransformType(QualType BaseType,UnaryTransformType::UTTKind UKind,SourceLocation Loc)8227 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
8228                                             UnaryTransformType::UTTKind UKind,
8229                                             SourceLocation Loc) {
8230   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
8231 }
8232 
8233 template<typename Derived>
RebuildTemplateSpecializationType(TemplateName Template,SourceLocation TemplateNameLoc,TemplateArgumentListInfo & TemplateArgs)8234 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
8235                                                       TemplateName Template,
8236                                              SourceLocation TemplateNameLoc,
8237                                      TemplateArgumentListInfo &TemplateArgs) {
8238   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
8239 }
8240 
8241 template<typename Derived>
8242 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,bool TemplateKW,TemplateDecl * Template)8243 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
8244                                             bool TemplateKW,
8245                                             TemplateDecl *Template) {
8246   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
8247                                                   Template);
8248 }
8249 
8250 template<typename Derived>
8251 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,const IdentifierInfo & Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)8252 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
8253                                             const IdentifierInfo &Name,
8254                                             SourceLocation NameLoc,
8255                                             QualType ObjectType,
8256                                             NamedDecl *FirstQualifierInScope) {
8257   UnqualifiedId TemplateName;
8258   TemplateName.setIdentifier(&Name, NameLoc);
8259   Sema::TemplateTy Template;
8260   getSema().ActOnDependentTemplateName(/*Scope=*/0,
8261                                        /*FIXME:*/SourceLocation(),
8262                                        SS,
8263                                        TemplateName,
8264                                        ParsedType::make(ObjectType),
8265                                        /*EnteringContext=*/false,
8266                                        Template);
8267   return Template.get();
8268 }
8269 
8270 template<typename Derived>
8271 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,OverloadedOperatorKind Operator,SourceLocation NameLoc,QualType ObjectType)8272 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
8273                                             OverloadedOperatorKind Operator,
8274                                             SourceLocation NameLoc,
8275                                             QualType ObjectType) {
8276   UnqualifiedId Name;
8277   // FIXME: Bogus location information.
8278   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
8279   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
8280   Sema::TemplateTy Template;
8281   getSema().ActOnDependentTemplateName(/*Scope=*/0,
8282                                        /*FIXME:*/SourceLocation(),
8283                                        SS,
8284                                        Name,
8285                                        ParsedType::make(ObjectType),
8286                                        /*EnteringContext=*/false,
8287                                        Template);
8288   return Template.template getAsVal<TemplateName>();
8289 }
8290 
8291 template<typename Derived>
8292 ExprResult
RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,SourceLocation OpLoc,Expr * OrigCallee,Expr * First,Expr * Second)8293 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
8294                                                    SourceLocation OpLoc,
8295                                                    Expr *OrigCallee,
8296                                                    Expr *First,
8297                                                    Expr *Second) {
8298   Expr *Callee = OrigCallee->IgnoreParenCasts();
8299   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
8300 
8301   // Determine whether this should be a builtin operation.
8302   if (Op == OO_Subscript) {
8303     if (!First->getType()->isOverloadableType() &&
8304         !Second->getType()->isOverloadableType())
8305       return getSema().CreateBuiltinArraySubscriptExpr(First,
8306                                                        Callee->getLocStart(),
8307                                                        Second, OpLoc);
8308   } else if (Op == OO_Arrow) {
8309     // -> is never a builtin operation.
8310     return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc);
8311   } else if (Second == 0 || isPostIncDec) {
8312     if (!First->getType()->isOverloadableType()) {
8313       // The argument is not of overloadable type, so try to create a
8314       // built-in unary operation.
8315       UnaryOperatorKind Opc
8316         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
8317 
8318       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
8319     }
8320   } else {
8321     if (!First->getType()->isOverloadableType() &&
8322         !Second->getType()->isOverloadableType()) {
8323       // Neither of the arguments is an overloadable type, so try to
8324       // create a built-in binary operation.
8325       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
8326       ExprResult Result
8327         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
8328       if (Result.isInvalid())
8329         return ExprError();
8330 
8331       return move(Result);
8332     }
8333   }
8334 
8335   // Compute the transformed set of functions (and function templates) to be
8336   // used during overload resolution.
8337   UnresolvedSet<16> Functions;
8338 
8339   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
8340     assert(ULE->requiresADL());
8341 
8342     // FIXME: Do we have to check
8343     // IsAcceptableNonMemberOperatorCandidate for each of these?
8344     Functions.append(ULE->decls_begin(), ULE->decls_end());
8345   } else {
8346     Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl());
8347   }
8348 
8349   // Add any functions found via argument-dependent lookup.
8350   Expr *Args[2] = { First, Second };
8351   unsigned NumArgs = 1 + (Second != 0);
8352 
8353   // Create the overloaded operator invocation for unary operators.
8354   if (NumArgs == 1 || isPostIncDec) {
8355     UnaryOperatorKind Opc
8356       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
8357     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
8358   }
8359 
8360   if (Op == OO_Subscript) {
8361     SourceLocation LBrace;
8362     SourceLocation RBrace;
8363 
8364     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
8365         DeclarationNameLoc &NameLoc = DRE->getNameInfo().getInfo();
8366         LBrace = SourceLocation::getFromRawEncoding(
8367                     NameLoc.CXXOperatorName.BeginOpNameLoc);
8368         RBrace = SourceLocation::getFromRawEncoding(
8369                     NameLoc.CXXOperatorName.EndOpNameLoc);
8370     } else {
8371         LBrace = Callee->getLocStart();
8372         RBrace = OpLoc;
8373     }
8374 
8375     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
8376                                                       First, Second);
8377   }
8378 
8379   // Create the overloaded operator invocation for binary operators.
8380   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
8381   ExprResult Result
8382     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
8383   if (Result.isInvalid())
8384     return ExprError();
8385 
8386   return move(Result);
8387 }
8388 
8389 template<typename Derived>
8390 ExprResult
RebuildCXXPseudoDestructorExpr(Expr * Base,SourceLocation OperatorLoc,bool isArrow,CXXScopeSpec & SS,TypeSourceInfo * ScopeType,SourceLocation CCLoc,SourceLocation TildeLoc,PseudoDestructorTypeStorage Destroyed)8391 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
8392                                                      SourceLocation OperatorLoc,
8393                                                        bool isArrow,
8394                                                        CXXScopeSpec &SS,
8395                                                      TypeSourceInfo *ScopeType,
8396                                                        SourceLocation CCLoc,
8397                                                        SourceLocation TildeLoc,
8398                                         PseudoDestructorTypeStorage Destroyed) {
8399   QualType BaseType = Base->getType();
8400   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
8401       (!isArrow && !BaseType->getAs<RecordType>()) ||
8402       (isArrow && BaseType->getAs<PointerType>() &&
8403        !BaseType->getAs<PointerType>()->getPointeeType()
8404                                               ->template getAs<RecordType>())){
8405     // This pseudo-destructor expression is still a pseudo-destructor.
8406     return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
8407                                              isArrow? tok::arrow : tok::period,
8408                                              SS, ScopeType, CCLoc, TildeLoc,
8409                                              Destroyed,
8410                                              /*FIXME?*/true);
8411   }
8412 
8413   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
8414   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
8415                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
8416   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
8417   NameInfo.setNamedTypeInfo(DestroyedType);
8418 
8419   // FIXME: the ScopeType should be tacked onto SS.
8420 
8421   return getSema().BuildMemberReferenceExpr(Base, BaseType,
8422                                             OperatorLoc, isArrow,
8423                                             SS, /*FIXME: FirstQualifier*/ 0,
8424                                             NameInfo,
8425                                             /*TemplateArgs*/ 0);
8426 }
8427 
8428 } // end namespace clang
8429 
8430 #endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
8431