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