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