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