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