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