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 "CoroutineStmtBuilder.h"
18 #include "TypeLocBuilder.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/Expr.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/Stmt.h"
27 #include "clang/AST/StmtCXX.h"
28 #include "clang/AST/StmtObjC.h"
29 #include "clang/AST/StmtOpenMP.h"
30 #include "clang/Sema/Designator.h"
31 #include "clang/Sema/Lookup.h"
32 #include "clang/Sema/Ownership.h"
33 #include "clang/Sema/ParsedTemplate.h"
34 #include "clang/Sema/ScopeInfo.h"
35 #include "clang/Sema/SemaDiagnostic.h"
36 #include "clang/Sema/SemaInternal.h"
37 #include "llvm/ADT/ArrayRef.h"
38 #include "llvm/Support/ErrorHandling.h"
39 #include <algorithm>
40 
41 namespace clang {
42 using namespace sema;
43 
44 /// \brief A semantic tree transformation that allows one to transform one
45 /// abstract syntax tree into another.
46 ///
47 /// A new tree transformation is defined by creating a new subclass \c X of
48 /// \c TreeTransform<X> and then overriding certain operations to provide
49 /// behavior specific to that transformation. For example, template
50 /// instantiation is implemented as a tree transformation where the
51 /// transformation of TemplateTypeParmType nodes involves substituting the
52 /// template arguments for their corresponding template parameters; a similar
53 /// transformation is performed for non-type template parameters and
54 /// template template parameters.
55 ///
56 /// This tree-transformation template uses static polymorphism to allow
57 /// subclasses to customize any of its operations. Thus, a subclass can
58 /// override any of the transformation or rebuild operators by providing an
59 /// operation with the same signature as the default implementation. The
60 /// overridding function should not be virtual.
61 ///
62 /// Semantic tree transformations are split into two stages, either of which
63 /// can be replaced by a subclass. The "transform" step transforms an AST node
64 /// or the parts of an AST node using the various transformation functions,
65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
66 /// node of the appropriate kind from the pieces. The default transformation
67 /// routines recursively transform the operands to composite AST nodes (e.g.,
68 /// the pointee type of a PointerType node) and, if any of those operand nodes
69 /// were changed by the transformation, invokes the rebuild operation to create
70 /// a new AST node.
71 ///
72 /// Subclasses can customize the transformation at various levels. The
73 /// most coarse-grained transformations involve replacing TransformType(),
74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
76 /// new implementations.
77 ///
78 /// For more fine-grained transformations, subclasses can replace any of the
79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
81 /// replacing TransformTemplateTypeParmType() allows template instantiation
82 /// to substitute template arguments for their corresponding template
83 /// parameters. Additionally, subclasses can override the \c RebuildXXX
84 /// functions to control how AST nodes are rebuilt when their operands change.
85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
87 /// be able to use more efficient rebuild steps.
88 ///
89 /// There are a handful of other functions that can be overridden, allowing one
90 /// to avoid traversing nodes that don't need any transformation
91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
92 /// operands have not changed (\c AlwaysRebuild()), and customize the
93 /// default locations and entity names used for type-checking
94 /// (\c getBaseLocation(), \c getBaseEntity()).
95 template<typename Derived>
96 class TreeTransform {
97   /// \brief Private RAII object that helps us forget and then re-remember
98   /// the template argument corresponding to a partially-substituted parameter
99   /// pack.
100   class ForgetPartiallySubstitutedPackRAII {
101     Derived &Self;
102     TemplateArgument Old;
103 
104   public:
105     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
106       Old = Self.ForgetPartiallySubstitutedPack();
107     }
108 
109     ~ForgetPartiallySubstitutedPackRAII() {
110       Self.RememberPartiallySubstitutedPack(Old);
111     }
112   };
113 
114 protected:
115   Sema &SemaRef;
116 
117   /// \brief The set of local declarations that have been transformed, for
118   /// cases where we are forced to build new declarations within the transformer
119   /// rather than in the subclass (e.g., lambda closure types).
120   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
121 
122 public:
123   /// \brief Initializes a new tree transformer.
124   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
125 
126   /// \brief Retrieves a reference to the derived class.
127   Derived &getDerived() { return static_cast<Derived&>(*this); }
128 
129   /// \brief Retrieves a reference to the derived class.
130   const Derived &getDerived() const {
131     return static_cast<const Derived&>(*this);
132   }
133 
134   static inline ExprResult Owned(Expr *E) { return E; }
135   static inline StmtResult Owned(Stmt *S) { return S; }
136 
137   /// \brief Retrieves a reference to the semantic analysis object used for
138   /// this tree transform.
139   Sema &getSema() const { return SemaRef; }
140 
141   /// \brief Whether the transformation should always rebuild AST nodes, even
142   /// if none of the children have changed.
143   ///
144   /// Subclasses may override this function to specify when the transformation
145   /// should rebuild all AST nodes.
146   ///
147   /// We must always rebuild all AST nodes when performing variadic template
148   /// pack expansion, in order to avoid violating the AST invariant that each
149   /// statement node appears at most once in its containing declaration.
150   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
151 
152   /// \brief Returns the location of the entity being transformed, if that
153   /// information was not available elsewhere in the AST.
154   ///
155   /// By default, returns no source-location information. Subclasses can
156   /// provide an alternative implementation that provides better location
157   /// information.
158   SourceLocation getBaseLocation() { return SourceLocation(); }
159 
160   /// \brief Returns the name of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns an empty name. Subclasses can provide an alternative
164   /// implementation with a more precise name.
165   DeclarationName getBaseEntity() { return DeclarationName(); }
166 
167   /// \brief Sets the "base" location and entity when that
168   /// information is known based on another transformation.
169   ///
170   /// By default, the source location and entity are ignored. Subclasses can
171   /// override this function to provide a customized implementation.
172   void setBase(SourceLocation Loc, DeclarationName Entity) { }
173 
174   /// \brief RAII object that temporarily sets the base location and entity
175   /// used for reporting diagnostics in types.
176   class TemporaryBase {
177     TreeTransform &Self;
178     SourceLocation OldLocation;
179     DeclarationName OldEntity;
180 
181   public:
182     TemporaryBase(TreeTransform &Self, SourceLocation Location,
183                   DeclarationName Entity) : Self(Self) {
184       OldLocation = Self.getDerived().getBaseLocation();
185       OldEntity = Self.getDerived().getBaseEntity();
186 
187       if (Location.isValid())
188         Self.getDerived().setBase(Location, Entity);
189     }
190 
191     ~TemporaryBase() {
192       Self.getDerived().setBase(OldLocation, OldEntity);
193     }
194   };
195 
196   /// \brief Determine whether the given type \p T has already been
197   /// transformed.
198   ///
199   /// Subclasses can provide an alternative implementation of this routine
200   /// to short-circuit evaluation when it is known that a given type will
201   /// not change. For example, template instantiation need not traverse
202   /// non-dependent types.
203   bool AlreadyTransformed(QualType T) {
204     return T.isNull();
205   }
206 
207   /// \brief Determine whether the given call argument should be dropped, e.g.,
208   /// because it is a default argument.
209   ///
210   /// Subclasses can provide an alternative implementation of this routine to
211   /// determine which kinds of call arguments get dropped. By default,
212   /// CXXDefaultArgument nodes are dropped (prior to transformation).
213   bool DropCallArgument(Expr *E) {
214     return E->isDefaultArgument();
215   }
216 
217   /// \brief Determine whether we should expand a pack expansion with the
218   /// given set of parameter packs into separate arguments by repeatedly
219   /// transforming the pattern.
220   ///
221   /// By default, the transformer never tries to expand pack expansions.
222   /// Subclasses can override this routine to provide different behavior.
223   ///
224   /// \param EllipsisLoc The location of the ellipsis that identifies the
225   /// pack expansion.
226   ///
227   /// \param PatternRange The source range that covers the entire pattern of
228   /// the pack expansion.
229   ///
230   /// \param Unexpanded The set of unexpanded parameter packs within the
231   /// pattern.
232   ///
233   /// \param ShouldExpand Will be set to \c true if the transformer should
234   /// expand the corresponding pack expansions into separate arguments. When
235   /// set, \c NumExpansions must also be set.
236   ///
237   /// \param RetainExpansion Whether the caller should add an unexpanded
238   /// pack expansion after all of the expanded arguments. This is used
239   /// when extending explicitly-specified template argument packs per
240   /// C++0x [temp.arg.explicit]p9.
241   ///
242   /// \param NumExpansions The number of separate arguments that will be in
243   /// the expanded form of the corresponding pack expansion. This is both an
244   /// input and an output parameter, which can be set by the caller if the
245   /// number of expansions is known a priori (e.g., due to a prior substitution)
246   /// and will be set by the callee when the number of expansions is known.
247   /// The callee must set this value when \c ShouldExpand is \c true; it may
248   /// set this value in other cases.
249   ///
250   /// \returns true if an error occurred (e.g., because the parameter packs
251   /// are to be instantiated with arguments of different lengths), false
252   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
253   /// must be set.
254   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
255                                SourceRange PatternRange,
256                                ArrayRef<UnexpandedParameterPack> Unexpanded,
257                                bool &ShouldExpand,
258                                bool &RetainExpansion,
259                                Optional<unsigned> &NumExpansions) {
260     ShouldExpand = false;
261     return false;
262   }
263 
264   /// \brief "Forget" about the partially-substituted pack template argument,
265   /// when performing an instantiation that must preserve the parameter pack
266   /// use.
267   ///
268   /// This routine is meant to be overridden by the template instantiator.
269   TemplateArgument ForgetPartiallySubstitutedPack() {
270     return TemplateArgument();
271   }
272 
273   /// \brief "Remember" the partially-substituted pack template argument
274   /// after performing an instantiation that must preserve the parameter pack
275   /// use.
276   ///
277   /// This routine is meant to be overridden by the template instantiator.
278   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
279 
280   /// \brief Note to the derived class when a function parameter pack is
281   /// being expanded.
282   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
283 
284   /// \brief Transforms the given type into another type.
285   ///
286   /// By default, this routine transforms a type by creating a
287   /// TypeSourceInfo for it and delegating to the appropriate
288   /// function.  This is expensive, but we don't mind, because
289   /// this method is deprecated anyway;  all users should be
290   /// switched to storing TypeSourceInfos.
291   ///
292   /// \returns the transformed type.
293   QualType TransformType(QualType T);
294 
295   /// \brief Transforms the given type-with-location into a new
296   /// type-with-location.
297   ///
298   /// By default, this routine transforms a type by delegating to the
299   /// appropriate TransformXXXType to build a new type.  Subclasses
300   /// may override this function (to take over all type
301   /// transformations) or some set of the TransformXXXType functions
302   /// to alter the transformation.
303   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
304 
305   /// \brief Transform the given type-with-location into a new
306   /// type, collecting location information in the given builder
307   /// as necessary.
308   ///
309   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
310 
311   /// \brief Transform a type that is permitted to produce a
312   /// DeducedTemplateSpecializationType.
313   ///
314   /// This is used in the (relatively rare) contexts where it is acceptable
315   /// for transformation to produce a class template type with deduced
316   /// template arguments.
317   /// @{
318   QualType TransformTypeWithDeducedTST(QualType T);
319   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
320   /// @}
321 
322   /// \brief Transform the given statement.
323   ///
324   /// By default, this routine transforms a statement by delegating to the
325   /// appropriate TransformXXXStmt function to transform a specific kind of
326   /// statement or the TransformExpr() function to transform an expression.
327   /// Subclasses may override this function to transform statements using some
328   /// other mechanism.
329   ///
330   /// \returns the transformed statement.
331   StmtResult TransformStmt(Stmt *S);
332 
333   /// \brief Transform the given statement.
334   ///
335   /// By default, this routine transforms a statement by delegating to the
336   /// appropriate TransformOMPXXXClause function to transform a specific kind
337   /// of clause. Subclasses may override this function to transform statements
338   /// using some other mechanism.
339   ///
340   /// \returns the transformed OpenMP clause.
341   OMPClause *TransformOMPClause(OMPClause *S);
342 
343   /// \brief Transform the given attribute.
344   ///
345   /// By default, this routine transforms a statement by delegating to the
346   /// appropriate TransformXXXAttr function to transform a specific kind
347   /// of attribute. Subclasses may override this function to transform
348   /// attributed statements using some other mechanism.
349   ///
350   /// \returns the transformed attribute
351   const Attr *TransformAttr(const Attr *S);
352 
353 /// \brief Transform the specified attribute.
354 ///
355 /// Subclasses should override the transformation of attributes with a pragma
356 /// spelling to transform expressions stored within the attribute.
357 ///
358 /// \returns the transformed attribute.
359 #define ATTR(X)
360 #define PRAGMA_SPELLING_ATTR(X)                                                \
361   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
362 #include "clang/Basic/AttrList.inc"
363 
364   /// \brief Transform the given expression.
365   ///
366   /// By default, this routine transforms an expression by delegating to the
367   /// appropriate TransformXXXExpr function to build a new expression.
368   /// Subclasses may override this function to transform expressions using some
369   /// other mechanism.
370   ///
371   /// \returns the transformed expression.
372   ExprResult TransformExpr(Expr *E);
373 
374   /// \brief Transform the given initializer.
375   ///
376   /// By default, this routine transforms an initializer by stripping off the
377   /// semantic nodes added by initialization, then passing the result to
378   /// TransformExpr or TransformExprs.
379   ///
380   /// \returns the transformed initializer.
381   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
382 
383   /// \brief Transform the given list of expressions.
384   ///
385   /// This routine transforms a list of expressions by invoking
386   /// \c TransformExpr() for each subexpression. However, it also provides
387   /// support for variadic templates by expanding any pack expansions (if the
388   /// derived class permits such expansion) along the way. When pack expansions
389   /// are present, the number of outputs may not equal the number of inputs.
390   ///
391   /// \param Inputs The set of expressions to be transformed.
392   ///
393   /// \param NumInputs The number of expressions in \c Inputs.
394   ///
395   /// \param IsCall If \c true, then this transform is being performed on
396   /// function-call arguments, and any arguments that should be dropped, will
397   /// be.
398   ///
399   /// \param Outputs The transformed input expressions will be added to this
400   /// vector.
401   ///
402   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
403   /// due to transformation.
404   ///
405   /// \returns true if an error occurred, false otherwise.
406   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
407                       SmallVectorImpl<Expr *> &Outputs,
408                       bool *ArgChanged = nullptr);
409 
410   /// \brief Transform the given declaration, which is referenced from a type
411   /// or expression.
412   ///
413   /// By default, acts as the identity function on declarations, unless the
414   /// transformer has had to transform the declaration itself. Subclasses
415   /// may override this function to provide alternate behavior.
416   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
417     llvm::DenseMap<Decl *, Decl *>::iterator Known
418       = TransformedLocalDecls.find(D);
419     if (Known != TransformedLocalDecls.end())
420       return Known->second;
421 
422     return D;
423   }
424 
425   /// \brief Transform the specified condition.
426   ///
427   /// By default, this transforms the variable and expression and rebuilds
428   /// the condition.
429   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
430                                            Expr *Expr,
431                                            Sema::ConditionKind Kind);
432 
433   /// \brief Transform the attributes associated with the given declaration and
434   /// place them on the new declaration.
435   ///
436   /// By default, this operation does nothing. Subclasses may override this
437   /// behavior to transform attributes.
438   void transformAttrs(Decl *Old, Decl *New) { }
439 
440   /// \brief Note that a local declaration has been transformed by this
441   /// transformer.
442   ///
443   /// Local declarations are typically transformed via a call to
444   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
445   /// the transformer itself has to transform the declarations. This routine
446   /// can be overridden by a subclass that keeps track of such mappings.
447   void transformedLocalDecl(Decl *Old, Decl *New) {
448     TransformedLocalDecls[Old] = New;
449   }
450 
451   /// \brief Transform the definition of the given declaration.
452   ///
453   /// By default, invokes TransformDecl() to transform the declaration.
454   /// Subclasses may override this function to provide alternate behavior.
455   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
456     return getDerived().TransformDecl(Loc, D);
457   }
458 
459   /// \brief Transform the given declaration, which was the first part of a
460   /// nested-name-specifier in a member access expression.
461   ///
462   /// This specific declaration transformation only applies to the first
463   /// identifier in a nested-name-specifier of a member access expression, e.g.,
464   /// the \c T in \c x->T::member
465   ///
466   /// By default, invokes TransformDecl() to transform the declaration.
467   /// Subclasses may override this function to provide alternate behavior.
468   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
469     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
470   }
471 
472   /// Transform the set of declarations in an OverloadExpr.
473   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
474                                   LookupResult &R);
475 
476   /// \brief Transform the given nested-name-specifier with source-location
477   /// information.
478   ///
479   /// By default, transforms all of the types and declarations within the
480   /// nested-name-specifier. Subclasses may override this function to provide
481   /// alternate behavior.
482   NestedNameSpecifierLoc
483   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
484                                   QualType ObjectType = QualType(),
485                                   NamedDecl *FirstQualifierInScope = nullptr);
486 
487   /// \brief Transform the given declaration name.
488   ///
489   /// By default, transforms the types of conversion function, constructor,
490   /// and destructor names and then (if needed) rebuilds the declaration name.
491   /// Identifiers and selectors are returned unmodified. Sublcasses may
492   /// override this function to provide alternate behavior.
493   DeclarationNameInfo
494   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
495 
496   /// \brief Transform the given template name.
497   ///
498   /// \param SS The nested-name-specifier that qualifies the template
499   /// name. This nested-name-specifier must already have been transformed.
500   ///
501   /// \param Name The template name to transform.
502   ///
503   /// \param NameLoc The source location of the template name.
504   ///
505   /// \param ObjectType If we're translating a template name within a member
506   /// access expression, this is the type of the object whose member template
507   /// is being referenced.
508   ///
509   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
510   /// also refers to a name within the current (lexical) scope, this is the
511   /// declaration it refers to.
512   ///
513   /// By default, transforms the template name by transforming the declarations
514   /// and nested-name-specifiers that occur within the template name.
515   /// Subclasses may override this function to provide alternate behavior.
516   TemplateName
517   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
518                         SourceLocation NameLoc,
519                         QualType ObjectType = QualType(),
520                         NamedDecl *FirstQualifierInScope = nullptr,
521                         bool AllowInjectedClassName = false);
522 
523   /// \brief Transform the given template argument.
524   ///
525   /// By default, this operation transforms the type, expression, or
526   /// declaration stored within the template argument and constructs a
527   /// new template argument from the transformed result. Subclasses may
528   /// override this function to provide alternate behavior.
529   ///
530   /// Returns true if there was an error.
531   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
532                                  TemplateArgumentLoc &Output,
533                                  bool Uneval = false);
534 
535   /// \brief Transform the given set of template arguments.
536   ///
537   /// By default, this operation transforms all of the template arguments
538   /// in the input set using \c TransformTemplateArgument(), and appends
539   /// the transformed arguments to the output list.
540   ///
541   /// Note that this overload of \c TransformTemplateArguments() is merely
542   /// a convenience function. Subclasses that wish to override this behavior
543   /// should override the iterator-based member template version.
544   ///
545   /// \param Inputs The set of template arguments to be transformed.
546   ///
547   /// \param NumInputs The number of template arguments in \p Inputs.
548   ///
549   /// \param Outputs The set of transformed template arguments output by this
550   /// routine.
551   ///
552   /// Returns true if an error occurred.
553   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
554                                   unsigned NumInputs,
555                                   TemplateArgumentListInfo &Outputs,
556                                   bool Uneval = false) {
557     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
558                                       Uneval);
559   }
560 
561   /// \brief Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// \param First An iterator to the first template argument.
568   ///
569   /// \param Last An iterator one step past the last template argument.
570   ///
571   /// \param Outputs The set of transformed template arguments output by this
572   /// routine.
573   ///
574   /// Returns true if an error occurred.
575   template<typename InputIterator>
576   bool TransformTemplateArguments(InputIterator First,
577                                   InputIterator Last,
578                                   TemplateArgumentListInfo &Outputs,
579                                   bool Uneval = false);
580 
581   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
582   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
583                                  TemplateArgumentLoc &ArgLoc);
584 
585   /// \brief Fakes up a TypeSourceInfo for a type.
586   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
587     return SemaRef.Context.getTrivialTypeSourceInfo(T,
588                        getDerived().getBaseLocation());
589   }
590 
591 #define ABSTRACT_TYPELOC(CLASS, PARENT)
592 #define TYPELOC(CLASS, PARENT)                                   \
593   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
594 #include "clang/AST/TypeLocNodes.def"
595 
596   template<typename Fn>
597   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
598                                       FunctionProtoTypeLoc TL,
599                                       CXXRecordDecl *ThisContext,
600                                       unsigned ThisTypeQuals,
601                                       Fn TransformExceptionSpec);
602 
603   bool TransformExceptionSpec(SourceLocation Loc,
604                               FunctionProtoType::ExceptionSpecInfo &ESI,
605                               SmallVectorImpl<QualType> &Exceptions,
606                               bool &Changed);
607 
608   StmtResult TransformSEHHandler(Stmt *Handler);
609 
610   QualType
611   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
612                                       TemplateSpecializationTypeLoc TL,
613                                       TemplateName Template);
614 
615   QualType
616   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
617                                       DependentTemplateSpecializationTypeLoc TL,
618                                                TemplateName Template,
619                                                CXXScopeSpec &SS);
620 
621   QualType TransformDependentTemplateSpecializationType(
622       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
623       NestedNameSpecifierLoc QualifierLoc);
624 
625   /// \brief Transforms the parameters of a function type into the
626   /// given vectors.
627   ///
628   /// The result vectors should be kept in sync; null entries in the
629   /// variables vector are acceptable.
630   ///
631   /// Return true on error.
632   bool TransformFunctionTypeParams(
633       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
634       const QualType *ParamTypes,
635       const FunctionProtoType::ExtParameterInfo *ParamInfos,
636       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
637       Sema::ExtParameterInfoBuilder &PInfos);
638 
639   /// \brief Transforms a single function-type parameter.  Return null
640   /// on error.
641   ///
642   /// \param indexAdjustment - A number to add to the parameter's
643   ///   scope index;  can be negative
644   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
645                                           int indexAdjustment,
646                                           Optional<unsigned> NumExpansions,
647                                           bool ExpectParameterPack);
648 
649   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
650 
651   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
652   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
653 
654   TemplateParameterList *TransformTemplateParameterList(
655         TemplateParameterList *TPL) {
656     return TPL;
657   }
658 
659   ExprResult TransformAddressOfOperand(Expr *E);
660 
661   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
662                                                 bool IsAddressOfOperand,
663                                                 TypeSourceInfo **RecoveryTSI);
664 
665   ExprResult TransformParenDependentScopeDeclRefExpr(
666       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
667       TypeSourceInfo **RecoveryTSI);
668 
669   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
670 
671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
672 // amount of stack usage with clang.
673 #define STMT(Node, Parent)                        \
674   LLVM_ATTRIBUTE_NOINLINE \
675   StmtResult Transform##Node(Node *S);
676 #define EXPR(Node, Parent)                        \
677   LLVM_ATTRIBUTE_NOINLINE \
678   ExprResult Transform##Node(Node *E);
679 #define ABSTRACT_STMT(Stmt)
680 #include "clang/AST/StmtNodes.inc"
681 
682 #define OPENMP_CLAUSE(Name, Class)                        \
683   LLVM_ATTRIBUTE_NOINLINE \
684   OMPClause *Transform ## Class(Class *S);
685 #include "clang/Basic/OpenMPKinds.def"
686 
687   /// \brief Build a new qualified type given its unqualified type and type
688   /// qualifiers.
689   ///
690   /// By default, this routine adds type qualifiers only to types that can
691   /// have qualifiers, and silently suppresses those qualifiers that are not
692   /// permitted. Subclasses may override this routine to provide different
693   /// behavior.
694   QualType RebuildQualifiedType(QualType T, SourceLocation Loc,
695                                 Qualifiers Quals);
696 
697   /// \brief Build a new pointer type given its pointee type.
698   ///
699   /// By default, performs semantic analysis when building the pointer type.
700   /// Subclasses may override this routine to provide different behavior.
701   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
702 
703   /// \brief Build a new block pointer type given its pointee type.
704   ///
705   /// By default, performs semantic analysis when building the block pointer
706   /// type. Subclasses may override this routine to provide different behavior.
707   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
708 
709   /// \brief Build a new reference type given the type it references.
710   ///
711   /// By default, performs semantic analysis when building the
712   /// reference type. Subclasses may override this routine to provide
713   /// different behavior.
714   ///
715   /// \param LValue whether the type was written with an lvalue sigil
716   /// or an rvalue sigil.
717   QualType RebuildReferenceType(QualType ReferentType,
718                                 bool LValue,
719                                 SourceLocation Sigil);
720 
721   /// \brief Build a new member pointer type given the pointee type and the
722   /// class type it refers into.
723   ///
724   /// By default, performs semantic analysis when building the member pointer
725   /// type. Subclasses may override this routine to provide different behavior.
726   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
727                                     SourceLocation Sigil);
728 
729   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
730                                     SourceLocation ProtocolLAngleLoc,
731                                     ArrayRef<ObjCProtocolDecl *> Protocols,
732                                     ArrayRef<SourceLocation> ProtocolLocs,
733                                     SourceLocation ProtocolRAngleLoc);
734 
735   /// \brief Build an Objective-C object type.
736   ///
737   /// By default, performs semantic analysis when building the object type.
738   /// Subclasses may override this routine to provide different behavior.
739   QualType RebuildObjCObjectType(QualType BaseType,
740                                  SourceLocation Loc,
741                                  SourceLocation TypeArgsLAngleLoc,
742                                  ArrayRef<TypeSourceInfo *> TypeArgs,
743                                  SourceLocation TypeArgsRAngleLoc,
744                                  SourceLocation ProtocolLAngleLoc,
745                                  ArrayRef<ObjCProtocolDecl *> Protocols,
746                                  ArrayRef<SourceLocation> ProtocolLocs,
747                                  SourceLocation ProtocolRAngleLoc);
748 
749   /// \brief Build a new Objective-C object pointer type given the pointee type.
750   ///
751   /// By default, directly builds the pointer type, with no additional semantic
752   /// analysis.
753   QualType RebuildObjCObjectPointerType(QualType PointeeType,
754                                         SourceLocation Star);
755 
756   /// \brief Build a new array type given the element type, size
757   /// modifier, size of the array (if known), size expression, and index type
758   /// qualifiers.
759   ///
760   /// By default, performs semantic analysis when building the array type.
761   /// Subclasses may override this routine to provide different behavior.
762   /// Also by default, all of the other Rebuild*Array
763   QualType RebuildArrayType(QualType ElementType,
764                             ArrayType::ArraySizeModifier SizeMod,
765                             const llvm::APInt *Size,
766                             Expr *SizeExpr,
767                             unsigned IndexTypeQuals,
768                             SourceRange BracketsRange);
769 
770   /// \brief Build a new constant array type given the element type, size
771   /// modifier, (known) size of the array, and index type qualifiers.
772   ///
773   /// By default, performs semantic analysis when building the array type.
774   /// Subclasses may override this routine to provide different behavior.
775   QualType RebuildConstantArrayType(QualType ElementType,
776                                     ArrayType::ArraySizeModifier SizeMod,
777                                     const llvm::APInt &Size,
778                                     unsigned IndexTypeQuals,
779                                     SourceRange BracketsRange);
780 
781   /// \brief Build a new incomplete array type given the element type, size
782   /// modifier, and index type qualifiers.
783   ///
784   /// By default, performs semantic analysis when building the array type.
785   /// Subclasses may override this routine to provide different behavior.
786   QualType RebuildIncompleteArrayType(QualType ElementType,
787                                       ArrayType::ArraySizeModifier SizeMod,
788                                       unsigned IndexTypeQuals,
789                                       SourceRange BracketsRange);
790 
791   /// \brief Build a new variable-length array type given the element type,
792   /// size modifier, size expression, and index type qualifiers.
793   ///
794   /// By default, performs semantic analysis when building the array type.
795   /// Subclasses may override this routine to provide different behavior.
796   QualType RebuildVariableArrayType(QualType ElementType,
797                                     ArrayType::ArraySizeModifier SizeMod,
798                                     Expr *SizeExpr,
799                                     unsigned IndexTypeQuals,
800                                     SourceRange BracketsRange);
801 
802   /// \brief Build a new dependent-sized array type given the element type,
803   /// size modifier, size expression, and index type qualifiers.
804   ///
805   /// By default, performs semantic analysis when building the array type.
806   /// Subclasses may override this routine to provide different behavior.
807   QualType RebuildDependentSizedArrayType(QualType ElementType,
808                                           ArrayType::ArraySizeModifier SizeMod,
809                                           Expr *SizeExpr,
810                                           unsigned IndexTypeQuals,
811                                           SourceRange BracketsRange);
812 
813   /// \brief Build a new vector type given the element type and
814   /// number of elements.
815   ///
816   /// By default, performs semantic analysis when building the vector type.
817   /// Subclasses may override this routine to provide different behavior.
818   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
819                              VectorType::VectorKind VecKind);
820 
821   /// \brief Build a new extended vector type given the element type and
822   /// number of elements.
823   ///
824   /// By default, performs semantic analysis when building the vector type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
827                                 SourceLocation AttributeLoc);
828 
829   /// \brief Build a new potentially dependently-sized extended vector type
830   /// given the element type and number of elements.
831   ///
832   /// By default, performs semantic analysis when building the vector type.
833   /// Subclasses may override this routine to provide different behavior.
834   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
835                                               Expr *SizeExpr,
836                                               SourceLocation AttributeLoc);
837 
838   /// \brief Build a new function type.
839   ///
840   /// By default, performs semantic analysis when building the function type.
841   /// Subclasses may override this routine to provide different behavior.
842   QualType RebuildFunctionProtoType(QualType T,
843                                     MutableArrayRef<QualType> ParamTypes,
844                                     const FunctionProtoType::ExtProtoInfo &EPI);
845 
846   /// \brief Build a new unprototyped function type.
847   QualType RebuildFunctionNoProtoType(QualType ResultType);
848 
849   /// \brief Rebuild an unresolved typename type, given the decl that
850   /// the UnresolvedUsingTypenameDecl was transformed to.
851   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
852 
853   /// \brief Build a new typedef type.
854   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
855     return SemaRef.Context.getTypeDeclType(Typedef);
856   }
857 
858   /// \brief Build a new class/struct/union type.
859   QualType RebuildRecordType(RecordDecl *Record) {
860     return SemaRef.Context.getTypeDeclType(Record);
861   }
862 
863   /// \brief Build a new Enum type.
864   QualType RebuildEnumType(EnumDecl *Enum) {
865     return SemaRef.Context.getTypeDeclType(Enum);
866   }
867 
868   /// \brief Build a new typeof(expr) type.
869   ///
870   /// By default, performs semantic analysis when building the typeof type.
871   /// Subclasses may override this routine to provide different behavior.
872   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
873 
874   /// \brief Build a new typeof(type) type.
875   ///
876   /// By default, builds a new TypeOfType with the given underlying type.
877   QualType RebuildTypeOfType(QualType Underlying);
878 
879   /// \brief Build a new unary transform type.
880   QualType RebuildUnaryTransformType(QualType BaseType,
881                                      UnaryTransformType::UTTKind UKind,
882                                      SourceLocation Loc);
883 
884   /// \brief Build a new C++11 decltype type.
885   ///
886   /// By default, performs semantic analysis when building the decltype type.
887   /// Subclasses may override this routine to provide different behavior.
888   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
889 
890   /// \brief Build a new C++11 auto type.
891   ///
892   /// By default, builds a new AutoType with the given deduced type.
893   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
894     // Note, IsDependent is always false here: we implicitly convert an 'auto'
895     // which has been deduced to a dependent type into an undeduced 'auto', so
896     // that we'll retry deduction after the transformation.
897     return SemaRef.Context.getAutoType(Deduced, Keyword,
898                                        /*IsDependent*/ false);
899   }
900 
901   /// By default, builds a new DeducedTemplateSpecializationType with the given
902   /// deduced type.
903   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
904       QualType Deduced) {
905     return SemaRef.Context.getDeducedTemplateSpecializationType(
906         Template, Deduced, /*IsDependent*/ false);
907   }
908 
909   /// \brief Build a new template specialization type.
910   ///
911   /// By default, performs semantic analysis when building the template
912   /// specialization type. Subclasses may override this routine to provide
913   /// different behavior.
914   QualType RebuildTemplateSpecializationType(TemplateName Template,
915                                              SourceLocation TemplateLoc,
916                                              TemplateArgumentListInfo &Args);
917 
918   /// \brief Build a new parenthesized type.
919   ///
920   /// By default, builds a new ParenType type from the inner type.
921   /// Subclasses may override this routine to provide different behavior.
922   QualType RebuildParenType(QualType InnerType) {
923     return SemaRef.BuildParenType(InnerType);
924   }
925 
926   /// \brief Build a new qualified name type.
927   ///
928   /// By default, builds a new ElaboratedType type from the keyword,
929   /// the nested-name-specifier and the named type.
930   /// Subclasses may override this routine to provide different behavior.
931   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
932                                  ElaboratedTypeKeyword Keyword,
933                                  NestedNameSpecifierLoc QualifierLoc,
934                                  QualType Named) {
935     return SemaRef.Context.getElaboratedType(Keyword,
936                                          QualifierLoc.getNestedNameSpecifier(),
937                                              Named);
938   }
939 
940   /// \brief Build a new typename type that refers to a template-id.
941   ///
942   /// By default, builds a new DependentNameType type from the
943   /// nested-name-specifier and the given type. Subclasses may override
944   /// this routine to provide different behavior.
945   QualType RebuildDependentTemplateSpecializationType(
946                                           ElaboratedTypeKeyword Keyword,
947                                           NestedNameSpecifierLoc QualifierLoc,
948                                           const IdentifierInfo *Name,
949                                           SourceLocation NameLoc,
950                                           TemplateArgumentListInfo &Args,
951                                           bool AllowInjectedClassName) {
952     // Rebuild the template name.
953     // TODO: avoid TemplateName abstraction
954     CXXScopeSpec SS;
955     SS.Adopt(QualifierLoc);
956     TemplateName InstName
957       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
958                                          nullptr, AllowInjectedClassName);
959 
960     if (InstName.isNull())
961       return QualType();
962 
963     // If it's still dependent, make a dependent specialization.
964     if (InstName.getAsDependentTemplateName())
965       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
966                                           QualifierLoc.getNestedNameSpecifier(),
967                                                                     Name,
968                                                                     Args);
969 
970     // Otherwise, make an elaborated type wrapping a non-dependent
971     // specialization.
972     QualType T =
973     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
974     if (T.isNull()) return QualType();
975 
976     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
977       return T;
978 
979     return SemaRef.Context.getElaboratedType(Keyword,
980                                        QualifierLoc.getNestedNameSpecifier(),
981                                              T);
982   }
983 
984   /// \brief Build a new typename type that refers to an identifier.
985   ///
986   /// By default, performs semantic analysis when building the typename type
987   /// (or elaborated type). Subclasses may override this routine to provide
988   /// different behavior.
989   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
990                                     SourceLocation KeywordLoc,
991                                     NestedNameSpecifierLoc QualifierLoc,
992                                     const IdentifierInfo *Id,
993                                     SourceLocation IdLoc,
994                                     bool DeducedTSTContext) {
995     CXXScopeSpec SS;
996     SS.Adopt(QualifierLoc);
997 
998     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
999       // If the name is still dependent, just build a new dependent name type.
1000       if (!SemaRef.computeDeclContext(SS))
1001         return SemaRef.Context.getDependentNameType(Keyword,
1002                                           QualifierLoc.getNestedNameSpecifier(),
1003                                                     Id);
1004     }
1005 
1006     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1007       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1008                                              *Id, IdLoc);
1009       // If a dependent name resolves to a deduced template specialization type,
1010       // check that we're in one of the syntactic contexts permitting it.
1011       if (!DeducedTSTContext) {
1012         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1013                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1014           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1015             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1016                    Deduced->getTemplateName())
1017             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1018           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1019             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1020           return QualType();
1021         }
1022       }
1023       return T;
1024     }
1025 
1026     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1027 
1028     // We had a dependent elaborated-type-specifier that has been transformed
1029     // into a non-dependent elaborated-type-specifier. Find the tag we're
1030     // referring to.
1031     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1032     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1033     if (!DC)
1034       return QualType();
1035 
1036     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1037       return QualType();
1038 
1039     TagDecl *Tag = nullptr;
1040     SemaRef.LookupQualifiedName(Result, DC);
1041     switch (Result.getResultKind()) {
1042       case LookupResult::NotFound:
1043       case LookupResult::NotFoundInCurrentInstantiation:
1044         break;
1045 
1046       case LookupResult::Found:
1047         Tag = Result.getAsSingle<TagDecl>();
1048         break;
1049 
1050       case LookupResult::FoundOverloaded:
1051       case LookupResult::FoundUnresolvedValue:
1052         llvm_unreachable("Tag lookup cannot find non-tags");
1053 
1054       case LookupResult::Ambiguous:
1055         // Let the LookupResult structure handle ambiguities.
1056         return QualType();
1057     }
1058 
1059     if (!Tag) {
1060       // Check where the name exists but isn't a tag type and use that to emit
1061       // better diagnostics.
1062       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1063       SemaRef.LookupQualifiedName(Result, DC);
1064       switch (Result.getResultKind()) {
1065         case LookupResult::Found:
1066         case LookupResult::FoundOverloaded:
1067         case LookupResult::FoundUnresolvedValue: {
1068           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1069           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1070           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1071                                                                << NTK << Kind;
1072           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1073           break;
1074         }
1075         default:
1076           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1077               << Kind << Id << DC << QualifierLoc.getSourceRange();
1078           break;
1079       }
1080       return QualType();
1081     }
1082 
1083     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1084                                               IdLoc, Id)) {
1085       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1086       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1087       return QualType();
1088     }
1089 
1090     // Build the elaborated-type-specifier type.
1091     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1092     return SemaRef.Context.getElaboratedType(Keyword,
1093                                          QualifierLoc.getNestedNameSpecifier(),
1094                                              T);
1095   }
1096 
1097   /// \brief Build a new pack expansion type.
1098   ///
1099   /// By default, builds a new PackExpansionType type from the given pattern.
1100   /// Subclasses may override this routine to provide different behavior.
1101   QualType RebuildPackExpansionType(QualType Pattern,
1102                                     SourceRange PatternRange,
1103                                     SourceLocation EllipsisLoc,
1104                                     Optional<unsigned> NumExpansions) {
1105     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1106                                         NumExpansions);
1107   }
1108 
1109   /// \brief Build a new atomic type given its value type.
1110   ///
1111   /// By default, performs semantic analysis when building the atomic type.
1112   /// Subclasses may override this routine to provide different behavior.
1113   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1114 
1115   /// \brief Build a new pipe type given its value type.
1116   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1117                            bool isReadPipe);
1118 
1119   /// \brief Build a new template name given a nested name specifier, a flag
1120   /// indicating whether the "template" keyword was provided, and the template
1121   /// that the template name refers to.
1122   ///
1123   /// By default, builds the new template name directly. Subclasses may override
1124   /// this routine to provide different behavior.
1125   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1126                                    bool TemplateKW,
1127                                    TemplateDecl *Template);
1128 
1129   /// \brief Build a new template name given a nested name specifier and the
1130   /// name that is referred to as a template.
1131   ///
1132   /// By default, performs semantic analysis to determine whether the name can
1133   /// be resolved to a specific template, then builds the appropriate kind of
1134   /// template name. Subclasses may override this routine to provide different
1135   /// behavior.
1136   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1137                                    const IdentifierInfo &Name,
1138                                    SourceLocation NameLoc,
1139                                    QualType ObjectType,
1140                                    NamedDecl *FirstQualifierInScope,
1141                                    bool AllowInjectedClassName);
1142 
1143   /// \brief Build a new template name given a nested name specifier and the
1144   /// overloaded operator name that is referred to as a template.
1145   ///
1146   /// By default, performs semantic analysis to determine whether the name can
1147   /// be resolved to a specific template, then builds the appropriate kind of
1148   /// template name. Subclasses may override this routine to provide different
1149   /// behavior.
1150   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1151                                    OverloadedOperatorKind Operator,
1152                                    SourceLocation NameLoc,
1153                                    QualType ObjectType,
1154                                    bool AllowInjectedClassName);
1155 
1156   /// \brief Build a new template name given a template template parameter pack
1157   /// and the
1158   ///
1159   /// By default, performs semantic analysis to determine whether the name can
1160   /// be resolved to a specific template, then builds the appropriate kind of
1161   /// template name. Subclasses may override this routine to provide different
1162   /// behavior.
1163   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1164                                    const TemplateArgument &ArgPack) {
1165     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1166   }
1167 
1168   /// \brief Build a new compound statement.
1169   ///
1170   /// By default, performs semantic analysis to build the new statement.
1171   /// Subclasses may override this routine to provide different behavior.
1172   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1173                                        MultiStmtArg Statements,
1174                                        SourceLocation RBraceLoc,
1175                                        bool IsStmtExpr) {
1176     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1177                                        IsStmtExpr);
1178   }
1179 
1180   /// \brief Build a new case statement.
1181   ///
1182   /// By default, performs semantic analysis to build the new statement.
1183   /// Subclasses may override this routine to provide different behavior.
1184   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1185                                    Expr *LHS,
1186                                    SourceLocation EllipsisLoc,
1187                                    Expr *RHS,
1188                                    SourceLocation ColonLoc) {
1189     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1190                                    ColonLoc);
1191   }
1192 
1193   /// \brief Attach the body to a new case statement.
1194   ///
1195   /// By default, performs semantic analysis to build the new statement.
1196   /// Subclasses may override this routine to provide different behavior.
1197   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1198     getSema().ActOnCaseStmtBody(S, Body);
1199     return S;
1200   }
1201 
1202   /// \brief Build a new default statement.
1203   ///
1204   /// By default, performs semantic analysis to build the new statement.
1205   /// Subclasses may override this routine to provide different behavior.
1206   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1207                                       SourceLocation ColonLoc,
1208                                       Stmt *SubStmt) {
1209     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1210                                       /*CurScope=*/nullptr);
1211   }
1212 
1213   /// \brief Build a new label statement.
1214   ///
1215   /// By default, performs semantic analysis to build the new statement.
1216   /// Subclasses may override this routine to provide different behavior.
1217   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1218                               SourceLocation ColonLoc, Stmt *SubStmt) {
1219     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1220   }
1221 
1222   /// \brief Build a new label statement.
1223   ///
1224   /// By default, performs semantic analysis to build the new statement.
1225   /// Subclasses may override this routine to provide different behavior.
1226   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1227                                    ArrayRef<const Attr*> Attrs,
1228                                    Stmt *SubStmt) {
1229     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1230   }
1231 
1232   /// \brief Build a new "if" statement.
1233   ///
1234   /// By default, performs semantic analysis to build the new statement.
1235   /// Subclasses may override this routine to provide different behavior.
1236   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1237                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1238                            SourceLocation ElseLoc, Stmt *Else) {
1239     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1240                                  ElseLoc, Else);
1241   }
1242 
1243   /// \brief Start building a new switch statement.
1244   ///
1245   /// By default, performs semantic analysis to build the new statement.
1246   /// Subclasses may override this routine to provide different behavior.
1247   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1248                                     Sema::ConditionResult Cond) {
1249     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1250   }
1251 
1252   /// \brief Attach the body to the switch statement.
1253   ///
1254   /// By default, performs semantic analysis to build the new statement.
1255   /// Subclasses may override this routine to provide different behavior.
1256   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1257                                    Stmt *Switch, Stmt *Body) {
1258     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1259   }
1260 
1261   /// \brief Build a new while statement.
1262   ///
1263   /// By default, performs semantic analysis to build the new statement.
1264   /// Subclasses may override this routine to provide different behavior.
1265   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1266                               Sema::ConditionResult Cond, Stmt *Body) {
1267     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1268   }
1269 
1270   /// \brief Build a new do-while statement.
1271   ///
1272   /// By default, performs semantic analysis to build the new statement.
1273   /// Subclasses may override this routine to provide different behavior.
1274   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1275                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1276                            Expr *Cond, SourceLocation RParenLoc) {
1277     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1278                                  Cond, RParenLoc);
1279   }
1280 
1281   /// \brief Build a new for statement.
1282   ///
1283   /// By default, performs semantic analysis to build the new statement.
1284   /// Subclasses may override this routine to provide different behavior.
1285   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1286                             Stmt *Init, Sema::ConditionResult Cond,
1287                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1288                             Stmt *Body) {
1289     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1290                                   Inc, RParenLoc, Body);
1291   }
1292 
1293   /// \brief Build a new goto statement.
1294   ///
1295   /// By default, performs semantic analysis to build the new statement.
1296   /// Subclasses may override this routine to provide different behavior.
1297   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1298                              LabelDecl *Label) {
1299     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1300   }
1301 
1302   /// \brief Build a new indirect goto statement.
1303   ///
1304   /// By default, performs semantic analysis to build the new statement.
1305   /// Subclasses may override this routine to provide different behavior.
1306   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1307                                      SourceLocation StarLoc,
1308                                      Expr *Target) {
1309     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1310   }
1311 
1312   /// \brief Build a new return statement.
1313   ///
1314   /// By default, performs semantic analysis to build the new statement.
1315   /// Subclasses may override this routine to provide different behavior.
1316   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1317     return getSema().BuildReturnStmt(ReturnLoc, Result);
1318   }
1319 
1320   /// \brief Build a new declaration statement.
1321   ///
1322   /// By default, performs semantic analysis to build the new statement.
1323   /// Subclasses may override this routine to provide different behavior.
1324   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1325                              SourceLocation StartLoc, SourceLocation EndLoc) {
1326     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1327     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1328   }
1329 
1330   /// \brief Build a new inline asm statement.
1331   ///
1332   /// By default, performs semantic analysis to build the new statement.
1333   /// Subclasses may override this routine to provide different behavior.
1334   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1335                                bool IsVolatile, unsigned NumOutputs,
1336                                unsigned NumInputs, IdentifierInfo **Names,
1337                                MultiExprArg Constraints, MultiExprArg Exprs,
1338                                Expr *AsmString, MultiExprArg Clobbers,
1339                                SourceLocation RParenLoc) {
1340     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1341                                      NumInputs, Names, Constraints, Exprs,
1342                                      AsmString, Clobbers, RParenLoc);
1343   }
1344 
1345   /// \brief Build a new MS style inline asm statement.
1346   ///
1347   /// By default, performs semantic analysis to build the new statement.
1348   /// Subclasses may override this routine to provide different behavior.
1349   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1350                               ArrayRef<Token> AsmToks,
1351                               StringRef AsmString,
1352                               unsigned NumOutputs, unsigned NumInputs,
1353                               ArrayRef<StringRef> Constraints,
1354                               ArrayRef<StringRef> Clobbers,
1355                               ArrayRef<Expr*> Exprs,
1356                               SourceLocation EndLoc) {
1357     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1358                                     NumOutputs, NumInputs,
1359                                     Constraints, Clobbers, Exprs, EndLoc);
1360   }
1361 
1362   /// \brief Build a new co_return statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1367                                  bool IsImplicit) {
1368     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1369   }
1370 
1371   /// \brief Build a new co_await expression.
1372   ///
1373   /// By default, performs semantic analysis to build the new expression.
1374   /// Subclasses may override this routine to provide different behavior.
1375   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1376                                 bool IsImplicit) {
1377     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1378   }
1379 
1380   /// \brief Build a new co_await expression.
1381   ///
1382   /// By default, performs semantic analysis to build the new expression.
1383   /// Subclasses may override this routine to provide different behavior.
1384   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1385                                          Expr *Result,
1386                                          UnresolvedLookupExpr *Lookup) {
1387     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1388   }
1389 
1390   /// \brief Build a new co_yield expression.
1391   ///
1392   /// By default, performs semantic analysis to build the new expression.
1393   /// Subclasses may override this routine to provide different behavior.
1394   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1395     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1396   }
1397 
1398   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1399     return getSema().BuildCoroutineBodyStmt(Args);
1400   }
1401 
1402   /// \brief Build a new Objective-C \@try statement.
1403   ///
1404   /// By default, performs semantic analysis to build the new statement.
1405   /// Subclasses may override this routine to provide different behavior.
1406   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1407                                         Stmt *TryBody,
1408                                         MultiStmtArg CatchStmts,
1409                                         Stmt *Finally) {
1410     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1411                                         Finally);
1412   }
1413 
1414   /// \brief Rebuild an Objective-C exception declaration.
1415   ///
1416   /// By default, performs semantic analysis to build the new declaration.
1417   /// Subclasses may override this routine to provide different behavior.
1418   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1419                                     TypeSourceInfo *TInfo, QualType T) {
1420     return getSema().BuildObjCExceptionDecl(TInfo, T,
1421                                             ExceptionDecl->getInnerLocStart(),
1422                                             ExceptionDecl->getLocation(),
1423                                             ExceptionDecl->getIdentifier());
1424   }
1425 
1426   /// \brief Build a new Objective-C \@catch statement.
1427   ///
1428   /// By default, performs semantic analysis to build the new statement.
1429   /// Subclasses may override this routine to provide different behavior.
1430   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1431                                           SourceLocation RParenLoc,
1432                                           VarDecl *Var,
1433                                           Stmt *Body) {
1434     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1435                                           Var, Body);
1436   }
1437 
1438   /// \brief Build a new Objective-C \@finally statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1443                                             Stmt *Body) {
1444     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1445   }
1446 
1447   /// \brief Build a new Objective-C \@throw statement.
1448   ///
1449   /// By default, performs semantic analysis to build the new statement.
1450   /// Subclasses may override this routine to provide different behavior.
1451   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1452                                           Expr *Operand) {
1453     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1454   }
1455 
1456   /// \brief Build a new OpenMP executable directive.
1457   ///
1458   /// By default, performs semantic analysis to build the new statement.
1459   /// Subclasses may override this routine to provide different behavior.
1460   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1461                                            DeclarationNameInfo DirName,
1462                                            OpenMPDirectiveKind CancelRegion,
1463                                            ArrayRef<OMPClause *> Clauses,
1464                                            Stmt *AStmt, SourceLocation StartLoc,
1465                                            SourceLocation EndLoc) {
1466     return getSema().ActOnOpenMPExecutableDirective(
1467         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1468   }
1469 
1470   /// \brief Build a new OpenMP 'if' clause.
1471   ///
1472   /// By default, performs semantic analysis to build the new OpenMP clause.
1473   /// Subclasses may override this routine to provide different behavior.
1474   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1475                                 Expr *Condition, SourceLocation StartLoc,
1476                                 SourceLocation LParenLoc,
1477                                 SourceLocation NameModifierLoc,
1478                                 SourceLocation ColonLoc,
1479                                 SourceLocation EndLoc) {
1480     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1481                                          LParenLoc, NameModifierLoc, ColonLoc,
1482                                          EndLoc);
1483   }
1484 
1485   /// \brief Build a new OpenMP 'final' clause.
1486   ///
1487   /// By default, performs semantic analysis to build the new OpenMP clause.
1488   /// Subclasses may override this routine to provide different behavior.
1489   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1490                                    SourceLocation LParenLoc,
1491                                    SourceLocation EndLoc) {
1492     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1493                                             EndLoc);
1494   }
1495 
1496   /// \brief Build a new OpenMP 'num_threads' 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 *RebuildOMPNumThreadsClause(Expr *NumThreads,
1501                                         SourceLocation StartLoc,
1502                                         SourceLocation LParenLoc,
1503                                         SourceLocation EndLoc) {
1504     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1505                                                  LParenLoc, EndLoc);
1506   }
1507 
1508   /// \brief Build a new OpenMP 'safelen' clause.
1509   ///
1510   /// By default, performs semantic analysis to build the new OpenMP clause.
1511   /// Subclasses may override this routine to provide different behavior.
1512   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1513                                      SourceLocation LParenLoc,
1514                                      SourceLocation EndLoc) {
1515     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1516   }
1517 
1518   /// \brief Build a new OpenMP 'simdlen' 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 *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1523                                      SourceLocation LParenLoc,
1524                                      SourceLocation EndLoc) {
1525     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1526   }
1527 
1528   /// \brief Build a new OpenMP 'collapse' clause.
1529   ///
1530   /// By default, performs semantic analysis to build the new OpenMP clause.
1531   /// Subclasses may override this routine to provide different behavior.
1532   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1533                                       SourceLocation LParenLoc,
1534                                       SourceLocation EndLoc) {
1535     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1536                                                EndLoc);
1537   }
1538 
1539   /// \brief Build a new OpenMP 'default' clause.
1540   ///
1541   /// By default, performs semantic analysis to build the new OpenMP clause.
1542   /// Subclasses may override this routine to provide different behavior.
1543   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1544                                      SourceLocation KindKwLoc,
1545                                      SourceLocation StartLoc,
1546                                      SourceLocation LParenLoc,
1547                                      SourceLocation EndLoc) {
1548     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1549                                               StartLoc, LParenLoc, EndLoc);
1550   }
1551 
1552   /// \brief Build a new OpenMP 'proc_bind' clause.
1553   ///
1554   /// By default, performs semantic analysis to build the new OpenMP clause.
1555   /// Subclasses may override this routine to provide different behavior.
1556   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1557                                       SourceLocation KindKwLoc,
1558                                       SourceLocation StartLoc,
1559                                       SourceLocation LParenLoc,
1560                                       SourceLocation EndLoc) {
1561     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1562                                                StartLoc, LParenLoc, EndLoc);
1563   }
1564 
1565   /// \brief Build a new OpenMP 'schedule' clause.
1566   ///
1567   /// By default, performs semantic analysis to build the new OpenMP clause.
1568   /// Subclasses may override this routine to provide different behavior.
1569   OMPClause *RebuildOMPScheduleClause(
1570       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1571       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1572       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1573       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1574     return getSema().ActOnOpenMPScheduleClause(
1575         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1576         CommaLoc, EndLoc);
1577   }
1578 
1579   /// \brief Build a new OpenMP 'ordered' clause.
1580   ///
1581   /// By default, performs semantic analysis to build the new OpenMP clause.
1582   /// Subclasses may override this routine to provide different behavior.
1583   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1584                                      SourceLocation EndLoc,
1585                                      SourceLocation LParenLoc, Expr *Num) {
1586     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1587   }
1588 
1589   /// \brief Build a new OpenMP 'private' clause.
1590   ///
1591   /// By default, performs semantic analysis to build the new OpenMP clause.
1592   /// Subclasses may override this routine to provide different behavior.
1593   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1594                                      SourceLocation StartLoc,
1595                                      SourceLocation LParenLoc,
1596                                      SourceLocation EndLoc) {
1597     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1598                                               EndLoc);
1599   }
1600 
1601   /// \brief Build a new OpenMP 'firstprivate' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1606                                           SourceLocation StartLoc,
1607                                           SourceLocation LParenLoc,
1608                                           SourceLocation EndLoc) {
1609     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1610                                                    EndLoc);
1611   }
1612 
1613   /// \brief Build a new OpenMP 'lastprivate' clause.
1614   ///
1615   /// By default, performs semantic analysis to build the new OpenMP clause.
1616   /// Subclasses may override this routine to provide different behavior.
1617   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1618                                          SourceLocation StartLoc,
1619                                          SourceLocation LParenLoc,
1620                                          SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1622                                                   EndLoc);
1623   }
1624 
1625   /// \brief Build a new OpenMP 'shared' clause.
1626   ///
1627   /// By default, performs semantic analysis to build the new OpenMP clause.
1628   /// Subclasses may override this routine to provide different behavior.
1629   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1630                                     SourceLocation StartLoc,
1631                                     SourceLocation LParenLoc,
1632                                     SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1634                                              EndLoc);
1635   }
1636 
1637   /// \brief Build a new OpenMP 'reduction' clause.
1638   ///
1639   /// By default, performs semantic analysis to build the new statement.
1640   /// Subclasses may override this routine to provide different behavior.
1641   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1642                                        SourceLocation StartLoc,
1643                                        SourceLocation LParenLoc,
1644                                        SourceLocation ColonLoc,
1645                                        SourceLocation EndLoc,
1646                                        CXXScopeSpec &ReductionIdScopeSpec,
1647                                        const DeclarationNameInfo &ReductionId,
1648                                        ArrayRef<Expr *> UnresolvedReductions) {
1649     return getSema().ActOnOpenMPReductionClause(
1650         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1651         ReductionId, UnresolvedReductions);
1652   }
1653 
1654   /// Build a new OpenMP 'task_reduction' clause.
1655   ///
1656   /// By default, performs semantic analysis to build the new statement.
1657   /// Subclasses may override this routine to provide different behavior.
1658   OMPClause *RebuildOMPTaskReductionClause(
1659       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1660       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1661       CXXScopeSpec &ReductionIdScopeSpec,
1662       const DeclarationNameInfo &ReductionId,
1663       ArrayRef<Expr *> UnresolvedReductions) {
1664     return getSema().ActOnOpenMPTaskReductionClause(
1665         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1666         ReductionId, UnresolvedReductions);
1667   }
1668 
1669   /// Build a new OpenMP 'in_reduction' clause.
1670   ///
1671   /// By default, performs semantic analysis to build the new statement.
1672   /// Subclasses may override this routine to provide different behavior.
1673   OMPClause *
1674   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1675                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1676                               SourceLocation EndLoc,
1677                               CXXScopeSpec &ReductionIdScopeSpec,
1678                               const DeclarationNameInfo &ReductionId,
1679                               ArrayRef<Expr *> UnresolvedReductions) {
1680     return getSema().ActOnOpenMPInReductionClause(
1681         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1682         ReductionId, UnresolvedReductions);
1683   }
1684 
1685   /// \brief Build a new OpenMP 'linear' clause.
1686   ///
1687   /// By default, performs semantic analysis to build the new OpenMP clause.
1688   /// Subclasses may override this routine to provide different behavior.
1689   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1690                                     SourceLocation StartLoc,
1691                                     SourceLocation LParenLoc,
1692                                     OpenMPLinearClauseKind Modifier,
1693                                     SourceLocation ModifierLoc,
1694                                     SourceLocation ColonLoc,
1695                                     SourceLocation EndLoc) {
1696     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1697                                              Modifier, ModifierLoc, ColonLoc,
1698                                              EndLoc);
1699   }
1700 
1701   /// \brief Build a new OpenMP 'aligned' clause.
1702   ///
1703   /// By default, performs semantic analysis to build the new OpenMP clause.
1704   /// Subclasses may override this routine to provide different behavior.
1705   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1706                                      SourceLocation StartLoc,
1707                                      SourceLocation LParenLoc,
1708                                      SourceLocation ColonLoc,
1709                                      SourceLocation EndLoc) {
1710     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1711                                               LParenLoc, ColonLoc, EndLoc);
1712   }
1713 
1714   /// \brief Build a new OpenMP 'copyin' clause.
1715   ///
1716   /// By default, performs semantic analysis to build the new OpenMP clause.
1717   /// Subclasses may override this routine to provide different behavior.
1718   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1719                                     SourceLocation StartLoc,
1720                                     SourceLocation LParenLoc,
1721                                     SourceLocation EndLoc) {
1722     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1723                                              EndLoc);
1724   }
1725 
1726   /// \brief Build a new OpenMP 'copyprivate' clause.
1727   ///
1728   /// By default, performs semantic analysis to build the new OpenMP clause.
1729   /// Subclasses may override this routine to provide different behavior.
1730   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1731                                          SourceLocation StartLoc,
1732                                          SourceLocation LParenLoc,
1733                                          SourceLocation EndLoc) {
1734     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1735                                                   EndLoc);
1736   }
1737 
1738   /// \brief Build a new OpenMP 'flush' pseudo clause.
1739   ///
1740   /// By default, performs semantic analysis to build the new OpenMP clause.
1741   /// Subclasses may override this routine to provide different behavior.
1742   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1743                                    SourceLocation StartLoc,
1744                                    SourceLocation LParenLoc,
1745                                    SourceLocation EndLoc) {
1746     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1747                                             EndLoc);
1748   }
1749 
1750   /// \brief Build a new OpenMP 'depend' pseudo clause.
1751   ///
1752   /// By default, performs semantic analysis to build the new OpenMP clause.
1753   /// Subclasses may override this routine to provide different behavior.
1754   OMPClause *
1755   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1756                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1757                          SourceLocation StartLoc, SourceLocation LParenLoc,
1758                          SourceLocation EndLoc) {
1759     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1760                                              StartLoc, LParenLoc, EndLoc);
1761   }
1762 
1763   /// \brief Build a new OpenMP 'device' clause.
1764   ///
1765   /// By default, performs semantic analysis to build the new statement.
1766   /// Subclasses may override this routine to provide different behavior.
1767   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1768                                     SourceLocation LParenLoc,
1769                                     SourceLocation EndLoc) {
1770     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1771                                              EndLoc);
1772   }
1773 
1774   /// \brief Build a new OpenMP 'map' clause.
1775   ///
1776   /// By default, performs semantic analysis to build the new OpenMP clause.
1777   /// Subclasses may override this routine to provide different behavior.
1778   OMPClause *
1779   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1780                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1781                       SourceLocation MapLoc, SourceLocation ColonLoc,
1782                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1783                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1784     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1785                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1786                                           VarList, StartLoc, LParenLoc, EndLoc);
1787   }
1788 
1789   /// \brief Build a new OpenMP 'num_teams' clause.
1790   ///
1791   /// By default, performs semantic analysis to build the new statement.
1792   /// Subclasses may override this routine to provide different behavior.
1793   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1794                                       SourceLocation LParenLoc,
1795                                       SourceLocation EndLoc) {
1796     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1797                                                EndLoc);
1798   }
1799 
1800   /// \brief Build a new OpenMP 'thread_limit' clause.
1801   ///
1802   /// By default, performs semantic analysis to build the new statement.
1803   /// Subclasses may override this routine to provide different behavior.
1804   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1805                                          SourceLocation StartLoc,
1806                                          SourceLocation LParenLoc,
1807                                          SourceLocation EndLoc) {
1808     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1809                                                   LParenLoc, EndLoc);
1810   }
1811 
1812   /// \brief Build a new OpenMP 'priority' clause.
1813   ///
1814   /// By default, performs semantic analysis to build the new statement.
1815   /// Subclasses may override this routine to provide different behavior.
1816   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1817                                       SourceLocation LParenLoc,
1818                                       SourceLocation EndLoc) {
1819     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1820                                                EndLoc);
1821   }
1822 
1823   /// \brief Build a new OpenMP 'grainsize' clause.
1824   ///
1825   /// By default, performs semantic analysis to build the new statement.
1826   /// Subclasses may override this routine to provide different behavior.
1827   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1828                                        SourceLocation LParenLoc,
1829                                        SourceLocation EndLoc) {
1830     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1831                                                 EndLoc);
1832   }
1833 
1834   /// \brief Build a new OpenMP 'num_tasks' clause.
1835   ///
1836   /// By default, performs semantic analysis to build the new statement.
1837   /// Subclasses may override this routine to provide different behavior.
1838   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1839                                       SourceLocation LParenLoc,
1840                                       SourceLocation EndLoc) {
1841     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1842                                                EndLoc);
1843   }
1844 
1845   /// \brief Build a new OpenMP 'hint' clause.
1846   ///
1847   /// By default, performs semantic analysis to build the new statement.
1848   /// Subclasses may override this routine to provide different behavior.
1849   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1850                                   SourceLocation LParenLoc,
1851                                   SourceLocation EndLoc) {
1852     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1853   }
1854 
1855   /// \brief Build a new OpenMP 'dist_schedule' clause.
1856   ///
1857   /// By default, performs semantic analysis to build the new OpenMP clause.
1858   /// Subclasses may override this routine to provide different behavior.
1859   OMPClause *
1860   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1861                                Expr *ChunkSize, SourceLocation StartLoc,
1862                                SourceLocation LParenLoc, SourceLocation KindLoc,
1863                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1864     return getSema().ActOnOpenMPDistScheduleClause(
1865         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1866   }
1867 
1868   /// \brief Build a new OpenMP 'to' clause.
1869   ///
1870   /// By default, performs semantic analysis to build the new statement.
1871   /// Subclasses may override this routine to provide different behavior.
1872   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1873                                 SourceLocation StartLoc,
1874                                 SourceLocation LParenLoc,
1875                                 SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1877   }
1878 
1879   /// \brief Build a new OpenMP 'from' clause.
1880   ///
1881   /// By default, performs semantic analysis to build the new statement.
1882   /// Subclasses may override this routine to provide different behavior.
1883   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1884                                   SourceLocation StartLoc,
1885                                   SourceLocation LParenLoc,
1886                                   SourceLocation EndLoc) {
1887     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1888                                            EndLoc);
1889   }
1890 
1891   /// Build a new OpenMP 'use_device_ptr' clause.
1892   ///
1893   /// By default, performs semantic analysis to build the new OpenMP clause.
1894   /// Subclasses may override this routine to provide different behavior.
1895   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1896                                           SourceLocation StartLoc,
1897                                           SourceLocation LParenLoc,
1898                                           SourceLocation EndLoc) {
1899     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1900                                                    EndLoc);
1901   }
1902 
1903   /// Build a new OpenMP 'is_device_ptr' clause.
1904   ///
1905   /// By default, performs semantic analysis to build the new OpenMP clause.
1906   /// Subclasses may override this routine to provide different behavior.
1907   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1908                                          SourceLocation StartLoc,
1909                                          SourceLocation LParenLoc,
1910                                          SourceLocation EndLoc) {
1911     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1912                                                   EndLoc);
1913   }
1914 
1915   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1916   ///
1917   /// By default, performs semantic analysis to build the new statement.
1918   /// Subclasses may override this routine to provide different behavior.
1919   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1920                                               Expr *object) {
1921     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1922   }
1923 
1924   /// \brief Build a new Objective-C \@synchronized statement.
1925   ///
1926   /// By default, performs semantic analysis to build the new statement.
1927   /// Subclasses may override this routine to provide different behavior.
1928   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1929                                            Expr *Object, Stmt *Body) {
1930     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1931   }
1932 
1933   /// \brief Build a new Objective-C \@autoreleasepool statement.
1934   ///
1935   /// By default, performs semantic analysis to build the new statement.
1936   /// Subclasses may override this routine to provide different behavior.
1937   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1938                                             Stmt *Body) {
1939     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1940   }
1941 
1942   /// \brief Build a new Objective-C fast enumeration statement.
1943   ///
1944   /// By default, performs semantic analysis to build the new statement.
1945   /// Subclasses may override this routine to provide different behavior.
1946   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1947                                           Stmt *Element,
1948                                           Expr *Collection,
1949                                           SourceLocation RParenLoc,
1950                                           Stmt *Body) {
1951     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1952                                                 Element,
1953                                                 Collection,
1954                                                 RParenLoc);
1955     if (ForEachStmt.isInvalid())
1956       return StmtError();
1957 
1958     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1959   }
1960 
1961   /// \brief Build a new C++ exception declaration.
1962   ///
1963   /// By default, performs semantic analysis to build the new decaration.
1964   /// Subclasses may override this routine to provide different behavior.
1965   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1966                                 TypeSourceInfo *Declarator,
1967                                 SourceLocation StartLoc,
1968                                 SourceLocation IdLoc,
1969                                 IdentifierInfo *Id) {
1970     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1971                                                        StartLoc, IdLoc, Id);
1972     if (Var)
1973       getSema().CurContext->addDecl(Var);
1974     return Var;
1975   }
1976 
1977   /// \brief Build a new C++ catch statement.
1978   ///
1979   /// By default, performs semantic analysis to build the new statement.
1980   /// Subclasses may override this routine to provide different behavior.
1981   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1982                                  VarDecl *ExceptionDecl,
1983                                  Stmt *Handler) {
1984     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1985                                                       Handler));
1986   }
1987 
1988   /// \brief Build a new C++ try statement.
1989   ///
1990   /// By default, performs semantic analysis to build the new statement.
1991   /// Subclasses may override this routine to provide different behavior.
1992   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1993                                ArrayRef<Stmt *> Handlers) {
1994     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1995   }
1996 
1997   /// \brief Build a new C++0x range-based for statement.
1998   ///
1999   /// By default, performs semantic analysis to build the new statement.
2000   /// Subclasses may override this routine to provide different behavior.
2001   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2002                                     SourceLocation CoawaitLoc,
2003                                     SourceLocation ColonLoc,
2004                                     Stmt *Range, Stmt *Begin, Stmt *End,
2005                                     Expr *Cond, Expr *Inc,
2006                                     Stmt *LoopVar,
2007                                     SourceLocation RParenLoc) {
2008     // If we've just learned that the range is actually an Objective-C
2009     // collection, treat this as an Objective-C fast enumeration loop.
2010     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2011       if (RangeStmt->isSingleDecl()) {
2012         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2013           if (RangeVar->isInvalidDecl())
2014             return StmtError();
2015 
2016           Expr *RangeExpr = RangeVar->getInit();
2017           if (!RangeExpr->isTypeDependent() &&
2018               RangeExpr->getType()->isObjCObjectPointerType())
2019             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
2020                                                         RParenLoc);
2021         }
2022       }
2023     }
2024 
2025     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
2026                                           Range, Begin, End,
2027                                           Cond, Inc, LoopVar, RParenLoc,
2028                                           Sema::BFRK_Rebuild);
2029   }
2030 
2031   /// \brief Build a new C++0x range-based for statement.
2032   ///
2033   /// By default, performs semantic analysis to build the new statement.
2034   /// Subclasses may override this routine to provide different behavior.
2035   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2036                                           bool IsIfExists,
2037                                           NestedNameSpecifierLoc QualifierLoc,
2038                                           DeclarationNameInfo NameInfo,
2039                                           Stmt *Nested) {
2040     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2041                                                 QualifierLoc, NameInfo, Nested);
2042   }
2043 
2044   /// \brief Attach body to a C++0x range-based for statement.
2045   ///
2046   /// By default, performs semantic analysis to finish the new statement.
2047   /// Subclasses may override this routine to provide different behavior.
2048   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2049     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2050   }
2051 
2052   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2053                                Stmt *TryBlock, Stmt *Handler) {
2054     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2055   }
2056 
2057   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2058                                   Stmt *Block) {
2059     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2060   }
2061 
2062   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2063     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2064   }
2065 
2066   /// \brief Build a new predefined expression.
2067   ///
2068   /// By default, performs semantic analysis to build the new expression.
2069   /// Subclasses may override this routine to provide different behavior.
2070   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2071                                    PredefinedExpr::IdentType IT) {
2072     return getSema().BuildPredefinedExpr(Loc, IT);
2073   }
2074 
2075   /// \brief Build a new expression that references a declaration.
2076   ///
2077   /// By default, performs semantic analysis to build the new expression.
2078   /// Subclasses may override this routine to provide different behavior.
2079   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2080                                         LookupResult &R,
2081                                         bool RequiresADL) {
2082     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2083   }
2084 
2085 
2086   /// \brief Build a new expression that references a declaration.
2087   ///
2088   /// By default, performs semantic analysis to build the new expression.
2089   /// Subclasses may override this routine to provide different behavior.
2090   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2091                                 ValueDecl *VD,
2092                                 const DeclarationNameInfo &NameInfo,
2093                                 TemplateArgumentListInfo *TemplateArgs) {
2094     CXXScopeSpec SS;
2095     SS.Adopt(QualifierLoc);
2096 
2097     // FIXME: loses template args.
2098 
2099     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2100   }
2101 
2102   /// \brief Build a new expression in parentheses.
2103   ///
2104   /// By default, performs semantic analysis to build the new expression.
2105   /// Subclasses may override this routine to provide different behavior.
2106   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2107                                     SourceLocation RParen) {
2108     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2109   }
2110 
2111   /// \brief Build a new pseudo-destructor expression.
2112   ///
2113   /// By default, performs semantic analysis to build the new expression.
2114   /// Subclasses may override this routine to provide different behavior.
2115   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2116                                             SourceLocation OperatorLoc,
2117                                             bool isArrow,
2118                                             CXXScopeSpec &SS,
2119                                             TypeSourceInfo *ScopeType,
2120                                             SourceLocation CCLoc,
2121                                             SourceLocation TildeLoc,
2122                                         PseudoDestructorTypeStorage Destroyed);
2123 
2124   /// \brief Build a new unary operator expression.
2125   ///
2126   /// By default, performs semantic analysis to build the new expression.
2127   /// Subclasses may override this routine to provide different behavior.
2128   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2129                                         UnaryOperatorKind Opc,
2130                                         Expr *SubExpr) {
2131     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2132   }
2133 
2134   /// \brief Build a new builtin offsetof expression.
2135   ///
2136   /// By default, performs semantic analysis to build the new expression.
2137   /// Subclasses may override this routine to provide different behavior.
2138   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2139                                  TypeSourceInfo *Type,
2140                                  ArrayRef<Sema::OffsetOfComponent> Components,
2141                                  SourceLocation RParenLoc) {
2142     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2143                                           RParenLoc);
2144   }
2145 
2146   /// \brief Build a new sizeof, alignof or vec_step expression with a
2147   /// type argument.
2148   ///
2149   /// By default, performs semantic analysis to build the new expression.
2150   /// Subclasses may override this routine to provide different behavior.
2151   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2152                                          SourceLocation OpLoc,
2153                                          UnaryExprOrTypeTrait ExprKind,
2154                                          SourceRange R) {
2155     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2156   }
2157 
2158   /// \brief Build a new sizeof, alignof or vec step expression with an
2159   /// expression argument.
2160   ///
2161   /// By default, performs semantic analysis to build the new expression.
2162   /// Subclasses may override this routine to provide different behavior.
2163   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2164                                          UnaryExprOrTypeTrait ExprKind,
2165                                          SourceRange R) {
2166     ExprResult Result
2167       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2168     if (Result.isInvalid())
2169       return ExprError();
2170 
2171     return Result;
2172   }
2173 
2174   /// \brief Build a new array subscript expression.
2175   ///
2176   /// By default, performs semantic analysis to build the new expression.
2177   /// Subclasses may override this routine to provide different behavior.
2178   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2179                                              SourceLocation LBracketLoc,
2180                                              Expr *RHS,
2181                                              SourceLocation RBracketLoc) {
2182     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2183                                              LBracketLoc, RHS,
2184                                              RBracketLoc);
2185   }
2186 
2187   /// \brief Build a new array section expression.
2188   ///
2189   /// By default, performs semantic analysis to build the new expression.
2190   /// Subclasses may override this routine to provide different behavior.
2191   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2192                                         Expr *LowerBound,
2193                                         SourceLocation ColonLoc, Expr *Length,
2194                                         SourceLocation RBracketLoc) {
2195     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2196                                               ColonLoc, Length, RBracketLoc);
2197   }
2198 
2199   /// \brief Build a new call expression.
2200   ///
2201   /// By default, performs semantic analysis to build the new expression.
2202   /// Subclasses may override this routine to provide different behavior.
2203   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2204                                    MultiExprArg Args,
2205                                    SourceLocation RParenLoc,
2206                                    Expr *ExecConfig = nullptr) {
2207     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2208                                    Args, RParenLoc, ExecConfig);
2209   }
2210 
2211   /// \brief Build a new member access expression.
2212   ///
2213   /// By default, performs semantic analysis to build the new expression.
2214   /// Subclasses may override this routine to provide different behavior.
2215   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2216                                bool isArrow,
2217                                NestedNameSpecifierLoc QualifierLoc,
2218                                SourceLocation TemplateKWLoc,
2219                                const DeclarationNameInfo &MemberNameInfo,
2220                                ValueDecl *Member,
2221                                NamedDecl *FoundDecl,
2222                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2223                                NamedDecl *FirstQualifierInScope) {
2224     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2225                                                                       isArrow);
2226     if (!Member->getDeclName()) {
2227       // We have a reference to an unnamed field.  This is always the
2228       // base of an anonymous struct/union member access, i.e. the
2229       // field is always of record type.
2230       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
2231       assert(Member->getType()->isRecordType() &&
2232              "unnamed member not of record type?");
2233 
2234       BaseResult =
2235         getSema().PerformObjectMemberConversion(BaseResult.get(),
2236                                                 QualifierLoc.getNestedNameSpecifier(),
2237                                                 FoundDecl, Member);
2238       if (BaseResult.isInvalid())
2239         return ExprError();
2240       Base = BaseResult.get();
2241       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
2242       MemberExpr *ME = new (getSema().Context)
2243           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
2244                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
2245       return ME;
2246     }
2247 
2248     CXXScopeSpec SS;
2249     SS.Adopt(QualifierLoc);
2250 
2251     Base = BaseResult.get();
2252     QualType BaseType = Base->getType();
2253 
2254     if (isArrow && !BaseType->isPointerType())
2255       return ExprError();
2256 
2257     // FIXME: this involves duplicating earlier analysis in a lot of
2258     // cases; we should avoid this when possible.
2259     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2260     R.addDecl(FoundDecl);
2261     R.resolveKind();
2262 
2263     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2264                                               SS, TemplateKWLoc,
2265                                               FirstQualifierInScope,
2266                                               R, ExplicitTemplateArgs,
2267                                               /*S*/nullptr);
2268   }
2269 
2270   /// \brief Build a new binary operator expression.
2271   ///
2272   /// By default, performs semantic analysis to build the new expression.
2273   /// Subclasses may override this routine to provide different behavior.
2274   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2275                                          BinaryOperatorKind Opc,
2276                                          Expr *LHS, Expr *RHS) {
2277     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2278   }
2279 
2280   /// \brief Build a new conditional operator expression.
2281   ///
2282   /// By default, performs semantic analysis to build the new expression.
2283   /// Subclasses may override this routine to provide different behavior.
2284   ExprResult RebuildConditionalOperator(Expr *Cond,
2285                                         SourceLocation QuestionLoc,
2286                                         Expr *LHS,
2287                                         SourceLocation ColonLoc,
2288                                         Expr *RHS) {
2289     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2290                                         LHS, RHS);
2291   }
2292 
2293   /// \brief Build a new C-style cast expression.
2294   ///
2295   /// By default, performs semantic analysis to build the new expression.
2296   /// Subclasses may override this routine to provide different behavior.
2297   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2298                                          TypeSourceInfo *TInfo,
2299                                          SourceLocation RParenLoc,
2300                                          Expr *SubExpr) {
2301     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2302                                          SubExpr);
2303   }
2304 
2305   /// \brief Build a new compound literal expression.
2306   ///
2307   /// By default, performs semantic analysis to build the new expression.
2308   /// Subclasses may override this routine to provide different behavior.
2309   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2310                                               TypeSourceInfo *TInfo,
2311                                               SourceLocation RParenLoc,
2312                                               Expr *Init) {
2313     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2314                                               Init);
2315   }
2316 
2317   /// \brief Build a new extended vector element access expression.
2318   ///
2319   /// By default, performs semantic analysis to build the new expression.
2320   /// Subclasses may override this routine to provide different behavior.
2321   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2322                                                SourceLocation OpLoc,
2323                                                SourceLocation AccessorLoc,
2324                                                IdentifierInfo &Accessor) {
2325 
2326     CXXScopeSpec SS;
2327     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2328     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2329                                               OpLoc, /*IsArrow*/ false,
2330                                               SS, SourceLocation(),
2331                                               /*FirstQualifierInScope*/ nullptr,
2332                                               NameInfo,
2333                                               /* TemplateArgs */ nullptr,
2334                                               /*S*/ nullptr);
2335   }
2336 
2337   /// \brief Build a new initializer list expression.
2338   ///
2339   /// By default, performs semantic analysis to build the new expression.
2340   /// Subclasses may override this routine to provide different behavior.
2341   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2342                              MultiExprArg Inits,
2343                              SourceLocation RBraceLoc,
2344                              QualType ResultTy) {
2345     ExprResult Result
2346       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2347     if (Result.isInvalid() || ResultTy->isDependentType())
2348       return Result;
2349 
2350     // Patch in the result type we were given, which may have been computed
2351     // when the initial InitListExpr was built.
2352     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
2353     ILE->setType(ResultTy);
2354     return Result;
2355   }
2356 
2357   /// \brief Build a new designated initializer expression.
2358   ///
2359   /// By default, performs semantic analysis to build the new expression.
2360   /// Subclasses may override this routine to provide different behavior.
2361   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2362                                              MultiExprArg ArrayExprs,
2363                                              SourceLocation EqualOrColonLoc,
2364                                              bool GNUSyntax,
2365                                              Expr *Init) {
2366     ExprResult Result
2367       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2368                                            Init);
2369     if (Result.isInvalid())
2370       return ExprError();
2371 
2372     return Result;
2373   }
2374 
2375   /// \brief Build a new value-initialized expression.
2376   ///
2377   /// By default, builds the implicit value initialization without performing
2378   /// any semantic analysis. Subclasses may override this routine to provide
2379   /// different behavior.
2380   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2381     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2382   }
2383 
2384   /// \brief Build a new \c va_arg expression.
2385   ///
2386   /// By default, performs semantic analysis to build the new expression.
2387   /// Subclasses may override this routine to provide different behavior.
2388   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2389                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2390                                     SourceLocation RParenLoc) {
2391     return getSema().BuildVAArgExpr(BuiltinLoc,
2392                                     SubExpr, TInfo,
2393                                     RParenLoc);
2394   }
2395 
2396   /// \brief Build a new expression list in parentheses.
2397   ///
2398   /// By default, performs semantic analysis to build the new expression.
2399   /// Subclasses may override this routine to provide different behavior.
2400   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2401                                   MultiExprArg SubExprs,
2402                                   SourceLocation RParenLoc) {
2403     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2404   }
2405 
2406   /// \brief Build a new address-of-label expression.
2407   ///
2408   /// By default, performs semantic analysis, using the name of the label
2409   /// rather than attempting to map the label statement itself.
2410   /// Subclasses may override this routine to provide different behavior.
2411   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2412                                   SourceLocation LabelLoc, LabelDecl *Label) {
2413     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2414   }
2415 
2416   /// \brief Build a new GNU statement expression.
2417   ///
2418   /// By default, performs semantic analysis to build the new expression.
2419   /// Subclasses may override this routine to provide different behavior.
2420   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2421                                    Stmt *SubStmt,
2422                                    SourceLocation RParenLoc) {
2423     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2424   }
2425 
2426   /// \brief Build a new __builtin_choose_expr expression.
2427   ///
2428   /// By default, performs semantic analysis to build the new expression.
2429   /// Subclasses may override this routine to provide different behavior.
2430   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2431                                      Expr *Cond, Expr *LHS, Expr *RHS,
2432                                      SourceLocation RParenLoc) {
2433     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2434                                    Cond, LHS, RHS,
2435                                    RParenLoc);
2436   }
2437 
2438   /// \brief Build a new generic selection expression.
2439   ///
2440   /// By default, performs semantic analysis to build the new expression.
2441   /// Subclasses may override this routine to provide different behavior.
2442   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2443                                          SourceLocation DefaultLoc,
2444                                          SourceLocation RParenLoc,
2445                                          Expr *ControllingExpr,
2446                                          ArrayRef<TypeSourceInfo *> Types,
2447                                          ArrayRef<Expr *> Exprs) {
2448     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2449                                                 ControllingExpr, Types, Exprs);
2450   }
2451 
2452   /// \brief Build a new overloaded operator call expression.
2453   ///
2454   /// By default, performs semantic analysis to build the new expression.
2455   /// The semantic analysis provides the behavior of template instantiation,
2456   /// copying with transformations that turn what looks like an overloaded
2457   /// operator call into a use of a builtin operator, performing
2458   /// argument-dependent lookup, etc. Subclasses may override this routine to
2459   /// provide different behavior.
2460   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2461                                               SourceLocation OpLoc,
2462                                               Expr *Callee,
2463                                               Expr *First,
2464                                               Expr *Second);
2465 
2466   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2467   /// reinterpret_cast.
2468   ///
2469   /// By default, this routine dispatches to one of the more-specific routines
2470   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2471   /// Subclasses may override this routine to provide different behavior.
2472   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2473                                            Stmt::StmtClass Class,
2474                                            SourceLocation LAngleLoc,
2475                                            TypeSourceInfo *TInfo,
2476                                            SourceLocation RAngleLoc,
2477                                            SourceLocation LParenLoc,
2478                                            Expr *SubExpr,
2479                                            SourceLocation RParenLoc) {
2480     switch (Class) {
2481     case Stmt::CXXStaticCastExprClass:
2482       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2483                                                    RAngleLoc, LParenLoc,
2484                                                    SubExpr, RParenLoc);
2485 
2486     case Stmt::CXXDynamicCastExprClass:
2487       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2488                                                     RAngleLoc, LParenLoc,
2489                                                     SubExpr, RParenLoc);
2490 
2491     case Stmt::CXXReinterpretCastExprClass:
2492       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2493                                                         RAngleLoc, LParenLoc,
2494                                                         SubExpr,
2495                                                         RParenLoc);
2496 
2497     case Stmt::CXXConstCastExprClass:
2498       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2499                                                    RAngleLoc, LParenLoc,
2500                                                    SubExpr, RParenLoc);
2501 
2502     default:
2503       llvm_unreachable("Invalid C++ named cast");
2504     }
2505   }
2506 
2507   /// \brief Build a new C++ static_cast expression.
2508   ///
2509   /// By default, performs semantic analysis to build the new expression.
2510   /// Subclasses may override this routine to provide different behavior.
2511   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2512                                             SourceLocation LAngleLoc,
2513                                             TypeSourceInfo *TInfo,
2514                                             SourceLocation RAngleLoc,
2515                                             SourceLocation LParenLoc,
2516                                             Expr *SubExpr,
2517                                             SourceLocation RParenLoc) {
2518     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2519                                        TInfo, SubExpr,
2520                                        SourceRange(LAngleLoc, RAngleLoc),
2521                                        SourceRange(LParenLoc, RParenLoc));
2522   }
2523 
2524   /// \brief Build a new C++ dynamic_cast expression.
2525   ///
2526   /// By default, performs semantic analysis to build the new expression.
2527   /// Subclasses may override this routine to provide different behavior.
2528   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2529                                              SourceLocation LAngleLoc,
2530                                              TypeSourceInfo *TInfo,
2531                                              SourceLocation RAngleLoc,
2532                                              SourceLocation LParenLoc,
2533                                              Expr *SubExpr,
2534                                              SourceLocation RParenLoc) {
2535     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2536                                        TInfo, SubExpr,
2537                                        SourceRange(LAngleLoc, RAngleLoc),
2538                                        SourceRange(LParenLoc, RParenLoc));
2539   }
2540 
2541   /// \brief Build a new C++ reinterpret_cast expression.
2542   ///
2543   /// By default, performs semantic analysis to build the new expression.
2544   /// Subclasses may override this routine to provide different behavior.
2545   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2546                                                  SourceLocation LAngleLoc,
2547                                                  TypeSourceInfo *TInfo,
2548                                                  SourceLocation RAngleLoc,
2549                                                  SourceLocation LParenLoc,
2550                                                  Expr *SubExpr,
2551                                                  SourceLocation RParenLoc) {
2552     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2553                                        TInfo, SubExpr,
2554                                        SourceRange(LAngleLoc, RAngleLoc),
2555                                        SourceRange(LParenLoc, RParenLoc));
2556   }
2557 
2558   /// \brief Build a new C++ const_cast expression.
2559   ///
2560   /// By default, performs semantic analysis to build the new expression.
2561   /// Subclasses may override this routine to provide different behavior.
2562   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2563                                            SourceLocation LAngleLoc,
2564                                            TypeSourceInfo *TInfo,
2565                                            SourceLocation RAngleLoc,
2566                                            SourceLocation LParenLoc,
2567                                            Expr *SubExpr,
2568                                            SourceLocation RParenLoc) {
2569     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2570                                        TInfo, SubExpr,
2571                                        SourceRange(LAngleLoc, RAngleLoc),
2572                                        SourceRange(LParenLoc, RParenLoc));
2573   }
2574 
2575   /// \brief Build a new C++ functional-style cast 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 RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2580                                           SourceLocation LParenLoc,
2581                                           Expr *Sub,
2582                                           SourceLocation RParenLoc) {
2583     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2584                                                MultiExprArg(&Sub, 1),
2585                                                RParenLoc);
2586   }
2587 
2588   /// \brief Build a new C++ typeid(type) expression.
2589   ///
2590   /// By default, performs semantic analysis to build the new expression.
2591   /// Subclasses may override this routine to provide different behavior.
2592   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2593                                         SourceLocation TypeidLoc,
2594                                         TypeSourceInfo *Operand,
2595                                         SourceLocation RParenLoc) {
2596     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2597                                     RParenLoc);
2598   }
2599 
2600 
2601   /// \brief Build a new C++ typeid(expr) expression.
2602   ///
2603   /// By default, performs semantic analysis to build the new expression.
2604   /// Subclasses may override this routine to provide different behavior.
2605   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2606                                         SourceLocation TypeidLoc,
2607                                         Expr *Operand,
2608                                         SourceLocation RParenLoc) {
2609     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2610                                     RParenLoc);
2611   }
2612 
2613   /// \brief Build a new C++ __uuidof(type) expression.
2614   ///
2615   /// By default, performs semantic analysis to build the new expression.
2616   /// Subclasses may override this routine to provide different behavior.
2617   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2618                                         SourceLocation TypeidLoc,
2619                                         TypeSourceInfo *Operand,
2620                                         SourceLocation RParenLoc) {
2621     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2622                                     RParenLoc);
2623   }
2624 
2625   /// \brief Build a new C++ __uuidof(expr) expression.
2626   ///
2627   /// By default, performs semantic analysis to build the new expression.
2628   /// Subclasses may override this routine to provide different behavior.
2629   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2630                                         SourceLocation TypeidLoc,
2631                                         Expr *Operand,
2632                                         SourceLocation RParenLoc) {
2633     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2634                                     RParenLoc);
2635   }
2636 
2637   /// \brief Build a new C++ "this" expression.
2638   ///
2639   /// By default, builds a new "this" expression without performing any
2640   /// semantic analysis. Subclasses may override this routine to provide
2641   /// different behavior.
2642   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2643                                 QualType ThisType,
2644                                 bool isImplicit) {
2645     getSema().CheckCXXThisCapture(ThisLoc);
2646     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2647   }
2648 
2649   /// \brief Build a new C++ throw expression.
2650   ///
2651   /// By default, performs semantic analysis to build the new expression.
2652   /// Subclasses may override this routine to provide different behavior.
2653   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2654                                  bool IsThrownVariableInScope) {
2655     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2656   }
2657 
2658   /// \brief Build a new C++ default-argument expression.
2659   ///
2660   /// By default, builds a new default-argument expression, which does not
2661   /// require any semantic analysis. Subclasses may override this routine to
2662   /// provide different behavior.
2663   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2664                                             ParmVarDecl *Param) {
2665     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2666   }
2667 
2668   /// \brief Build a new C++11 default-initialization expression.
2669   ///
2670   /// By default, builds a new default field initialization expression, which
2671   /// does not require any semantic analysis. Subclasses may override this
2672   /// routine to provide different behavior.
2673   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2674                                        FieldDecl *Field) {
2675     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2676   }
2677 
2678   /// \brief Build a new C++ zero-initialization expression.
2679   ///
2680   /// By default, performs semantic analysis to build the new expression.
2681   /// Subclasses may override this routine to provide different behavior.
2682   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2683                                            SourceLocation LParenLoc,
2684                                            SourceLocation RParenLoc) {
2685     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2686                                                None, RParenLoc);
2687   }
2688 
2689   /// \brief Build a new C++ "new" expression.
2690   ///
2691   /// By default, performs semantic analysis to build the new expression.
2692   /// Subclasses may override this routine to provide different behavior.
2693   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2694                                bool UseGlobal,
2695                                SourceLocation PlacementLParen,
2696                                MultiExprArg PlacementArgs,
2697                                SourceLocation PlacementRParen,
2698                                SourceRange TypeIdParens,
2699                                QualType AllocatedType,
2700                                TypeSourceInfo *AllocatedTypeInfo,
2701                                Expr *ArraySize,
2702                                SourceRange DirectInitRange,
2703                                Expr *Initializer) {
2704     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2705                                  PlacementLParen,
2706                                  PlacementArgs,
2707                                  PlacementRParen,
2708                                  TypeIdParens,
2709                                  AllocatedType,
2710                                  AllocatedTypeInfo,
2711                                  ArraySize,
2712                                  DirectInitRange,
2713                                  Initializer);
2714   }
2715 
2716   /// \brief Build a new C++ "delete" expression.
2717   ///
2718   /// By default, performs semantic analysis to build the new expression.
2719   /// Subclasses may override this routine to provide different behavior.
2720   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2721                                         bool IsGlobalDelete,
2722                                         bool IsArrayForm,
2723                                         Expr *Operand) {
2724     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2725                                     Operand);
2726   }
2727 
2728   /// \brief Build a new type trait expression.
2729   ///
2730   /// By default, performs semantic analysis to build the new expression.
2731   /// Subclasses may override this routine to provide different behavior.
2732   ExprResult RebuildTypeTrait(TypeTrait Trait,
2733                               SourceLocation StartLoc,
2734                               ArrayRef<TypeSourceInfo *> Args,
2735                               SourceLocation RParenLoc) {
2736     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2737   }
2738 
2739   /// \brief Build a new array type trait 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 RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2744                                    SourceLocation StartLoc,
2745                                    TypeSourceInfo *TSInfo,
2746                                    Expr *DimExpr,
2747                                    SourceLocation RParenLoc) {
2748     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2749   }
2750 
2751   /// \brief Build a new expression trait expression.
2752   ///
2753   /// By default, performs semantic analysis to build the new expression.
2754   /// Subclasses may override this routine to provide different behavior.
2755   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2756                                    SourceLocation StartLoc,
2757                                    Expr *Queried,
2758                                    SourceLocation RParenLoc) {
2759     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2760   }
2761 
2762   /// \brief Build a new (previously unresolved) declaration reference
2763   /// expression.
2764   ///
2765   /// By default, performs semantic analysis to build the new expression.
2766   /// Subclasses may override this routine to provide different behavior.
2767   ExprResult RebuildDependentScopeDeclRefExpr(
2768                                           NestedNameSpecifierLoc QualifierLoc,
2769                                           SourceLocation TemplateKWLoc,
2770                                        const DeclarationNameInfo &NameInfo,
2771                               const TemplateArgumentListInfo *TemplateArgs,
2772                                           bool IsAddressOfOperand,
2773                                           TypeSourceInfo **RecoveryTSI) {
2774     CXXScopeSpec SS;
2775     SS.Adopt(QualifierLoc);
2776 
2777     if (TemplateArgs || TemplateKWLoc.isValid())
2778       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2779                                                     TemplateArgs);
2780 
2781     return getSema().BuildQualifiedDeclarationNameExpr(
2782         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2783   }
2784 
2785   /// \brief Build a new template-id expression.
2786   ///
2787   /// By default, performs semantic analysis to build the new expression.
2788   /// Subclasses may override this routine to provide different behavior.
2789   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2790                                    SourceLocation TemplateKWLoc,
2791                                    LookupResult &R,
2792                                    bool RequiresADL,
2793                               const TemplateArgumentListInfo *TemplateArgs) {
2794     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2795                                          TemplateArgs);
2796   }
2797 
2798   /// \brief Build a new object-construction expression.
2799   ///
2800   /// By default, performs semantic analysis to build the new expression.
2801   /// Subclasses may override this routine to provide different behavior.
2802   ExprResult RebuildCXXConstructExpr(QualType T,
2803                                      SourceLocation Loc,
2804                                      CXXConstructorDecl *Constructor,
2805                                      bool IsElidable,
2806                                      MultiExprArg Args,
2807                                      bool HadMultipleCandidates,
2808                                      bool ListInitialization,
2809                                      bool StdInitListInitialization,
2810                                      bool RequiresZeroInit,
2811                              CXXConstructExpr::ConstructionKind ConstructKind,
2812                                      SourceRange ParenRange) {
2813     SmallVector<Expr*, 8> ConvertedArgs;
2814     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2815                                           ConvertedArgs))
2816       return ExprError();
2817 
2818     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2819                                            IsElidable,
2820                                            ConvertedArgs,
2821                                            HadMultipleCandidates,
2822                                            ListInitialization,
2823                                            StdInitListInitialization,
2824                                            RequiresZeroInit, ConstructKind,
2825                                            ParenRange);
2826   }
2827 
2828   /// \brief Build a new implicit construction via inherited constructor
2829   /// expression.
2830   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2831                                              CXXConstructorDecl *Constructor,
2832                                              bool ConstructsVBase,
2833                                              bool InheritedFromVBase) {
2834     return new (getSema().Context) CXXInheritedCtorInitExpr(
2835         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2836   }
2837 
2838   /// \brief Build a new object-construction expression.
2839   ///
2840   /// By default, performs semantic analysis to build the new expression.
2841   /// Subclasses may override this routine to provide different behavior.
2842   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2843                                            SourceLocation LParenLoc,
2844                                            MultiExprArg Args,
2845                                            SourceLocation RParenLoc) {
2846     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2847                                                LParenLoc,
2848                                                Args,
2849                                                RParenLoc);
2850   }
2851 
2852   /// \brief Build a new object-construction expression.
2853   ///
2854   /// By default, performs semantic analysis to build the new expression.
2855   /// Subclasses may override this routine to provide different behavior.
2856   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2857                                                SourceLocation LParenLoc,
2858                                                MultiExprArg Args,
2859                                                SourceLocation RParenLoc) {
2860     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2861                                                LParenLoc,
2862                                                Args,
2863                                                RParenLoc);
2864   }
2865 
2866   /// \brief Build a new member reference expression.
2867   ///
2868   /// By default, performs semantic analysis to build the new expression.
2869   /// Subclasses may override this routine to provide different behavior.
2870   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2871                                                 QualType BaseType,
2872                                                 bool IsArrow,
2873                                                 SourceLocation OperatorLoc,
2874                                           NestedNameSpecifierLoc QualifierLoc,
2875                                                 SourceLocation TemplateKWLoc,
2876                                             NamedDecl *FirstQualifierInScope,
2877                                    const DeclarationNameInfo &MemberNameInfo,
2878                               const TemplateArgumentListInfo *TemplateArgs) {
2879     CXXScopeSpec SS;
2880     SS.Adopt(QualifierLoc);
2881 
2882     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2883                                             OperatorLoc, IsArrow,
2884                                             SS, TemplateKWLoc,
2885                                             FirstQualifierInScope,
2886                                             MemberNameInfo,
2887                                             TemplateArgs, /*S*/nullptr);
2888   }
2889 
2890   /// \brief Build a new member reference expression.
2891   ///
2892   /// By default, performs semantic analysis to build the new expression.
2893   /// Subclasses may override this routine to provide different behavior.
2894   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2895                                          SourceLocation OperatorLoc,
2896                                          bool IsArrow,
2897                                          NestedNameSpecifierLoc QualifierLoc,
2898                                          SourceLocation TemplateKWLoc,
2899                                          NamedDecl *FirstQualifierInScope,
2900                                          LookupResult &R,
2901                                 const TemplateArgumentListInfo *TemplateArgs) {
2902     CXXScopeSpec SS;
2903     SS.Adopt(QualifierLoc);
2904 
2905     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2906                                             OperatorLoc, IsArrow,
2907                                             SS, TemplateKWLoc,
2908                                             FirstQualifierInScope,
2909                                             R, TemplateArgs, /*S*/nullptr);
2910   }
2911 
2912   /// \brief Build a new noexcept expression.
2913   ///
2914   /// By default, performs semantic analysis to build the new expression.
2915   /// Subclasses may override this routine to provide different behavior.
2916   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2917     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2918   }
2919 
2920   /// \brief Build a new expression to compute the length of a parameter pack.
2921   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2922                                    NamedDecl *Pack,
2923                                    SourceLocation PackLoc,
2924                                    SourceLocation RParenLoc,
2925                                    Optional<unsigned> Length,
2926                                    ArrayRef<TemplateArgument> PartialArgs) {
2927     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2928                                   RParenLoc, Length, PartialArgs);
2929   }
2930 
2931   /// \brief Build a new Objective-C boxed expression.
2932   ///
2933   /// By default, performs semantic analysis to build the new expression.
2934   /// Subclasses may override this routine to provide different behavior.
2935   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2936     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2937   }
2938 
2939   /// \brief Build a new Objective-C array literal.
2940   ///
2941   /// By default, performs semantic analysis to build the new expression.
2942   /// Subclasses may override this routine to provide different behavior.
2943   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2944                                      Expr **Elements, unsigned NumElements) {
2945     return getSema().BuildObjCArrayLiteral(Range,
2946                                            MultiExprArg(Elements, NumElements));
2947   }
2948 
2949   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2950                                          Expr *Base, Expr *Key,
2951                                          ObjCMethodDecl *getterMethod,
2952                                          ObjCMethodDecl *setterMethod) {
2953     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2954                                                    getterMethod, setterMethod);
2955   }
2956 
2957   /// \brief Build a new Objective-C dictionary literal.
2958   ///
2959   /// By default, performs semantic analysis to build the new expression.
2960   /// Subclasses may override this routine to provide different behavior.
2961   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2962                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2963     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2964   }
2965 
2966   /// \brief Build a new Objective-C \@encode expression.
2967   ///
2968   /// By default, performs semantic analysis to build the new expression.
2969   /// Subclasses may override this routine to provide different behavior.
2970   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2971                                          TypeSourceInfo *EncodeTypeInfo,
2972                                          SourceLocation RParenLoc) {
2973     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2974   }
2975 
2976   /// \brief Build a new Objective-C class message.
2977   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2978                                           Selector Sel,
2979                                           ArrayRef<SourceLocation> SelectorLocs,
2980                                           ObjCMethodDecl *Method,
2981                                           SourceLocation LBracLoc,
2982                                           MultiExprArg Args,
2983                                           SourceLocation RBracLoc) {
2984     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2985                                      ReceiverTypeInfo->getType(),
2986                                      /*SuperLoc=*/SourceLocation(),
2987                                      Sel, Method, LBracLoc, SelectorLocs,
2988                                      RBracLoc, Args);
2989   }
2990 
2991   /// \brief Build a new Objective-C instance message.
2992   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2993                                           Selector Sel,
2994                                           ArrayRef<SourceLocation> SelectorLocs,
2995                                           ObjCMethodDecl *Method,
2996                                           SourceLocation LBracLoc,
2997                                           MultiExprArg Args,
2998                                           SourceLocation RBracLoc) {
2999     return SemaRef.BuildInstanceMessage(Receiver,
3000                                         Receiver->getType(),
3001                                         /*SuperLoc=*/SourceLocation(),
3002                                         Sel, Method, LBracLoc, SelectorLocs,
3003                                         RBracLoc, Args);
3004   }
3005 
3006   /// \brief Build a new Objective-C instance/class message to 'super'.
3007   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3008                                     Selector Sel,
3009                                     ArrayRef<SourceLocation> SelectorLocs,
3010                                     QualType SuperType,
3011                                     ObjCMethodDecl *Method,
3012                                     SourceLocation LBracLoc,
3013                                     MultiExprArg Args,
3014                                     SourceLocation RBracLoc) {
3015     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3016                                           SuperType,
3017                                           SuperLoc,
3018                                           Sel, Method, LBracLoc, SelectorLocs,
3019                                           RBracLoc, Args)
3020                                       : SemaRef.BuildClassMessage(nullptr,
3021                                           SuperType,
3022                                           SuperLoc,
3023                                           Sel, Method, LBracLoc, SelectorLocs,
3024                                           RBracLoc, Args);
3025 
3026 
3027   }
3028 
3029   /// \brief Build a new Objective-C ivar reference expression.
3030   ///
3031   /// By default, performs semantic analysis to build the new expression.
3032   /// Subclasses may override this routine to provide different behavior.
3033   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3034                                           SourceLocation IvarLoc,
3035                                           bool IsArrow, bool IsFreeIvar) {
3036     CXXScopeSpec SS;
3037     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3038     ExprResult Result = getSema().BuildMemberReferenceExpr(
3039         BaseArg, BaseArg->getType(),
3040         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3041         /*FirstQualifierInScope=*/nullptr, NameInfo,
3042         /*TemplateArgs=*/nullptr,
3043         /*S=*/nullptr);
3044     if (IsFreeIvar && Result.isUsable())
3045       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3046     return Result;
3047   }
3048 
3049   /// \brief Build a new Objective-C property reference expression.
3050   ///
3051   /// By default, performs semantic analysis to build the new expression.
3052   /// Subclasses may override this routine to provide different behavior.
3053   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3054                                         ObjCPropertyDecl *Property,
3055                                         SourceLocation PropertyLoc) {
3056     CXXScopeSpec SS;
3057     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3058     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3059                                               /*FIXME:*/PropertyLoc,
3060                                               /*IsArrow=*/false,
3061                                               SS, SourceLocation(),
3062                                               /*FirstQualifierInScope=*/nullptr,
3063                                               NameInfo,
3064                                               /*TemplateArgs=*/nullptr,
3065                                               /*S=*/nullptr);
3066   }
3067 
3068   /// \brief Build a new Objective-C property reference expression.
3069   ///
3070   /// By default, performs semantic analysis to build the new expression.
3071   /// Subclasses may override this routine to provide different behavior.
3072   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3073                                         ObjCMethodDecl *Getter,
3074                                         ObjCMethodDecl *Setter,
3075                                         SourceLocation PropertyLoc) {
3076     // Since these expressions can only be value-dependent, we do not
3077     // need to perform semantic analysis again.
3078     return Owned(
3079       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3080                                                   VK_LValue, OK_ObjCProperty,
3081                                                   PropertyLoc, Base));
3082   }
3083 
3084   /// \brief Build a new Objective-C "isa" expression.
3085   ///
3086   /// By default, performs semantic analysis to build the new expression.
3087   /// Subclasses may override this routine to provide different behavior.
3088   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3089                                 SourceLocation OpLoc, bool IsArrow) {
3090     CXXScopeSpec SS;
3091     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3092     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3093                                               OpLoc, IsArrow,
3094                                               SS, SourceLocation(),
3095                                               /*FirstQualifierInScope=*/nullptr,
3096                                               NameInfo,
3097                                               /*TemplateArgs=*/nullptr,
3098                                               /*S=*/nullptr);
3099   }
3100 
3101   /// \brief Build a new shuffle vector expression.
3102   ///
3103   /// By default, performs semantic analysis to build the new expression.
3104   /// Subclasses may override this routine to provide different behavior.
3105   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3106                                       MultiExprArg SubExprs,
3107                                       SourceLocation RParenLoc) {
3108     // Find the declaration for __builtin_shufflevector
3109     const IdentifierInfo &Name
3110       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3111     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3112     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3113     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3114 
3115     // Build a reference to the __builtin_shufflevector builtin
3116     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3117     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3118                                                   SemaRef.Context.BuiltinFnTy,
3119                                                   VK_RValue, BuiltinLoc);
3120     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3121     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3122                                        CK_BuiltinFnToFnPtr).get();
3123 
3124     // Build the CallExpr
3125     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3126         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3127         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3128 
3129     // Type-check the __builtin_shufflevector expression.
3130     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3131   }
3132 
3133   /// \brief Build a new convert vector expression.
3134   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3135                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3136                                       SourceLocation RParenLoc) {
3137     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3138                                          BuiltinLoc, RParenLoc);
3139   }
3140 
3141   /// \brief Build a new template argument pack expansion.
3142   ///
3143   /// By default, performs semantic analysis to build a new pack expansion
3144   /// for a template argument. Subclasses may override this routine to provide
3145   /// different behavior.
3146   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3147                                            SourceLocation EllipsisLoc,
3148                                            Optional<unsigned> NumExpansions) {
3149     switch (Pattern.getArgument().getKind()) {
3150     case TemplateArgument::Expression: {
3151       ExprResult Result
3152         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3153                                        EllipsisLoc, NumExpansions);
3154       if (Result.isInvalid())
3155         return TemplateArgumentLoc();
3156 
3157       return TemplateArgumentLoc(Result.get(), Result.get());
3158     }
3159 
3160     case TemplateArgument::Template:
3161       return TemplateArgumentLoc(TemplateArgument(
3162                                           Pattern.getArgument().getAsTemplate(),
3163                                                   NumExpansions),
3164                                  Pattern.getTemplateQualifierLoc(),
3165                                  Pattern.getTemplateNameLoc(),
3166                                  EllipsisLoc);
3167 
3168     case TemplateArgument::Null:
3169     case TemplateArgument::Integral:
3170     case TemplateArgument::Declaration:
3171     case TemplateArgument::Pack:
3172     case TemplateArgument::TemplateExpansion:
3173     case TemplateArgument::NullPtr:
3174       llvm_unreachable("Pack expansion pattern has no parameter packs");
3175 
3176     case TemplateArgument::Type:
3177       if (TypeSourceInfo *Expansion
3178             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3179                                            EllipsisLoc,
3180                                            NumExpansions))
3181         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3182                                    Expansion);
3183       break;
3184     }
3185 
3186     return TemplateArgumentLoc();
3187   }
3188 
3189   /// \brief Build a new expression pack expansion.
3190   ///
3191   /// By default, performs semantic analysis to build a new pack expansion
3192   /// for an expression. Subclasses may override this routine to provide
3193   /// different behavior.
3194   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3195                                   Optional<unsigned> NumExpansions) {
3196     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3197   }
3198 
3199   /// \brief Build a new C++1z fold-expression.
3200   ///
3201   /// By default, performs semantic analysis in order to build a new fold
3202   /// expression.
3203   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3204                                 BinaryOperatorKind Operator,
3205                                 SourceLocation EllipsisLoc, Expr *RHS,
3206                                 SourceLocation RParenLoc) {
3207     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3208                                       RHS, RParenLoc);
3209   }
3210 
3211   /// \brief Build an empty C++1z fold-expression with the given operator.
3212   ///
3213   /// By default, produces the fallback value for the fold-expression, or
3214   /// produce an error if there is no fallback value.
3215   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3216                                      BinaryOperatorKind Operator) {
3217     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3218   }
3219 
3220   /// \brief Build a new atomic operation expression.
3221   ///
3222   /// By default, performs semantic analysis to build the new expression.
3223   /// Subclasses may override this routine to provide different behavior.
3224   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3225                                MultiExprArg SubExprs,
3226                                QualType RetTy,
3227                                AtomicExpr::AtomicOp Op,
3228                                SourceLocation RParenLoc) {
3229     // Just create the expression; there is not any interesting semantic
3230     // analysis here because we can't actually build an AtomicExpr until
3231     // we are sure it is semantically sound.
3232     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3233                                             RParenLoc);
3234   }
3235 
3236 private:
3237   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3238                                      QualType ObjectType,
3239                                      NamedDecl *FirstQualifierInScope,
3240                                      CXXScopeSpec &SS);
3241 
3242   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3243                                              QualType ObjectType,
3244                                              NamedDecl *FirstQualifierInScope,
3245                                              CXXScopeSpec &SS);
3246 
3247   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3248                                             NamedDecl *FirstQualifierInScope,
3249                                             CXXScopeSpec &SS);
3250 
3251   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3252                                       DependentNameTypeLoc TL,
3253                                       bool DeducibleTSTContext);
3254 };
3255 
3256 template<typename Derived>
3257 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3258   if (!S)
3259     return S;
3260 
3261   switch (S->getStmtClass()) {
3262   case Stmt::NoStmtClass: break;
3263 
3264   // Transform individual statement nodes
3265 #define STMT(Node, Parent)                                              \
3266   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3267 #define ABSTRACT_STMT(Node)
3268 #define EXPR(Node, Parent)
3269 #include "clang/AST/StmtNodes.inc"
3270 
3271   // Transform expressions by calling TransformExpr.
3272 #define STMT(Node, Parent)
3273 #define ABSTRACT_STMT(Stmt)
3274 #define EXPR(Node, Parent) case Stmt::Node##Class:
3275 #include "clang/AST/StmtNodes.inc"
3276     {
3277       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3278       if (E.isInvalid())
3279         return StmtError();
3280 
3281       return getSema().ActOnExprStmt(E);
3282     }
3283   }
3284 
3285   return S;
3286 }
3287 
3288 template<typename Derived>
3289 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3290   if (!S)
3291     return S;
3292 
3293   switch (S->getClauseKind()) {
3294   default: break;
3295   // Transform individual clause nodes
3296 #define OPENMP_CLAUSE(Name, Class)                                             \
3297   case OMPC_ ## Name :                                                         \
3298     return getDerived().Transform ## Class(cast<Class>(S));
3299 #include "clang/Basic/OpenMPKinds.def"
3300   }
3301 
3302   return S;
3303 }
3304 
3305 
3306 template<typename Derived>
3307 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3308   if (!E)
3309     return E;
3310 
3311   switch (E->getStmtClass()) {
3312     case Stmt::NoStmtClass: break;
3313 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3314 #define ABSTRACT_STMT(Stmt)
3315 #define EXPR(Node, Parent)                                              \
3316     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3317 #include "clang/AST/StmtNodes.inc"
3318   }
3319 
3320   return E;
3321 }
3322 
3323 template<typename Derived>
3324 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3325                                                         bool NotCopyInit) {
3326   // Initializers are instantiated like expressions, except that various outer
3327   // layers are stripped.
3328   if (!Init)
3329     return Init;
3330 
3331   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3332     Init = ExprTemp->getSubExpr();
3333 
3334   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3335     Init = AIL->getCommonExpr();
3336 
3337   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3338     Init = MTE->GetTemporaryExpr();
3339 
3340   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3341     Init = Binder->getSubExpr();
3342 
3343   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3344     Init = ICE->getSubExprAsWritten();
3345 
3346   if (CXXStdInitializerListExpr *ILE =
3347           dyn_cast<CXXStdInitializerListExpr>(Init))
3348     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3349 
3350   // If this is copy-initialization, we only need to reconstruct
3351   // InitListExprs. Other forms of copy-initialization will be a no-op if
3352   // the initializer is already the right type.
3353   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3354   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3355     return getDerived().TransformExpr(Init);
3356 
3357   // Revert value-initialization back to empty parens.
3358   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3359     SourceRange Parens = VIE->getSourceRange();
3360     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3361                                              Parens.getEnd());
3362   }
3363 
3364   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3365   if (isa<ImplicitValueInitExpr>(Init))
3366     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3367                                              SourceLocation());
3368 
3369   // Revert initialization by constructor back to a parenthesized or braced list
3370   // of expressions. Any other form of initializer can just be reused directly.
3371   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3372     return getDerived().TransformExpr(Init);
3373 
3374   // If the initialization implicitly converted an initializer list to a
3375   // std::initializer_list object, unwrap the std::initializer_list too.
3376   if (Construct && Construct->isStdInitListInitialization())
3377     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3378 
3379   SmallVector<Expr*, 8> NewArgs;
3380   bool ArgChanged = false;
3381   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3382                                   /*IsCall*/true, NewArgs, &ArgChanged))
3383     return ExprError();
3384 
3385   // If this was list initialization, revert to list form.
3386   if (Construct->isListInitialization())
3387     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3388                                         Construct->getLocEnd(),
3389                                         Construct->getType());
3390 
3391   // Build a ParenListExpr to represent anything else.
3392   SourceRange Parens = Construct->getParenOrBraceRange();
3393   if (Parens.isInvalid()) {
3394     // This was a variable declaration's initialization for which no initializer
3395     // was specified.
3396     assert(NewArgs.empty() &&
3397            "no parens or braces but have direct init with arguments?");
3398     return ExprEmpty();
3399   }
3400   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3401                                            Parens.getEnd());
3402 }
3403 
3404 template<typename Derived>
3405 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3406                                             unsigned NumInputs,
3407                                             bool IsCall,
3408                                       SmallVectorImpl<Expr *> &Outputs,
3409                                             bool *ArgChanged) {
3410   for (unsigned I = 0; I != NumInputs; ++I) {
3411     // If requested, drop call arguments that need to be dropped.
3412     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3413       if (ArgChanged)
3414         *ArgChanged = true;
3415 
3416       break;
3417     }
3418 
3419     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3420       Expr *Pattern = Expansion->getPattern();
3421 
3422       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3423       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3424       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3425 
3426       // Determine whether the set of unexpanded parameter packs can and should
3427       // be expanded.
3428       bool Expand = true;
3429       bool RetainExpansion = false;
3430       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3431       Optional<unsigned> NumExpansions = OrigNumExpansions;
3432       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3433                                                Pattern->getSourceRange(),
3434                                                Unexpanded,
3435                                                Expand, RetainExpansion,
3436                                                NumExpansions))
3437         return true;
3438 
3439       if (!Expand) {
3440         // The transform has determined that we should perform a simple
3441         // transformation on the pack expansion, producing another pack
3442         // expansion.
3443         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3444         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3445         if (OutPattern.isInvalid())
3446           return true;
3447 
3448         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3449                                                 Expansion->getEllipsisLoc(),
3450                                                            NumExpansions);
3451         if (Out.isInvalid())
3452           return true;
3453 
3454         if (ArgChanged)
3455           *ArgChanged = true;
3456         Outputs.push_back(Out.get());
3457         continue;
3458       }
3459 
3460       // Record right away that the argument was changed.  This needs
3461       // to happen even if the array expands to nothing.
3462       if (ArgChanged) *ArgChanged = true;
3463 
3464       // The transform has determined that we should perform an elementwise
3465       // expansion of the pattern. Do so.
3466       for (unsigned I = 0; I != *NumExpansions; ++I) {
3467         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3468         ExprResult Out = getDerived().TransformExpr(Pattern);
3469         if (Out.isInvalid())
3470           return true;
3471 
3472         if (Out.get()->containsUnexpandedParameterPack()) {
3473           Out = getDerived().RebuildPackExpansion(
3474               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3475           if (Out.isInvalid())
3476             return true;
3477         }
3478 
3479         Outputs.push_back(Out.get());
3480       }
3481 
3482       // If we're supposed to retain a pack expansion, do so by temporarily
3483       // forgetting the partially-substituted parameter pack.
3484       if (RetainExpansion) {
3485         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3486 
3487         ExprResult Out = getDerived().TransformExpr(Pattern);
3488         if (Out.isInvalid())
3489           return true;
3490 
3491         Out = getDerived().RebuildPackExpansion(
3492             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3493         if (Out.isInvalid())
3494           return true;
3495 
3496         Outputs.push_back(Out.get());
3497       }
3498 
3499       continue;
3500     }
3501 
3502     ExprResult Result =
3503       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3504              : getDerived().TransformExpr(Inputs[I]);
3505     if (Result.isInvalid())
3506       return true;
3507 
3508     if (Result.get() != Inputs[I] && ArgChanged)
3509       *ArgChanged = true;
3510 
3511     Outputs.push_back(Result.get());
3512   }
3513 
3514   return false;
3515 }
3516 
3517 template <typename Derived>
3518 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3519     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3520   if (Var) {
3521     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3522         getDerived().TransformDefinition(Var->getLocation(), Var));
3523 
3524     if (!ConditionVar)
3525       return Sema::ConditionError();
3526 
3527     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3528   }
3529 
3530   if (Expr) {
3531     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3532 
3533     if (CondExpr.isInvalid())
3534       return Sema::ConditionError();
3535 
3536     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3537   }
3538 
3539   return Sema::ConditionResult();
3540 }
3541 
3542 template<typename Derived>
3543 NestedNameSpecifierLoc
3544 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3545                                                     NestedNameSpecifierLoc NNS,
3546                                                      QualType ObjectType,
3547                                              NamedDecl *FirstQualifierInScope) {
3548   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3549   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3550        Qualifier = Qualifier.getPrefix())
3551     Qualifiers.push_back(Qualifier);
3552 
3553   CXXScopeSpec SS;
3554   while (!Qualifiers.empty()) {
3555     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3556     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3557 
3558     switch (QNNS->getKind()) {
3559     case NestedNameSpecifier::Identifier: {
3560       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3561                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3562       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3563                                               SS, FirstQualifierInScope, false))
3564         return NestedNameSpecifierLoc();
3565     }
3566       break;
3567 
3568     case NestedNameSpecifier::Namespace: {
3569       NamespaceDecl *NS
3570         = cast_or_null<NamespaceDecl>(
3571                                     getDerived().TransformDecl(
3572                                                           Q.getLocalBeginLoc(),
3573                                                        QNNS->getAsNamespace()));
3574       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3575       break;
3576     }
3577 
3578     case NestedNameSpecifier::NamespaceAlias: {
3579       NamespaceAliasDecl *Alias
3580         = cast_or_null<NamespaceAliasDecl>(
3581                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3582                                                  QNNS->getAsNamespaceAlias()));
3583       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3584                 Q.getLocalEndLoc());
3585       break;
3586     }
3587 
3588     case NestedNameSpecifier::Global:
3589       // There is no meaningful transformation that one could perform on the
3590       // global scope.
3591       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3592       break;
3593 
3594     case NestedNameSpecifier::Super: {
3595       CXXRecordDecl *RD =
3596           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3597               SourceLocation(), QNNS->getAsRecordDecl()));
3598       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3599       break;
3600     }
3601 
3602     case NestedNameSpecifier::TypeSpecWithTemplate:
3603     case NestedNameSpecifier::TypeSpec: {
3604       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3605                                               FirstQualifierInScope, SS);
3606 
3607       if (!TL)
3608         return NestedNameSpecifierLoc();
3609 
3610       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3611           (SemaRef.getLangOpts().CPlusPlus11 &&
3612            TL.getType()->isEnumeralType())) {
3613         assert(!TL.getType().hasLocalQualifiers() &&
3614                "Can't get cv-qualifiers here");
3615         if (TL.getType()->isEnumeralType())
3616           SemaRef.Diag(TL.getBeginLoc(),
3617                        diag::warn_cxx98_compat_enum_nested_name_spec);
3618         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3619                   Q.getLocalEndLoc());
3620         break;
3621       }
3622       // If the nested-name-specifier is an invalid type def, don't emit an
3623       // error because a previous error should have already been emitted.
3624       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3625       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3626         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3627           << TL.getType() << SS.getRange();
3628       }
3629       return NestedNameSpecifierLoc();
3630     }
3631     }
3632 
3633     // The qualifier-in-scope and object type only apply to the leftmost entity.
3634     FirstQualifierInScope = nullptr;
3635     ObjectType = QualType();
3636   }
3637 
3638   // Don't rebuild the nested-name-specifier if we don't have to.
3639   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3640       !getDerived().AlwaysRebuild())
3641     return NNS;
3642 
3643   // If we can re-use the source-location data from the original
3644   // nested-name-specifier, do so.
3645   if (SS.location_size() == NNS.getDataLength() &&
3646       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3647     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3648 
3649   // Allocate new nested-name-specifier location information.
3650   return SS.getWithLocInContext(SemaRef.Context);
3651 }
3652 
3653 template<typename Derived>
3654 DeclarationNameInfo
3655 TreeTransform<Derived>
3656 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3657   DeclarationName Name = NameInfo.getName();
3658   if (!Name)
3659     return DeclarationNameInfo();
3660 
3661   switch (Name.getNameKind()) {
3662   case DeclarationName::Identifier:
3663   case DeclarationName::ObjCZeroArgSelector:
3664   case DeclarationName::ObjCOneArgSelector:
3665   case DeclarationName::ObjCMultiArgSelector:
3666   case DeclarationName::CXXOperatorName:
3667   case DeclarationName::CXXLiteralOperatorName:
3668   case DeclarationName::CXXUsingDirective:
3669     return NameInfo;
3670 
3671   case DeclarationName::CXXDeductionGuideName: {
3672     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3673     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3674         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3675     if (!NewTemplate)
3676       return DeclarationNameInfo();
3677 
3678     DeclarationNameInfo NewNameInfo(NameInfo);
3679     NewNameInfo.setName(
3680         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3681     return NewNameInfo;
3682   }
3683 
3684   case DeclarationName::CXXConstructorName:
3685   case DeclarationName::CXXDestructorName:
3686   case DeclarationName::CXXConversionFunctionName: {
3687     TypeSourceInfo *NewTInfo;
3688     CanQualType NewCanTy;
3689     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3690       NewTInfo = getDerived().TransformType(OldTInfo);
3691       if (!NewTInfo)
3692         return DeclarationNameInfo();
3693       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3694     }
3695     else {
3696       NewTInfo = nullptr;
3697       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3698       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3699       if (NewT.isNull())
3700         return DeclarationNameInfo();
3701       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3702     }
3703 
3704     DeclarationName NewName
3705       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3706                                                            NewCanTy);
3707     DeclarationNameInfo NewNameInfo(NameInfo);
3708     NewNameInfo.setName(NewName);
3709     NewNameInfo.setNamedTypeInfo(NewTInfo);
3710     return NewNameInfo;
3711   }
3712   }
3713 
3714   llvm_unreachable("Unknown name kind.");
3715 }
3716 
3717 template<typename Derived>
3718 TemplateName
3719 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3720                                               TemplateName Name,
3721                                               SourceLocation NameLoc,
3722                                               QualType ObjectType,
3723                                               NamedDecl *FirstQualifierInScope,
3724                                               bool AllowInjectedClassName) {
3725   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3726     TemplateDecl *Template = QTN->getTemplateDecl();
3727     assert(Template && "qualified template name must refer to a template");
3728 
3729     TemplateDecl *TransTemplate
3730       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3731                                                               Template));
3732     if (!TransTemplate)
3733       return TemplateName();
3734 
3735     if (!getDerived().AlwaysRebuild() &&
3736         SS.getScopeRep() == QTN->getQualifier() &&
3737         TransTemplate == Template)
3738       return Name;
3739 
3740     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3741                                             TransTemplate);
3742   }
3743 
3744   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3745     if (SS.getScopeRep()) {
3746       // These apply to the scope specifier, not the template.
3747       ObjectType = QualType();
3748       FirstQualifierInScope = nullptr;
3749     }
3750 
3751     if (!getDerived().AlwaysRebuild() &&
3752         SS.getScopeRep() == DTN->getQualifier() &&
3753         ObjectType.isNull())
3754       return Name;
3755 
3756     if (DTN->isIdentifier()) {
3757       return getDerived().RebuildTemplateName(SS,
3758                                               *DTN->getIdentifier(),
3759                                               NameLoc,
3760                                               ObjectType,
3761                                               FirstQualifierInScope,
3762                                               AllowInjectedClassName);
3763     }
3764 
3765     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3766                                             ObjectType, AllowInjectedClassName);
3767   }
3768 
3769   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3770     TemplateDecl *TransTemplate
3771       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3772                                                               Template));
3773     if (!TransTemplate)
3774       return TemplateName();
3775 
3776     if (!getDerived().AlwaysRebuild() &&
3777         TransTemplate == Template)
3778       return Name;
3779 
3780     return TemplateName(TransTemplate);
3781   }
3782 
3783   if (SubstTemplateTemplateParmPackStorage *SubstPack
3784       = Name.getAsSubstTemplateTemplateParmPack()) {
3785     TemplateTemplateParmDecl *TransParam
3786     = cast_or_null<TemplateTemplateParmDecl>(
3787             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3788     if (!TransParam)
3789       return TemplateName();
3790 
3791     if (!getDerived().AlwaysRebuild() &&
3792         TransParam == SubstPack->getParameterPack())
3793       return Name;
3794 
3795     return getDerived().RebuildTemplateName(TransParam,
3796                                             SubstPack->getArgumentPack());
3797   }
3798 
3799   // These should be getting filtered out before they reach the AST.
3800   llvm_unreachable("overloaded function decl survived to here");
3801 }
3802 
3803 template<typename Derived>
3804 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3805                                          const TemplateArgument &Arg,
3806                                          TemplateArgumentLoc &Output) {
3807   SourceLocation Loc = getDerived().getBaseLocation();
3808   switch (Arg.getKind()) {
3809   case TemplateArgument::Null:
3810     llvm_unreachable("null template argument in TreeTransform");
3811     break;
3812 
3813   case TemplateArgument::Type:
3814     Output = TemplateArgumentLoc(Arg,
3815                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3816 
3817     break;
3818 
3819   case TemplateArgument::Template:
3820   case TemplateArgument::TemplateExpansion: {
3821     NestedNameSpecifierLocBuilder Builder;
3822     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3823     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3824       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3825     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3826       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3827 
3828     if (Arg.getKind() == TemplateArgument::Template)
3829       Output = TemplateArgumentLoc(Arg,
3830                                    Builder.getWithLocInContext(SemaRef.Context),
3831                                    Loc);
3832     else
3833       Output = TemplateArgumentLoc(Arg,
3834                                    Builder.getWithLocInContext(SemaRef.Context),
3835                                    Loc, Loc);
3836 
3837     break;
3838   }
3839 
3840   case TemplateArgument::Expression:
3841     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3842     break;
3843 
3844   case TemplateArgument::Declaration:
3845   case TemplateArgument::Integral:
3846   case TemplateArgument::Pack:
3847   case TemplateArgument::NullPtr:
3848     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3849     break;
3850   }
3851 }
3852 
3853 template<typename Derived>
3854 bool TreeTransform<Derived>::TransformTemplateArgument(
3855                                          const TemplateArgumentLoc &Input,
3856                                          TemplateArgumentLoc &Output, bool Uneval) {
3857   const TemplateArgument &Arg = Input.getArgument();
3858   switch (Arg.getKind()) {
3859   case TemplateArgument::Null:
3860   case TemplateArgument::Integral:
3861   case TemplateArgument::Pack:
3862   case TemplateArgument::Declaration:
3863   case TemplateArgument::NullPtr:
3864     llvm_unreachable("Unexpected TemplateArgument");
3865 
3866   case TemplateArgument::Type: {
3867     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3868     if (!DI)
3869       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3870 
3871     DI = getDerived().TransformType(DI);
3872     if (!DI) return true;
3873 
3874     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3875     return false;
3876   }
3877 
3878   case TemplateArgument::Template: {
3879     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3880     if (QualifierLoc) {
3881       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3882       if (!QualifierLoc)
3883         return true;
3884     }
3885 
3886     CXXScopeSpec SS;
3887     SS.Adopt(QualifierLoc);
3888     TemplateName Template
3889       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3890                                            Input.getTemplateNameLoc());
3891     if (Template.isNull())
3892       return true;
3893 
3894     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3895                                  Input.getTemplateNameLoc());
3896     return false;
3897   }
3898 
3899   case TemplateArgument::TemplateExpansion:
3900     llvm_unreachable("Caller should expand pack expansions");
3901 
3902   case TemplateArgument::Expression: {
3903     // Template argument expressions are constant expressions.
3904     EnterExpressionEvaluationContext Unevaluated(
3905         getSema(), Uneval
3906                        ? Sema::ExpressionEvaluationContext::Unevaluated
3907                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
3908 
3909     Expr *InputExpr = Input.getSourceExpression();
3910     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3911 
3912     ExprResult E = getDerived().TransformExpr(InputExpr);
3913     E = SemaRef.ActOnConstantExpression(E);
3914     if (E.isInvalid()) return true;
3915     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3916     return false;
3917   }
3918   }
3919 
3920   // Work around bogus GCC warning
3921   return true;
3922 }
3923 
3924 /// \brief Iterator adaptor that invents template argument location information
3925 /// for each of the template arguments in its underlying iterator.
3926 template<typename Derived, typename InputIterator>
3927 class TemplateArgumentLocInventIterator {
3928   TreeTransform<Derived> &Self;
3929   InputIterator Iter;
3930 
3931 public:
3932   typedef TemplateArgumentLoc value_type;
3933   typedef TemplateArgumentLoc reference;
3934   typedef typename std::iterator_traits<InputIterator>::difference_type
3935     difference_type;
3936   typedef std::input_iterator_tag iterator_category;
3937 
3938   class pointer {
3939     TemplateArgumentLoc Arg;
3940 
3941   public:
3942     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3943 
3944     const TemplateArgumentLoc *operator->() const { return &Arg; }
3945   };
3946 
3947   TemplateArgumentLocInventIterator() { }
3948 
3949   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3950                                              InputIterator Iter)
3951     : Self(Self), Iter(Iter) { }
3952 
3953   TemplateArgumentLocInventIterator &operator++() {
3954     ++Iter;
3955     return *this;
3956   }
3957 
3958   TemplateArgumentLocInventIterator operator++(int) {
3959     TemplateArgumentLocInventIterator Old(*this);
3960     ++(*this);
3961     return Old;
3962   }
3963 
3964   reference operator*() const {
3965     TemplateArgumentLoc Result;
3966     Self.InventTemplateArgumentLoc(*Iter, Result);
3967     return Result;
3968   }
3969 
3970   pointer operator->() const { return pointer(**this); }
3971 
3972   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3973                          const TemplateArgumentLocInventIterator &Y) {
3974     return X.Iter == Y.Iter;
3975   }
3976 
3977   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3978                          const TemplateArgumentLocInventIterator &Y) {
3979     return X.Iter != Y.Iter;
3980   }
3981 };
3982 
3983 template<typename Derived>
3984 template<typename InputIterator>
3985 bool TreeTransform<Derived>::TransformTemplateArguments(
3986     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
3987     bool Uneval) {
3988   for (; First != Last; ++First) {
3989     TemplateArgumentLoc Out;
3990     TemplateArgumentLoc In = *First;
3991 
3992     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3993       // Unpack argument packs, which we translate them into separate
3994       // arguments.
3995       // FIXME: We could do much better if we could guarantee that the
3996       // TemplateArgumentLocInfo for the pack expansion would be usable for
3997       // all of the template arguments in the argument pack.
3998       typedef TemplateArgumentLocInventIterator<Derived,
3999                                                 TemplateArgument::pack_iterator>
4000         PackLocIterator;
4001       if (TransformTemplateArguments(PackLocIterator(*this,
4002                                                  In.getArgument().pack_begin()),
4003                                      PackLocIterator(*this,
4004                                                    In.getArgument().pack_end()),
4005                                      Outputs, Uneval))
4006         return true;
4007 
4008       continue;
4009     }
4010 
4011     if (In.getArgument().isPackExpansion()) {
4012       // We have a pack expansion, for which we will be substituting into
4013       // the pattern.
4014       SourceLocation Ellipsis;
4015       Optional<unsigned> OrigNumExpansions;
4016       TemplateArgumentLoc Pattern
4017         = getSema().getTemplateArgumentPackExpansionPattern(
4018               In, Ellipsis, OrigNumExpansions);
4019 
4020       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4021       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4022       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4023 
4024       // Determine whether the set of unexpanded parameter packs can and should
4025       // be expanded.
4026       bool Expand = true;
4027       bool RetainExpansion = false;
4028       Optional<unsigned> NumExpansions = OrigNumExpansions;
4029       if (getDerived().TryExpandParameterPacks(Ellipsis,
4030                                                Pattern.getSourceRange(),
4031                                                Unexpanded,
4032                                                Expand,
4033                                                RetainExpansion,
4034                                                NumExpansions))
4035         return true;
4036 
4037       if (!Expand) {
4038         // The transform has determined that we should perform a simple
4039         // transformation on the pack expansion, producing another pack
4040         // expansion.
4041         TemplateArgumentLoc OutPattern;
4042         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4043         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4044           return true;
4045 
4046         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4047                                                 NumExpansions);
4048         if (Out.getArgument().isNull())
4049           return true;
4050 
4051         Outputs.addArgument(Out);
4052         continue;
4053       }
4054 
4055       // The transform has determined that we should perform an elementwise
4056       // expansion of the pattern. Do so.
4057       for (unsigned I = 0; I != *NumExpansions; ++I) {
4058         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4059 
4060         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4061           return true;
4062 
4063         if (Out.getArgument().containsUnexpandedParameterPack()) {
4064           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4065                                                   OrigNumExpansions);
4066           if (Out.getArgument().isNull())
4067             return true;
4068         }
4069 
4070         Outputs.addArgument(Out);
4071       }
4072 
4073       // If we're supposed to retain a pack expansion, do so by temporarily
4074       // forgetting the partially-substituted parameter pack.
4075       if (RetainExpansion) {
4076         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4077 
4078         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4079           return true;
4080 
4081         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4082                                                 OrigNumExpansions);
4083         if (Out.getArgument().isNull())
4084           return true;
4085 
4086         Outputs.addArgument(Out);
4087       }
4088 
4089       continue;
4090     }
4091 
4092     // The simple case:
4093     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4094       return true;
4095 
4096     Outputs.addArgument(Out);
4097   }
4098 
4099   return false;
4100 
4101 }
4102 
4103 //===----------------------------------------------------------------------===//
4104 // Type transformation
4105 //===----------------------------------------------------------------------===//
4106 
4107 template<typename Derived>
4108 QualType TreeTransform<Derived>::TransformType(QualType T) {
4109   if (getDerived().AlreadyTransformed(T))
4110     return T;
4111 
4112   // Temporary workaround.  All of these transformations should
4113   // eventually turn into transformations on TypeLocs.
4114   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4115                                                 getDerived().getBaseLocation());
4116 
4117   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4118 
4119   if (!NewDI)
4120     return QualType();
4121 
4122   return NewDI->getType();
4123 }
4124 
4125 template<typename Derived>
4126 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4127   // Refine the base location to the type's location.
4128   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4129                        getDerived().getBaseEntity());
4130   if (getDerived().AlreadyTransformed(DI->getType()))
4131     return DI;
4132 
4133   TypeLocBuilder TLB;
4134 
4135   TypeLoc TL = DI->getTypeLoc();
4136   TLB.reserve(TL.getFullDataSize());
4137 
4138   QualType Result = getDerived().TransformType(TLB, TL);
4139   if (Result.isNull())
4140     return nullptr;
4141 
4142   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4143 }
4144 
4145 template<typename Derived>
4146 QualType
4147 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4148   switch (T.getTypeLocClass()) {
4149 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4150 #define TYPELOC(CLASS, PARENT)                                                 \
4151   case TypeLoc::CLASS:                                                         \
4152     return getDerived().Transform##CLASS##Type(TLB,                            \
4153                                                T.castAs<CLASS##TypeLoc>());
4154 #include "clang/AST/TypeLocNodes.def"
4155   }
4156 
4157   llvm_unreachable("unhandled type loc!");
4158 }
4159 
4160 template<typename Derived>
4161 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4162   if (!isa<DependentNameType>(T))
4163     return TransformType(T);
4164 
4165   if (getDerived().AlreadyTransformed(T))
4166     return T;
4167   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4168                                                 getDerived().getBaseLocation());
4169   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4170   return NewDI ? NewDI->getType() : QualType();
4171 }
4172 
4173 template<typename Derived>
4174 TypeSourceInfo *
4175 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4176   if (!isa<DependentNameType>(DI->getType()))
4177     return TransformType(DI);
4178 
4179   // Refine the base location to the type's location.
4180   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4181                        getDerived().getBaseEntity());
4182   if (getDerived().AlreadyTransformed(DI->getType()))
4183     return DI;
4184 
4185   TypeLocBuilder TLB;
4186 
4187   TypeLoc TL = DI->getTypeLoc();
4188   TLB.reserve(TL.getFullDataSize());
4189 
4190   Qualifiers Quals;
4191   auto QTL = TL.getAs<QualifiedTypeLoc>();
4192   if (QTL)
4193     TL = QTL.getUnqualifiedLoc();
4194 
4195   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4196 
4197   QualType Result = getDerived().TransformDependentNameType(
4198       TLB, DNTL, /*DeducedTSTContext*/true);
4199   if (Result.isNull())
4200     return nullptr;
4201 
4202   if (QTL) {
4203     Result = getDerived().RebuildQualifiedType(
4204         Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers());
4205     TLB.TypeWasModifiedSafely(Result);
4206   }
4207 
4208   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4209 }
4210 
4211 template<typename Derived>
4212 QualType
4213 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4214                                                QualifiedTypeLoc T) {
4215   Qualifiers Quals = T.getType().getLocalQualifiers();
4216 
4217   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4218   if (Result.isNull())
4219     return QualType();
4220 
4221   Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals);
4222 
4223   // RebuildQualifiedType might have updated the type, but not in a way
4224   // that invalidates the TypeLoc. (There's no location information for
4225   // qualifiers.)
4226   TLB.TypeWasModifiedSafely(Result);
4227 
4228   return Result;
4229 }
4230 
4231 template<typename Derived>
4232 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4233                                                       SourceLocation Loc,
4234                                                       Qualifiers Quals) {
4235   // C++ [dcl.fct]p7:
4236   //   [When] adding cv-qualifications on top of the function type [...] the
4237   //   cv-qualifiers are ignored.
4238   // C++ [dcl.ref]p1:
4239   //   when the cv-qualifiers are introduced through the use of a typedef-name
4240   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4241   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4242   // applied to a reference type.
4243   // FIXME: This removes all qualifiers, not just cv-qualifiers!
4244   if (T->isFunctionType() || T->isReferenceType())
4245     return T;
4246 
4247   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4248   // resulting type.
4249   if (Quals.hasObjCLifetime()) {
4250     if (!T->isObjCLifetimeType() && !T->isDependentType())
4251       Quals.removeObjCLifetime();
4252     else if (T.getObjCLifetime()) {
4253       // Objective-C ARC:
4254       //   A lifetime qualifier applied to a substituted template parameter
4255       //   overrides the lifetime qualifier from the template argument.
4256       const AutoType *AutoTy;
4257       if (const SubstTemplateTypeParmType *SubstTypeParam
4258                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4259         QualType Replacement = SubstTypeParam->getReplacementType();
4260         Qualifiers Qs = Replacement.getQualifiers();
4261         Qs.removeObjCLifetime();
4262         Replacement = SemaRef.Context.getQualifiedType(
4263             Replacement.getUnqualifiedType(), Qs);
4264         T = SemaRef.Context.getSubstTemplateTypeParmType(
4265             SubstTypeParam->getReplacedParameter(), Replacement);
4266       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4267         // 'auto' types behave the same way as template parameters.
4268         QualType Deduced = AutoTy->getDeducedType();
4269         Qualifiers Qs = Deduced.getQualifiers();
4270         Qs.removeObjCLifetime();
4271         Deduced =
4272             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4273         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4274                                         AutoTy->isDependentType());
4275       } else {
4276         // Otherwise, complain about the addition of a qualifier to an
4277         // already-qualified type.
4278         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4279         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4280         Quals.removeObjCLifetime();
4281       }
4282     }
4283   }
4284 
4285   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4286 }
4287 
4288 template<typename Derived>
4289 TypeLoc
4290 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4291                                                    QualType ObjectType,
4292                                                    NamedDecl *UnqualLookup,
4293                                                    CXXScopeSpec &SS) {
4294   if (getDerived().AlreadyTransformed(TL.getType()))
4295     return TL;
4296 
4297   TypeSourceInfo *TSI =
4298       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4299   if (TSI)
4300     return TSI->getTypeLoc();
4301   return TypeLoc();
4302 }
4303 
4304 template<typename Derived>
4305 TypeSourceInfo *
4306 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4307                                                    QualType ObjectType,
4308                                                    NamedDecl *UnqualLookup,
4309                                                    CXXScopeSpec &SS) {
4310   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4311     return TSInfo;
4312 
4313   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4314                                    UnqualLookup, SS);
4315 }
4316 
4317 template <typename Derived>
4318 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4319     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4320     CXXScopeSpec &SS) {
4321   QualType T = TL.getType();
4322   assert(!getDerived().AlreadyTransformed(T));
4323 
4324   TypeLocBuilder TLB;
4325   QualType Result;
4326 
4327   if (isa<TemplateSpecializationType>(T)) {
4328     TemplateSpecializationTypeLoc SpecTL =
4329         TL.castAs<TemplateSpecializationTypeLoc>();
4330 
4331     TemplateName Template = getDerived().TransformTemplateName(
4332         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4333         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4334     if (Template.isNull())
4335       return nullptr;
4336 
4337     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4338                                                               Template);
4339   } else if (isa<DependentTemplateSpecializationType>(T)) {
4340     DependentTemplateSpecializationTypeLoc SpecTL =
4341         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4342 
4343     TemplateName Template
4344       = getDerived().RebuildTemplateName(SS,
4345                                          *SpecTL.getTypePtr()->getIdentifier(),
4346                                          SpecTL.getTemplateNameLoc(),
4347                                          ObjectType, UnqualLookup,
4348                                          /*AllowInjectedClassName*/true);
4349     if (Template.isNull())
4350       return nullptr;
4351 
4352     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4353                                                                        SpecTL,
4354                                                                        Template,
4355                                                                        SS);
4356   } else {
4357     // Nothing special needs to be done for these.
4358     Result = getDerived().TransformType(TLB, TL);
4359   }
4360 
4361   if (Result.isNull())
4362     return nullptr;
4363 
4364   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4365 }
4366 
4367 template <class TyLoc> static inline
4368 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4369   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4370   NewT.setNameLoc(T.getNameLoc());
4371   return T.getType();
4372 }
4373 
4374 template<typename Derived>
4375 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4376                                                       BuiltinTypeLoc T) {
4377   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4378   NewT.setBuiltinLoc(T.getBuiltinLoc());
4379   if (T.needsExtraLocalData())
4380     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4381   return T.getType();
4382 }
4383 
4384 template<typename Derived>
4385 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4386                                                       ComplexTypeLoc T) {
4387   // FIXME: recurse?
4388   return TransformTypeSpecType(TLB, T);
4389 }
4390 
4391 template <typename Derived>
4392 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4393                                                        AdjustedTypeLoc TL) {
4394   // Adjustments applied during transformation are handled elsewhere.
4395   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4396 }
4397 
4398 template<typename Derived>
4399 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4400                                                       DecayedTypeLoc TL) {
4401   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4402   if (OriginalType.isNull())
4403     return QualType();
4404 
4405   QualType Result = TL.getType();
4406   if (getDerived().AlwaysRebuild() ||
4407       OriginalType != TL.getOriginalLoc().getType())
4408     Result = SemaRef.Context.getDecayedType(OriginalType);
4409   TLB.push<DecayedTypeLoc>(Result);
4410   // Nothing to set for DecayedTypeLoc.
4411   return Result;
4412 }
4413 
4414 template<typename Derived>
4415 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4416                                                       PointerTypeLoc TL) {
4417   QualType PointeeType
4418     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4419   if (PointeeType.isNull())
4420     return QualType();
4421 
4422   QualType Result = TL.getType();
4423   if (PointeeType->getAs<ObjCObjectType>()) {
4424     // A dependent pointer type 'T *' has is being transformed such
4425     // that an Objective-C class type is being replaced for 'T'. The
4426     // resulting pointer type is an ObjCObjectPointerType, not a
4427     // PointerType.
4428     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4429 
4430     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4431     NewT.setStarLoc(TL.getStarLoc());
4432     return Result;
4433   }
4434 
4435   if (getDerived().AlwaysRebuild() ||
4436       PointeeType != TL.getPointeeLoc().getType()) {
4437     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4438     if (Result.isNull())
4439       return QualType();
4440   }
4441 
4442   // Objective-C ARC can add lifetime qualifiers to the type that we're
4443   // pointing to.
4444   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4445 
4446   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4447   NewT.setSigilLoc(TL.getSigilLoc());
4448   return Result;
4449 }
4450 
4451 template<typename Derived>
4452 QualType
4453 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4454                                                   BlockPointerTypeLoc TL) {
4455   QualType PointeeType
4456     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4457   if (PointeeType.isNull())
4458     return QualType();
4459 
4460   QualType Result = TL.getType();
4461   if (getDerived().AlwaysRebuild() ||
4462       PointeeType != TL.getPointeeLoc().getType()) {
4463     Result = getDerived().RebuildBlockPointerType(PointeeType,
4464                                                   TL.getSigilLoc());
4465     if (Result.isNull())
4466       return QualType();
4467   }
4468 
4469   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4470   NewT.setSigilLoc(TL.getSigilLoc());
4471   return Result;
4472 }
4473 
4474 /// Transforms a reference type.  Note that somewhat paradoxically we
4475 /// don't care whether the type itself is an l-value type or an r-value
4476 /// type;  we only care if the type was *written* as an l-value type
4477 /// or an r-value type.
4478 template<typename Derived>
4479 QualType
4480 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4481                                                ReferenceTypeLoc TL) {
4482   const ReferenceType *T = TL.getTypePtr();
4483 
4484   // Note that this works with the pointee-as-written.
4485   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4486   if (PointeeType.isNull())
4487     return QualType();
4488 
4489   QualType Result = TL.getType();
4490   if (getDerived().AlwaysRebuild() ||
4491       PointeeType != T->getPointeeTypeAsWritten()) {
4492     Result = getDerived().RebuildReferenceType(PointeeType,
4493                                                T->isSpelledAsLValue(),
4494                                                TL.getSigilLoc());
4495     if (Result.isNull())
4496       return QualType();
4497   }
4498 
4499   // Objective-C ARC can add lifetime qualifiers to the type that we're
4500   // referring to.
4501   TLB.TypeWasModifiedSafely(
4502                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4503 
4504   // r-value references can be rebuilt as l-value references.
4505   ReferenceTypeLoc NewTL;
4506   if (isa<LValueReferenceType>(Result))
4507     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4508   else
4509     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4510   NewTL.setSigilLoc(TL.getSigilLoc());
4511 
4512   return Result;
4513 }
4514 
4515 template<typename Derived>
4516 QualType
4517 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4518                                                  LValueReferenceTypeLoc TL) {
4519   return TransformReferenceType(TLB, TL);
4520 }
4521 
4522 template<typename Derived>
4523 QualType
4524 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4525                                                  RValueReferenceTypeLoc TL) {
4526   return TransformReferenceType(TLB, TL);
4527 }
4528 
4529 template<typename Derived>
4530 QualType
4531 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4532                                                    MemberPointerTypeLoc TL) {
4533   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4534   if (PointeeType.isNull())
4535     return QualType();
4536 
4537   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4538   TypeSourceInfo *NewClsTInfo = nullptr;
4539   if (OldClsTInfo) {
4540     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4541     if (!NewClsTInfo)
4542       return QualType();
4543   }
4544 
4545   const MemberPointerType *T = TL.getTypePtr();
4546   QualType OldClsType = QualType(T->getClass(), 0);
4547   QualType NewClsType;
4548   if (NewClsTInfo)
4549     NewClsType = NewClsTInfo->getType();
4550   else {
4551     NewClsType = getDerived().TransformType(OldClsType);
4552     if (NewClsType.isNull())
4553       return QualType();
4554   }
4555 
4556   QualType Result = TL.getType();
4557   if (getDerived().AlwaysRebuild() ||
4558       PointeeType != T->getPointeeType() ||
4559       NewClsType != OldClsType) {
4560     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4561                                                    TL.getStarLoc());
4562     if (Result.isNull())
4563       return QualType();
4564   }
4565 
4566   // If we had to adjust the pointee type when building a member pointer, make
4567   // sure to push TypeLoc info for it.
4568   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4569   if (MPT && PointeeType != MPT->getPointeeType()) {
4570     assert(isa<AdjustedType>(MPT->getPointeeType()));
4571     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4572   }
4573 
4574   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4575   NewTL.setSigilLoc(TL.getSigilLoc());
4576   NewTL.setClassTInfo(NewClsTInfo);
4577 
4578   return Result;
4579 }
4580 
4581 template<typename Derived>
4582 QualType
4583 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4584                                                    ConstantArrayTypeLoc TL) {
4585   const ConstantArrayType *T = TL.getTypePtr();
4586   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4587   if (ElementType.isNull())
4588     return QualType();
4589 
4590   QualType Result = TL.getType();
4591   if (getDerived().AlwaysRebuild() ||
4592       ElementType != T->getElementType()) {
4593     Result = getDerived().RebuildConstantArrayType(ElementType,
4594                                                    T->getSizeModifier(),
4595                                                    T->getSize(),
4596                                              T->getIndexTypeCVRQualifiers(),
4597                                                    TL.getBracketsRange());
4598     if (Result.isNull())
4599       return QualType();
4600   }
4601 
4602   // We might have either a ConstantArrayType or a VariableArrayType now:
4603   // a ConstantArrayType is allowed to have an element type which is a
4604   // VariableArrayType if the type is dependent.  Fortunately, all array
4605   // types have the same location layout.
4606   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4607   NewTL.setLBracketLoc(TL.getLBracketLoc());
4608   NewTL.setRBracketLoc(TL.getRBracketLoc());
4609 
4610   Expr *Size = TL.getSizeExpr();
4611   if (Size) {
4612     EnterExpressionEvaluationContext Unevaluated(
4613         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4614     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4615     Size = SemaRef.ActOnConstantExpression(Size).get();
4616   }
4617   NewTL.setSizeExpr(Size);
4618 
4619   return Result;
4620 }
4621 
4622 template<typename Derived>
4623 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4624                                               TypeLocBuilder &TLB,
4625                                               IncompleteArrayTypeLoc TL) {
4626   const IncompleteArrayType *T = TL.getTypePtr();
4627   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4628   if (ElementType.isNull())
4629     return QualType();
4630 
4631   QualType Result = TL.getType();
4632   if (getDerived().AlwaysRebuild() ||
4633       ElementType != T->getElementType()) {
4634     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4635                                                      T->getSizeModifier(),
4636                                            T->getIndexTypeCVRQualifiers(),
4637                                                      TL.getBracketsRange());
4638     if (Result.isNull())
4639       return QualType();
4640   }
4641 
4642   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4643   NewTL.setLBracketLoc(TL.getLBracketLoc());
4644   NewTL.setRBracketLoc(TL.getRBracketLoc());
4645   NewTL.setSizeExpr(nullptr);
4646 
4647   return Result;
4648 }
4649 
4650 template<typename Derived>
4651 QualType
4652 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4653                                                    VariableArrayTypeLoc TL) {
4654   const VariableArrayType *T = TL.getTypePtr();
4655   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4656   if (ElementType.isNull())
4657     return QualType();
4658 
4659   ExprResult SizeResult;
4660   {
4661     EnterExpressionEvaluationContext Context(
4662         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4663     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4664   }
4665   if (SizeResult.isInvalid())
4666     return QualType();
4667   SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get());
4668   if (SizeResult.isInvalid())
4669     return QualType();
4670 
4671   Expr *Size = SizeResult.get();
4672 
4673   QualType Result = TL.getType();
4674   if (getDerived().AlwaysRebuild() ||
4675       ElementType != T->getElementType() ||
4676       Size != T->getSizeExpr()) {
4677     Result = getDerived().RebuildVariableArrayType(ElementType,
4678                                                    T->getSizeModifier(),
4679                                                    Size,
4680                                              T->getIndexTypeCVRQualifiers(),
4681                                                    TL.getBracketsRange());
4682     if (Result.isNull())
4683       return QualType();
4684   }
4685 
4686   // We might have constant size array now, but fortunately it has the same
4687   // location layout.
4688   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4689   NewTL.setLBracketLoc(TL.getLBracketLoc());
4690   NewTL.setRBracketLoc(TL.getRBracketLoc());
4691   NewTL.setSizeExpr(Size);
4692 
4693   return Result;
4694 }
4695 
4696 template<typename Derived>
4697 QualType
4698 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4699                                              DependentSizedArrayTypeLoc TL) {
4700   const DependentSizedArrayType *T = TL.getTypePtr();
4701   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4702   if (ElementType.isNull())
4703     return QualType();
4704 
4705   // Array bounds are constant expressions.
4706   EnterExpressionEvaluationContext Unevaluated(
4707       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4708 
4709   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4710   Expr *origSize = TL.getSizeExpr();
4711   if (!origSize) origSize = T->getSizeExpr();
4712 
4713   ExprResult sizeResult
4714     = getDerived().TransformExpr(origSize);
4715   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4716   if (sizeResult.isInvalid())
4717     return QualType();
4718 
4719   Expr *size = sizeResult.get();
4720 
4721   QualType Result = TL.getType();
4722   if (getDerived().AlwaysRebuild() ||
4723       ElementType != T->getElementType() ||
4724       size != origSize) {
4725     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4726                                                          T->getSizeModifier(),
4727                                                          size,
4728                                                 T->getIndexTypeCVRQualifiers(),
4729                                                         TL.getBracketsRange());
4730     if (Result.isNull())
4731       return QualType();
4732   }
4733 
4734   // We might have any sort of array type now, but fortunately they
4735   // all have the same location layout.
4736   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4737   NewTL.setLBracketLoc(TL.getLBracketLoc());
4738   NewTL.setRBracketLoc(TL.getRBracketLoc());
4739   NewTL.setSizeExpr(size);
4740 
4741   return Result;
4742 }
4743 
4744 template<typename Derived>
4745 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4746                                       TypeLocBuilder &TLB,
4747                                       DependentSizedExtVectorTypeLoc TL) {
4748   const DependentSizedExtVectorType *T = TL.getTypePtr();
4749 
4750   // FIXME: ext vector locs should be nested
4751   QualType ElementType = getDerived().TransformType(T->getElementType());
4752   if (ElementType.isNull())
4753     return QualType();
4754 
4755   // Vector sizes are constant expressions.
4756   EnterExpressionEvaluationContext Unevaluated(
4757       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4758 
4759   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4760   Size = SemaRef.ActOnConstantExpression(Size);
4761   if (Size.isInvalid())
4762     return QualType();
4763 
4764   QualType Result = TL.getType();
4765   if (getDerived().AlwaysRebuild() ||
4766       ElementType != T->getElementType() ||
4767       Size.get() != T->getSizeExpr()) {
4768     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4769                                                              Size.get(),
4770                                                          T->getAttributeLoc());
4771     if (Result.isNull())
4772       return QualType();
4773   }
4774 
4775   // Result might be dependent or not.
4776   if (isa<DependentSizedExtVectorType>(Result)) {
4777     DependentSizedExtVectorTypeLoc NewTL
4778       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4779     NewTL.setNameLoc(TL.getNameLoc());
4780   } else {
4781     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4782     NewTL.setNameLoc(TL.getNameLoc());
4783   }
4784 
4785   return Result;
4786 }
4787 
4788 template<typename Derived>
4789 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4790                                                      VectorTypeLoc TL) {
4791   const VectorType *T = TL.getTypePtr();
4792   QualType ElementType = getDerived().TransformType(T->getElementType());
4793   if (ElementType.isNull())
4794     return QualType();
4795 
4796   QualType Result = TL.getType();
4797   if (getDerived().AlwaysRebuild() ||
4798       ElementType != T->getElementType()) {
4799     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4800                                             T->getVectorKind());
4801     if (Result.isNull())
4802       return QualType();
4803   }
4804 
4805   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4806   NewTL.setNameLoc(TL.getNameLoc());
4807 
4808   return Result;
4809 }
4810 
4811 template<typename Derived>
4812 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4813                                                         ExtVectorTypeLoc TL) {
4814   const VectorType *T = TL.getTypePtr();
4815   QualType ElementType = getDerived().TransformType(T->getElementType());
4816   if (ElementType.isNull())
4817     return QualType();
4818 
4819   QualType Result = TL.getType();
4820   if (getDerived().AlwaysRebuild() ||
4821       ElementType != T->getElementType()) {
4822     Result = getDerived().RebuildExtVectorType(ElementType,
4823                                                T->getNumElements(),
4824                                                /*FIXME*/ SourceLocation());
4825     if (Result.isNull())
4826       return QualType();
4827   }
4828 
4829   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4830   NewTL.setNameLoc(TL.getNameLoc());
4831 
4832   return Result;
4833 }
4834 
4835 template <typename Derived>
4836 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4837     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4838     bool ExpectParameterPack) {
4839   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4840   TypeSourceInfo *NewDI = nullptr;
4841 
4842   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4843     // If we're substituting into a pack expansion type and we know the
4844     // length we want to expand to, just substitute for the pattern.
4845     TypeLoc OldTL = OldDI->getTypeLoc();
4846     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4847 
4848     TypeLocBuilder TLB;
4849     TypeLoc NewTL = OldDI->getTypeLoc();
4850     TLB.reserve(NewTL.getFullDataSize());
4851 
4852     QualType Result = getDerived().TransformType(TLB,
4853                                                OldExpansionTL.getPatternLoc());
4854     if (Result.isNull())
4855       return nullptr;
4856 
4857     Result = RebuildPackExpansionType(Result,
4858                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4859                                       OldExpansionTL.getEllipsisLoc(),
4860                                       NumExpansions);
4861     if (Result.isNull())
4862       return nullptr;
4863 
4864     PackExpansionTypeLoc NewExpansionTL
4865       = TLB.push<PackExpansionTypeLoc>(Result);
4866     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4867     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4868   } else
4869     NewDI = getDerived().TransformType(OldDI);
4870   if (!NewDI)
4871     return nullptr;
4872 
4873   if (NewDI == OldDI && indexAdjustment == 0)
4874     return OldParm;
4875 
4876   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4877                                              OldParm->getDeclContext(),
4878                                              OldParm->getInnerLocStart(),
4879                                              OldParm->getLocation(),
4880                                              OldParm->getIdentifier(),
4881                                              NewDI->getType(),
4882                                              NewDI,
4883                                              OldParm->getStorageClass(),
4884                                              /* DefArg */ nullptr);
4885   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4886                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4887   return newParm;
4888 }
4889 
4890 template <typename Derived>
4891 bool TreeTransform<Derived>::TransformFunctionTypeParams(
4892     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4893     const QualType *ParamTypes,
4894     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4895     SmallVectorImpl<QualType> &OutParamTypes,
4896     SmallVectorImpl<ParmVarDecl *> *PVars,
4897     Sema::ExtParameterInfoBuilder &PInfos) {
4898   int indexAdjustment = 0;
4899 
4900   unsigned NumParams = Params.size();
4901   for (unsigned i = 0; i != NumParams; ++i) {
4902     if (ParmVarDecl *OldParm = Params[i]) {
4903       assert(OldParm->getFunctionScopeIndex() == i);
4904 
4905       Optional<unsigned> NumExpansions;
4906       ParmVarDecl *NewParm = nullptr;
4907       if (OldParm->isParameterPack()) {
4908         // We have a function parameter pack that may need to be expanded.
4909         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4910 
4911         // Find the parameter packs that could be expanded.
4912         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4913         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4914         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4915         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4916         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4917 
4918         // Determine whether we should expand the parameter packs.
4919         bool ShouldExpand = false;
4920         bool RetainExpansion = false;
4921         Optional<unsigned> OrigNumExpansions =
4922             ExpansionTL.getTypePtr()->getNumExpansions();
4923         NumExpansions = OrigNumExpansions;
4924         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4925                                                  Pattern.getSourceRange(),
4926                                                  Unexpanded,
4927                                                  ShouldExpand,
4928                                                  RetainExpansion,
4929                                                  NumExpansions)) {
4930           return true;
4931         }
4932 
4933         if (ShouldExpand) {
4934           // Expand the function parameter pack into multiple, separate
4935           // parameters.
4936           getDerived().ExpandingFunctionParameterPack(OldParm);
4937           for (unsigned I = 0; I != *NumExpansions; ++I) {
4938             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4939             ParmVarDecl *NewParm
4940               = getDerived().TransformFunctionTypeParam(OldParm,
4941                                                         indexAdjustment++,
4942                                                         OrigNumExpansions,
4943                                                 /*ExpectParameterPack=*/false);
4944             if (!NewParm)
4945               return true;
4946 
4947             if (ParamInfos)
4948               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4949             OutParamTypes.push_back(NewParm->getType());
4950             if (PVars)
4951               PVars->push_back(NewParm);
4952           }
4953 
4954           // If we're supposed to retain a pack expansion, do so by temporarily
4955           // forgetting the partially-substituted parameter pack.
4956           if (RetainExpansion) {
4957             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4958             ParmVarDecl *NewParm
4959               = getDerived().TransformFunctionTypeParam(OldParm,
4960                                                         indexAdjustment++,
4961                                                         OrigNumExpansions,
4962                                                 /*ExpectParameterPack=*/false);
4963             if (!NewParm)
4964               return true;
4965 
4966             if (ParamInfos)
4967               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4968             OutParamTypes.push_back(NewParm->getType());
4969             if (PVars)
4970               PVars->push_back(NewParm);
4971           }
4972 
4973           // The next parameter should have the same adjustment as the
4974           // last thing we pushed, but we post-incremented indexAdjustment
4975           // on every push.  Also, if we push nothing, the adjustment should
4976           // go down by one.
4977           indexAdjustment--;
4978 
4979           // We're done with the pack expansion.
4980           continue;
4981         }
4982 
4983         // We'll substitute the parameter now without expanding the pack
4984         // expansion.
4985         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4986         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4987                                                           indexAdjustment,
4988                                                           NumExpansions,
4989                                                   /*ExpectParameterPack=*/true);
4990       } else {
4991         NewParm = getDerived().TransformFunctionTypeParam(
4992             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4993       }
4994 
4995       if (!NewParm)
4996         return true;
4997 
4998       if (ParamInfos)
4999         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5000       OutParamTypes.push_back(NewParm->getType());
5001       if (PVars)
5002         PVars->push_back(NewParm);
5003       continue;
5004     }
5005 
5006     // Deal with the possibility that we don't have a parameter
5007     // declaration for this parameter.
5008     QualType OldType = ParamTypes[i];
5009     bool IsPackExpansion = false;
5010     Optional<unsigned> NumExpansions;
5011     QualType NewType;
5012     if (const PackExpansionType *Expansion
5013                                        = dyn_cast<PackExpansionType>(OldType)) {
5014       // We have a function parameter pack that may need to be expanded.
5015       QualType Pattern = Expansion->getPattern();
5016       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5017       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5018 
5019       // Determine whether we should expand the parameter packs.
5020       bool ShouldExpand = false;
5021       bool RetainExpansion = false;
5022       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5023                                                Unexpanded,
5024                                                ShouldExpand,
5025                                                RetainExpansion,
5026                                                NumExpansions)) {
5027         return true;
5028       }
5029 
5030       if (ShouldExpand) {
5031         // Expand the function parameter pack into multiple, separate
5032         // parameters.
5033         for (unsigned I = 0; I != *NumExpansions; ++I) {
5034           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5035           QualType NewType = getDerived().TransformType(Pattern);
5036           if (NewType.isNull())
5037             return true;
5038 
5039           if (NewType->containsUnexpandedParameterPack()) {
5040             NewType =
5041                 getSema().getASTContext().getPackExpansionType(NewType, None);
5042 
5043             if (NewType.isNull())
5044               return true;
5045           }
5046 
5047           if (ParamInfos)
5048             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5049           OutParamTypes.push_back(NewType);
5050           if (PVars)
5051             PVars->push_back(nullptr);
5052         }
5053 
5054         // We're done with the pack expansion.
5055         continue;
5056       }
5057 
5058       // If we're supposed to retain a pack expansion, do so by temporarily
5059       // forgetting the partially-substituted parameter pack.
5060       if (RetainExpansion) {
5061         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5062         QualType NewType = getDerived().TransformType(Pattern);
5063         if (NewType.isNull())
5064           return true;
5065 
5066         if (ParamInfos)
5067           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5068         OutParamTypes.push_back(NewType);
5069         if (PVars)
5070           PVars->push_back(nullptr);
5071       }
5072 
5073       // We'll substitute the parameter now without expanding the pack
5074       // expansion.
5075       OldType = Expansion->getPattern();
5076       IsPackExpansion = true;
5077       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5078       NewType = getDerived().TransformType(OldType);
5079     } else {
5080       NewType = getDerived().TransformType(OldType);
5081     }
5082 
5083     if (NewType.isNull())
5084       return true;
5085 
5086     if (IsPackExpansion)
5087       NewType = getSema().Context.getPackExpansionType(NewType,
5088                                                        NumExpansions);
5089 
5090     if (ParamInfos)
5091       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5092     OutParamTypes.push_back(NewType);
5093     if (PVars)
5094       PVars->push_back(nullptr);
5095   }
5096 
5097 #ifndef NDEBUG
5098   if (PVars) {
5099     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5100       if (ParmVarDecl *parm = (*PVars)[i])
5101         assert(parm->getFunctionScopeIndex() == i);
5102   }
5103 #endif
5104 
5105   return false;
5106 }
5107 
5108 template<typename Derived>
5109 QualType
5110 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5111                                                    FunctionProtoTypeLoc TL) {
5112   SmallVector<QualType, 4> ExceptionStorage;
5113   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5114   return getDerived().TransformFunctionProtoType(
5115       TLB, TL, nullptr, 0,
5116       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5117         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5118                                             ExceptionStorage, Changed);
5119       });
5120 }
5121 
5122 template<typename Derived> template<typename Fn>
5123 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5124     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5125     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
5126 
5127   // Transform the parameters and return type.
5128   //
5129   // We are required to instantiate the params and return type in source order.
5130   // When the function has a trailing return type, we instantiate the
5131   // parameters before the return type,  since the return type can then refer
5132   // to the parameters themselves (via decltype, sizeof, etc.).
5133   //
5134   SmallVector<QualType, 4> ParamTypes;
5135   SmallVector<ParmVarDecl*, 4> ParamDecls;
5136   Sema::ExtParameterInfoBuilder ExtParamInfos;
5137   const FunctionProtoType *T = TL.getTypePtr();
5138 
5139   QualType ResultType;
5140 
5141   if (T->hasTrailingReturn()) {
5142     if (getDerived().TransformFunctionTypeParams(
5143             TL.getBeginLoc(), TL.getParams(),
5144             TL.getTypePtr()->param_type_begin(),
5145             T->getExtParameterInfosOrNull(),
5146             ParamTypes, &ParamDecls, ExtParamInfos))
5147       return QualType();
5148 
5149     {
5150       // C++11 [expr.prim.general]p3:
5151       //   If a declaration declares a member function or member function
5152       //   template of a class X, the expression this is a prvalue of type
5153       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5154       //   and the end of the function-definition, member-declarator, or
5155       //   declarator.
5156       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5157 
5158       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5159       if (ResultType.isNull())
5160         return QualType();
5161     }
5162   }
5163   else {
5164     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5165     if (ResultType.isNull())
5166       return QualType();
5167 
5168     if (getDerived().TransformFunctionTypeParams(
5169             TL.getBeginLoc(), TL.getParams(),
5170             TL.getTypePtr()->param_type_begin(),
5171             T->getExtParameterInfosOrNull(),
5172             ParamTypes, &ParamDecls, ExtParamInfos))
5173       return QualType();
5174   }
5175 
5176   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5177 
5178   bool EPIChanged = false;
5179   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5180     return QualType();
5181 
5182   // Handle extended parameter information.
5183   if (auto NewExtParamInfos =
5184         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5185     if (!EPI.ExtParameterInfos ||
5186         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5187           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5188       EPIChanged = true;
5189     }
5190     EPI.ExtParameterInfos = NewExtParamInfos;
5191   } else if (EPI.ExtParameterInfos) {
5192     EPIChanged = true;
5193     EPI.ExtParameterInfos = nullptr;
5194   }
5195 
5196   QualType Result = TL.getType();
5197   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5198       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5199     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5200     if (Result.isNull())
5201       return QualType();
5202   }
5203 
5204   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5205   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5206   NewTL.setLParenLoc(TL.getLParenLoc());
5207   NewTL.setRParenLoc(TL.getRParenLoc());
5208   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5209   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5210   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5211     NewTL.setParam(i, ParamDecls[i]);
5212 
5213   return Result;
5214 }
5215 
5216 template<typename Derived>
5217 bool TreeTransform<Derived>::TransformExceptionSpec(
5218     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5219     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5220   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5221 
5222   // Instantiate a dynamic noexcept expression, if any.
5223   if (ESI.Type == EST_ComputedNoexcept) {
5224     EnterExpressionEvaluationContext Unevaluated(
5225         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5226     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5227     if (NoexceptExpr.isInvalid())
5228       return true;
5229 
5230     // FIXME: This is bogus, a noexcept expression is not a condition.
5231     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5232     if (NoexceptExpr.isInvalid())
5233       return true;
5234 
5235     if (!NoexceptExpr.get()->isValueDependent()) {
5236       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5237           NoexceptExpr.get(), nullptr,
5238           diag::err_noexcept_needs_constant_expression,
5239           /*AllowFold*/false);
5240       if (NoexceptExpr.isInvalid())
5241         return true;
5242     }
5243 
5244     if (ESI.NoexceptExpr != NoexceptExpr.get())
5245       Changed = true;
5246     ESI.NoexceptExpr = NoexceptExpr.get();
5247   }
5248 
5249   if (ESI.Type != EST_Dynamic)
5250     return false;
5251 
5252   // Instantiate a dynamic exception specification's type.
5253   for (QualType T : ESI.Exceptions) {
5254     if (const PackExpansionType *PackExpansion =
5255             T->getAs<PackExpansionType>()) {
5256       Changed = true;
5257 
5258       // We have a pack expansion. Instantiate it.
5259       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5260       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5261                                               Unexpanded);
5262       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5263 
5264       // Determine whether the set of unexpanded parameter packs can and
5265       // should
5266       // be expanded.
5267       bool Expand = false;
5268       bool RetainExpansion = false;
5269       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5270       // FIXME: Track the location of the ellipsis (and track source location
5271       // information for the types in the exception specification in general).
5272       if (getDerived().TryExpandParameterPacks(
5273               Loc, SourceRange(), Unexpanded, Expand,
5274               RetainExpansion, NumExpansions))
5275         return true;
5276 
5277       if (!Expand) {
5278         // We can't expand this pack expansion into separate arguments yet;
5279         // just substitute into the pattern and create a new pack expansion
5280         // type.
5281         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5282         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5283         if (U.isNull())
5284           return true;
5285 
5286         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5287         Exceptions.push_back(U);
5288         continue;
5289       }
5290 
5291       // Substitute into the pack expansion pattern for each slice of the
5292       // pack.
5293       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5294         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5295 
5296         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5297         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5298           return true;
5299 
5300         Exceptions.push_back(U);
5301       }
5302     } else {
5303       QualType U = getDerived().TransformType(T);
5304       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5305         return true;
5306       if (T != U)
5307         Changed = true;
5308 
5309       Exceptions.push_back(U);
5310     }
5311   }
5312 
5313   ESI.Exceptions = Exceptions;
5314   if (ESI.Exceptions.empty())
5315     ESI.Type = EST_DynamicNone;
5316   return false;
5317 }
5318 
5319 template<typename Derived>
5320 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5321                                                  TypeLocBuilder &TLB,
5322                                                  FunctionNoProtoTypeLoc TL) {
5323   const FunctionNoProtoType *T = TL.getTypePtr();
5324   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5325   if (ResultType.isNull())
5326     return QualType();
5327 
5328   QualType Result = TL.getType();
5329   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5330     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5331 
5332   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5333   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5334   NewTL.setLParenLoc(TL.getLParenLoc());
5335   NewTL.setRParenLoc(TL.getRParenLoc());
5336   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5337 
5338   return Result;
5339 }
5340 
5341 template<typename Derived> QualType
5342 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5343                                                  UnresolvedUsingTypeLoc TL) {
5344   const UnresolvedUsingType *T = TL.getTypePtr();
5345   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5346   if (!D)
5347     return QualType();
5348 
5349   QualType Result = TL.getType();
5350   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5351     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5352     if (Result.isNull())
5353       return QualType();
5354   }
5355 
5356   // We might get an arbitrary type spec type back.  We should at
5357   // least always get a type spec type, though.
5358   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5359   NewTL.setNameLoc(TL.getNameLoc());
5360 
5361   return Result;
5362 }
5363 
5364 template<typename Derived>
5365 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5366                                                       TypedefTypeLoc TL) {
5367   const TypedefType *T = TL.getTypePtr();
5368   TypedefNameDecl *Typedef
5369     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5370                                                                T->getDecl()));
5371   if (!Typedef)
5372     return QualType();
5373 
5374   QualType Result = TL.getType();
5375   if (getDerived().AlwaysRebuild() ||
5376       Typedef != T->getDecl()) {
5377     Result = getDerived().RebuildTypedefType(Typedef);
5378     if (Result.isNull())
5379       return QualType();
5380   }
5381 
5382   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5383   NewTL.setNameLoc(TL.getNameLoc());
5384 
5385   return Result;
5386 }
5387 
5388 template<typename Derived>
5389 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5390                                                       TypeOfExprTypeLoc TL) {
5391   // typeof expressions are not potentially evaluated contexts
5392   EnterExpressionEvaluationContext Unevaluated(
5393       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5394       Sema::ReuseLambdaContextDecl);
5395 
5396   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5397   if (E.isInvalid())
5398     return QualType();
5399 
5400   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5401   if (E.isInvalid())
5402     return QualType();
5403 
5404   QualType Result = TL.getType();
5405   if (getDerived().AlwaysRebuild() ||
5406       E.get() != TL.getUnderlyingExpr()) {
5407     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5408     if (Result.isNull())
5409       return QualType();
5410   }
5411   else E.get();
5412 
5413   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5414   NewTL.setTypeofLoc(TL.getTypeofLoc());
5415   NewTL.setLParenLoc(TL.getLParenLoc());
5416   NewTL.setRParenLoc(TL.getRParenLoc());
5417 
5418   return Result;
5419 }
5420 
5421 template<typename Derived>
5422 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5423                                                      TypeOfTypeLoc TL) {
5424   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5425   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5426   if (!New_Under_TI)
5427     return QualType();
5428 
5429   QualType Result = TL.getType();
5430   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5431     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5432     if (Result.isNull())
5433       return QualType();
5434   }
5435 
5436   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5437   NewTL.setTypeofLoc(TL.getTypeofLoc());
5438   NewTL.setLParenLoc(TL.getLParenLoc());
5439   NewTL.setRParenLoc(TL.getRParenLoc());
5440   NewTL.setUnderlyingTInfo(New_Under_TI);
5441 
5442   return Result;
5443 }
5444 
5445 template<typename Derived>
5446 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5447                                                        DecltypeTypeLoc TL) {
5448   const DecltypeType *T = TL.getTypePtr();
5449 
5450   // decltype expressions are not potentially evaluated contexts
5451   EnterExpressionEvaluationContext Unevaluated(
5452       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5453       /*IsDecltype=*/true);
5454 
5455   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5456   if (E.isInvalid())
5457     return QualType();
5458 
5459   E = getSema().ActOnDecltypeExpression(E.get());
5460   if (E.isInvalid())
5461     return QualType();
5462 
5463   QualType Result = TL.getType();
5464   if (getDerived().AlwaysRebuild() ||
5465       E.get() != T->getUnderlyingExpr()) {
5466     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5467     if (Result.isNull())
5468       return QualType();
5469   }
5470   else E.get();
5471 
5472   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5473   NewTL.setNameLoc(TL.getNameLoc());
5474 
5475   return Result;
5476 }
5477 
5478 template<typename Derived>
5479 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5480                                                             TypeLocBuilder &TLB,
5481                                                      UnaryTransformTypeLoc TL) {
5482   QualType Result = TL.getType();
5483   if (Result->isDependentType()) {
5484     const UnaryTransformType *T = TL.getTypePtr();
5485     QualType NewBase =
5486       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5487     Result = getDerived().RebuildUnaryTransformType(NewBase,
5488                                                     T->getUTTKind(),
5489                                                     TL.getKWLoc());
5490     if (Result.isNull())
5491       return QualType();
5492   }
5493 
5494   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5495   NewTL.setKWLoc(TL.getKWLoc());
5496   NewTL.setParensRange(TL.getParensRange());
5497   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5498   return Result;
5499 }
5500 
5501 template<typename Derived>
5502 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5503                                                    AutoTypeLoc TL) {
5504   const AutoType *T = TL.getTypePtr();
5505   QualType OldDeduced = T->getDeducedType();
5506   QualType NewDeduced;
5507   if (!OldDeduced.isNull()) {
5508     NewDeduced = getDerived().TransformType(OldDeduced);
5509     if (NewDeduced.isNull())
5510       return QualType();
5511   }
5512 
5513   QualType Result = TL.getType();
5514   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5515       T->isDependentType()) {
5516     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5517     if (Result.isNull())
5518       return QualType();
5519   }
5520 
5521   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5522   NewTL.setNameLoc(TL.getNameLoc());
5523 
5524   return Result;
5525 }
5526 
5527 template<typename Derived>
5528 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5529     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5530   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5531 
5532   CXXScopeSpec SS;
5533   TemplateName TemplateName = getDerived().TransformTemplateName(
5534       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5535   if (TemplateName.isNull())
5536     return QualType();
5537 
5538   QualType OldDeduced = T->getDeducedType();
5539   QualType NewDeduced;
5540   if (!OldDeduced.isNull()) {
5541     NewDeduced = getDerived().TransformType(OldDeduced);
5542     if (NewDeduced.isNull())
5543       return QualType();
5544   }
5545 
5546   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5547       TemplateName, NewDeduced);
5548   if (Result.isNull())
5549     return QualType();
5550 
5551   DeducedTemplateSpecializationTypeLoc NewTL =
5552       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5553   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5554 
5555   return Result;
5556 }
5557 
5558 template<typename Derived>
5559 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5560                                                      RecordTypeLoc TL) {
5561   const RecordType *T = TL.getTypePtr();
5562   RecordDecl *Record
5563     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5564                                                           T->getDecl()));
5565   if (!Record)
5566     return QualType();
5567 
5568   QualType Result = TL.getType();
5569   if (getDerived().AlwaysRebuild() ||
5570       Record != T->getDecl()) {
5571     Result = getDerived().RebuildRecordType(Record);
5572     if (Result.isNull())
5573       return QualType();
5574   }
5575 
5576   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5577   NewTL.setNameLoc(TL.getNameLoc());
5578 
5579   return Result;
5580 }
5581 
5582 template<typename Derived>
5583 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5584                                                    EnumTypeLoc TL) {
5585   const EnumType *T = TL.getTypePtr();
5586   EnumDecl *Enum
5587     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5588                                                         T->getDecl()));
5589   if (!Enum)
5590     return QualType();
5591 
5592   QualType Result = TL.getType();
5593   if (getDerived().AlwaysRebuild() ||
5594       Enum != T->getDecl()) {
5595     Result = getDerived().RebuildEnumType(Enum);
5596     if (Result.isNull())
5597       return QualType();
5598   }
5599 
5600   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5601   NewTL.setNameLoc(TL.getNameLoc());
5602 
5603   return Result;
5604 }
5605 
5606 template<typename Derived>
5607 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5608                                          TypeLocBuilder &TLB,
5609                                          InjectedClassNameTypeLoc TL) {
5610   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5611                                        TL.getTypePtr()->getDecl());
5612   if (!D) return QualType();
5613 
5614   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5615   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5616   return T;
5617 }
5618 
5619 template<typename Derived>
5620 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5621                                                 TypeLocBuilder &TLB,
5622                                                 TemplateTypeParmTypeLoc TL) {
5623   return TransformTypeSpecType(TLB, TL);
5624 }
5625 
5626 template<typename Derived>
5627 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5628                                          TypeLocBuilder &TLB,
5629                                          SubstTemplateTypeParmTypeLoc TL) {
5630   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5631 
5632   // Substitute into the replacement type, which itself might involve something
5633   // that needs to be transformed. This only tends to occur with default
5634   // template arguments of template template parameters.
5635   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5636   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5637   if (Replacement.isNull())
5638     return QualType();
5639 
5640   // Always canonicalize the replacement type.
5641   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5642   QualType Result
5643     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5644                                                    Replacement);
5645 
5646   // Propagate type-source information.
5647   SubstTemplateTypeParmTypeLoc NewTL
5648     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5649   NewTL.setNameLoc(TL.getNameLoc());
5650   return Result;
5651 
5652 }
5653 
5654 template<typename Derived>
5655 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5656                                           TypeLocBuilder &TLB,
5657                                           SubstTemplateTypeParmPackTypeLoc TL) {
5658   return TransformTypeSpecType(TLB, TL);
5659 }
5660 
5661 template<typename Derived>
5662 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5663                                                         TypeLocBuilder &TLB,
5664                                            TemplateSpecializationTypeLoc TL) {
5665   const TemplateSpecializationType *T = TL.getTypePtr();
5666 
5667   // The nested-name-specifier never matters in a TemplateSpecializationType,
5668   // because we can't have a dependent nested-name-specifier anyway.
5669   CXXScopeSpec SS;
5670   TemplateName Template
5671     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5672                                          TL.getTemplateNameLoc());
5673   if (Template.isNull())
5674     return QualType();
5675 
5676   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5677 }
5678 
5679 template<typename Derived>
5680 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5681                                                      AtomicTypeLoc TL) {
5682   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5683   if (ValueType.isNull())
5684     return QualType();
5685 
5686   QualType Result = TL.getType();
5687   if (getDerived().AlwaysRebuild() ||
5688       ValueType != TL.getValueLoc().getType()) {
5689     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5690     if (Result.isNull())
5691       return QualType();
5692   }
5693 
5694   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5695   NewTL.setKWLoc(TL.getKWLoc());
5696   NewTL.setLParenLoc(TL.getLParenLoc());
5697   NewTL.setRParenLoc(TL.getRParenLoc());
5698 
5699   return Result;
5700 }
5701 
5702 template <typename Derived>
5703 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5704                                                    PipeTypeLoc TL) {
5705   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5706   if (ValueType.isNull())
5707     return QualType();
5708 
5709   QualType Result = TL.getType();
5710   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5711     const PipeType *PT = Result->getAs<PipeType>();
5712     bool isReadPipe = PT->isReadOnly();
5713     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5714     if (Result.isNull())
5715       return QualType();
5716   }
5717 
5718   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5719   NewTL.setKWLoc(TL.getKWLoc());
5720 
5721   return Result;
5722 }
5723 
5724   /// \brief Simple iterator that traverses the template arguments in a
5725   /// container that provides a \c getArgLoc() member function.
5726   ///
5727   /// This iterator is intended to be used with the iterator form of
5728   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5729   template<typename ArgLocContainer>
5730   class TemplateArgumentLocContainerIterator {
5731     ArgLocContainer *Container;
5732     unsigned Index;
5733 
5734   public:
5735     typedef TemplateArgumentLoc value_type;
5736     typedef TemplateArgumentLoc reference;
5737     typedef int difference_type;
5738     typedef std::input_iterator_tag iterator_category;
5739 
5740     class pointer {
5741       TemplateArgumentLoc Arg;
5742 
5743     public:
5744       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5745 
5746       const TemplateArgumentLoc *operator->() const {
5747         return &Arg;
5748       }
5749     };
5750 
5751 
5752     TemplateArgumentLocContainerIterator() {}
5753 
5754     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5755                                  unsigned Index)
5756       : Container(&Container), Index(Index) { }
5757 
5758     TemplateArgumentLocContainerIterator &operator++() {
5759       ++Index;
5760       return *this;
5761     }
5762 
5763     TemplateArgumentLocContainerIterator operator++(int) {
5764       TemplateArgumentLocContainerIterator Old(*this);
5765       ++(*this);
5766       return Old;
5767     }
5768 
5769     TemplateArgumentLoc operator*() const {
5770       return Container->getArgLoc(Index);
5771     }
5772 
5773     pointer operator->() const {
5774       return pointer(Container->getArgLoc(Index));
5775     }
5776 
5777     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5778                            const TemplateArgumentLocContainerIterator &Y) {
5779       return X.Container == Y.Container && X.Index == Y.Index;
5780     }
5781 
5782     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5783                            const TemplateArgumentLocContainerIterator &Y) {
5784       return !(X == Y);
5785     }
5786   };
5787 
5788 
5789 template <typename Derived>
5790 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5791                                                         TypeLocBuilder &TLB,
5792                                            TemplateSpecializationTypeLoc TL,
5793                                                       TemplateName Template) {
5794   TemplateArgumentListInfo NewTemplateArgs;
5795   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5796   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5797   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5798     ArgIterator;
5799   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5800                                               ArgIterator(TL, TL.getNumArgs()),
5801                                               NewTemplateArgs))
5802     return QualType();
5803 
5804   // FIXME: maybe don't rebuild if all the template arguments are the same.
5805 
5806   QualType Result =
5807     getDerived().RebuildTemplateSpecializationType(Template,
5808                                                    TL.getTemplateNameLoc(),
5809                                                    NewTemplateArgs);
5810 
5811   if (!Result.isNull()) {
5812     // Specializations of template template parameters are represented as
5813     // TemplateSpecializationTypes, and substitution of type alias templates
5814     // within a dependent context can transform them into
5815     // DependentTemplateSpecializationTypes.
5816     if (isa<DependentTemplateSpecializationType>(Result)) {
5817       DependentTemplateSpecializationTypeLoc NewTL
5818         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5819       NewTL.setElaboratedKeywordLoc(SourceLocation());
5820       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5821       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5822       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5823       NewTL.setLAngleLoc(TL.getLAngleLoc());
5824       NewTL.setRAngleLoc(TL.getRAngleLoc());
5825       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5826         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5827       return Result;
5828     }
5829 
5830     TemplateSpecializationTypeLoc NewTL
5831       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5832     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5833     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5834     NewTL.setLAngleLoc(TL.getLAngleLoc());
5835     NewTL.setRAngleLoc(TL.getRAngleLoc());
5836     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5837       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5838   }
5839 
5840   return Result;
5841 }
5842 
5843 template <typename Derived>
5844 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5845                                      TypeLocBuilder &TLB,
5846                                      DependentTemplateSpecializationTypeLoc TL,
5847                                      TemplateName Template,
5848                                      CXXScopeSpec &SS) {
5849   TemplateArgumentListInfo NewTemplateArgs;
5850   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5851   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5852   typedef TemplateArgumentLocContainerIterator<
5853             DependentTemplateSpecializationTypeLoc> ArgIterator;
5854   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5855                                               ArgIterator(TL, TL.getNumArgs()),
5856                                               NewTemplateArgs))
5857     return QualType();
5858 
5859   // FIXME: maybe don't rebuild if all the template arguments are the same.
5860 
5861   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5862     QualType Result
5863       = getSema().Context.getDependentTemplateSpecializationType(
5864                                                 TL.getTypePtr()->getKeyword(),
5865                                                          DTN->getQualifier(),
5866                                                          DTN->getIdentifier(),
5867                                                                NewTemplateArgs);
5868 
5869     DependentTemplateSpecializationTypeLoc NewTL
5870       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5871     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5872     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5873     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5874     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5875     NewTL.setLAngleLoc(TL.getLAngleLoc());
5876     NewTL.setRAngleLoc(TL.getRAngleLoc());
5877     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5878       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5879     return Result;
5880   }
5881 
5882   QualType Result
5883     = getDerived().RebuildTemplateSpecializationType(Template,
5884                                                      TL.getTemplateNameLoc(),
5885                                                      NewTemplateArgs);
5886 
5887   if (!Result.isNull()) {
5888     /// FIXME: Wrap this in an elaborated-type-specifier?
5889     TemplateSpecializationTypeLoc NewTL
5890       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5891     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5892     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5893     NewTL.setLAngleLoc(TL.getLAngleLoc());
5894     NewTL.setRAngleLoc(TL.getRAngleLoc());
5895     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5896       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5897   }
5898 
5899   return Result;
5900 }
5901 
5902 template<typename Derived>
5903 QualType
5904 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5905                                                 ElaboratedTypeLoc TL) {
5906   const ElaboratedType *T = TL.getTypePtr();
5907 
5908   NestedNameSpecifierLoc QualifierLoc;
5909   // NOTE: the qualifier in an ElaboratedType is optional.
5910   if (TL.getQualifierLoc()) {
5911     QualifierLoc
5912       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5913     if (!QualifierLoc)
5914       return QualType();
5915   }
5916 
5917   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5918   if (NamedT.isNull())
5919     return QualType();
5920 
5921   // C++0x [dcl.type.elab]p2:
5922   //   If the identifier resolves to a typedef-name or the simple-template-id
5923   //   resolves to an alias template specialization, the
5924   //   elaborated-type-specifier is ill-formed.
5925   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5926     if (const TemplateSpecializationType *TST =
5927           NamedT->getAs<TemplateSpecializationType>()) {
5928       TemplateName Template = TST->getTemplateName();
5929       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5930               Template.getAsTemplateDecl())) {
5931         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5932                      diag::err_tag_reference_non_tag)
5933             << TAT << Sema::NTK_TypeAliasTemplate
5934             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
5935         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5936       }
5937     }
5938   }
5939 
5940   QualType Result = TL.getType();
5941   if (getDerived().AlwaysRebuild() ||
5942       QualifierLoc != TL.getQualifierLoc() ||
5943       NamedT != T->getNamedType()) {
5944     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5945                                                 T->getKeyword(),
5946                                                 QualifierLoc, NamedT);
5947     if (Result.isNull())
5948       return QualType();
5949   }
5950 
5951   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5952   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5953   NewTL.setQualifierLoc(QualifierLoc);
5954   return Result;
5955 }
5956 
5957 template<typename Derived>
5958 QualType TreeTransform<Derived>::TransformAttributedType(
5959                                                 TypeLocBuilder &TLB,
5960                                                 AttributedTypeLoc TL) {
5961   const AttributedType *oldType = TL.getTypePtr();
5962   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5963   if (modifiedType.isNull())
5964     return QualType();
5965 
5966   QualType result = TL.getType();
5967 
5968   // FIXME: dependent operand expressions?
5969   if (getDerived().AlwaysRebuild() ||
5970       modifiedType != oldType->getModifiedType()) {
5971     // TODO: this is really lame; we should really be rebuilding the
5972     // equivalent type from first principles.
5973     QualType equivalentType
5974       = getDerived().TransformType(oldType->getEquivalentType());
5975     if (equivalentType.isNull())
5976       return QualType();
5977 
5978     // Check whether we can add nullability; it is only represented as
5979     // type sugar, and therefore cannot be diagnosed in any other way.
5980     if (auto nullability = oldType->getImmediateNullability()) {
5981       if (!modifiedType->canHaveNullability()) {
5982         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
5983           << DiagNullabilityKind(*nullability, false) << modifiedType;
5984         return QualType();
5985       }
5986     }
5987 
5988     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5989                                                modifiedType,
5990                                                equivalentType);
5991   }
5992 
5993   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5994   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5995   if (TL.hasAttrOperand())
5996     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5997   if (TL.hasAttrExprOperand())
5998     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5999   else if (TL.hasAttrEnumOperand())
6000     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
6001 
6002   return result;
6003 }
6004 
6005 template<typename Derived>
6006 QualType
6007 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6008                                            ParenTypeLoc TL) {
6009   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6010   if (Inner.isNull())
6011     return QualType();
6012 
6013   QualType Result = TL.getType();
6014   if (getDerived().AlwaysRebuild() ||
6015       Inner != TL.getInnerLoc().getType()) {
6016     Result = getDerived().RebuildParenType(Inner);
6017     if (Result.isNull())
6018       return QualType();
6019   }
6020 
6021   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6022   NewTL.setLParenLoc(TL.getLParenLoc());
6023   NewTL.setRParenLoc(TL.getRParenLoc());
6024   return Result;
6025 }
6026 
6027 template<typename Derived>
6028 QualType TreeTransform<Derived>::TransformDependentNameType(
6029     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6030   return TransformDependentNameType(TLB, TL, false);
6031 }
6032 
6033 template<typename Derived>
6034 QualType TreeTransform<Derived>::TransformDependentNameType(
6035     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6036   const DependentNameType *T = TL.getTypePtr();
6037 
6038   NestedNameSpecifierLoc QualifierLoc
6039     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6040   if (!QualifierLoc)
6041     return QualType();
6042 
6043   QualType Result
6044     = getDerived().RebuildDependentNameType(T->getKeyword(),
6045                                             TL.getElaboratedKeywordLoc(),
6046                                             QualifierLoc,
6047                                             T->getIdentifier(),
6048                                             TL.getNameLoc(),
6049                                             DeducedTSTContext);
6050   if (Result.isNull())
6051     return QualType();
6052 
6053   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6054     QualType NamedT = ElabT->getNamedType();
6055     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6056 
6057     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6058     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6059     NewTL.setQualifierLoc(QualifierLoc);
6060   } else {
6061     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6062     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6063     NewTL.setQualifierLoc(QualifierLoc);
6064     NewTL.setNameLoc(TL.getNameLoc());
6065   }
6066   return Result;
6067 }
6068 
6069 template<typename Derived>
6070 QualType TreeTransform<Derived>::
6071           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6072                                  DependentTemplateSpecializationTypeLoc TL) {
6073   NestedNameSpecifierLoc QualifierLoc;
6074   if (TL.getQualifierLoc()) {
6075     QualifierLoc
6076       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6077     if (!QualifierLoc)
6078       return QualType();
6079   }
6080 
6081   return getDerived()
6082            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6083 }
6084 
6085 template<typename Derived>
6086 QualType TreeTransform<Derived>::
6087 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6088                                    DependentTemplateSpecializationTypeLoc TL,
6089                                        NestedNameSpecifierLoc QualifierLoc) {
6090   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6091 
6092   TemplateArgumentListInfo NewTemplateArgs;
6093   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6094   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6095 
6096   typedef TemplateArgumentLocContainerIterator<
6097   DependentTemplateSpecializationTypeLoc> ArgIterator;
6098   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6099                                               ArgIterator(TL, TL.getNumArgs()),
6100                                               NewTemplateArgs))
6101     return QualType();
6102 
6103   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6104       T->getKeyword(), QualifierLoc, T->getIdentifier(),
6105       TL.getTemplateNameLoc(), NewTemplateArgs,
6106       /*AllowInjectedClassName*/ false);
6107   if (Result.isNull())
6108     return QualType();
6109 
6110   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6111     QualType NamedT = ElabT->getNamedType();
6112 
6113     // Copy information relevant to the template specialization.
6114     TemplateSpecializationTypeLoc NamedTL
6115       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6116     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6117     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6118     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6119     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6120     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6121       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6122 
6123     // Copy information relevant to the elaborated type.
6124     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6125     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6126     NewTL.setQualifierLoc(QualifierLoc);
6127   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6128     DependentTemplateSpecializationTypeLoc SpecTL
6129       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6130     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6131     SpecTL.setQualifierLoc(QualifierLoc);
6132     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6133     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6134     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6135     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6136     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6137       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6138   } else {
6139     TemplateSpecializationTypeLoc SpecTL
6140       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6141     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6142     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6143     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6144     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6145     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6146       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6147   }
6148   return Result;
6149 }
6150 
6151 template<typename Derived>
6152 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6153                                                       PackExpansionTypeLoc TL) {
6154   QualType Pattern
6155     = getDerived().TransformType(TLB, TL.getPatternLoc());
6156   if (Pattern.isNull())
6157     return QualType();
6158 
6159   QualType Result = TL.getType();
6160   if (getDerived().AlwaysRebuild() ||
6161       Pattern != TL.getPatternLoc().getType()) {
6162     Result = getDerived().RebuildPackExpansionType(Pattern,
6163                                            TL.getPatternLoc().getSourceRange(),
6164                                                    TL.getEllipsisLoc(),
6165                                            TL.getTypePtr()->getNumExpansions());
6166     if (Result.isNull())
6167       return QualType();
6168   }
6169 
6170   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6171   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6172   return Result;
6173 }
6174 
6175 template<typename Derived>
6176 QualType
6177 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6178                                                    ObjCInterfaceTypeLoc TL) {
6179   // ObjCInterfaceType is never dependent.
6180   TLB.pushFullCopy(TL);
6181   return TL.getType();
6182 }
6183 
6184 template<typename Derived>
6185 QualType
6186 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6187                                                    ObjCTypeParamTypeLoc TL) {
6188   const ObjCTypeParamType *T = TL.getTypePtr();
6189   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6190       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6191   if (!OTP)
6192     return QualType();
6193 
6194   QualType Result = TL.getType();
6195   if (getDerived().AlwaysRebuild() ||
6196       OTP != T->getDecl()) {
6197     Result = getDerived().RebuildObjCTypeParamType(OTP,
6198                  TL.getProtocolLAngleLoc(),
6199                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6200                                     TL.getNumProtocols()),
6201                  TL.getProtocolLocs(),
6202                  TL.getProtocolRAngleLoc());
6203     if (Result.isNull())
6204       return QualType();
6205   }
6206 
6207   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6208   if (TL.getNumProtocols()) {
6209     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6210     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6211       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6212     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6213   }
6214   return Result;
6215 }
6216 
6217 template<typename Derived>
6218 QualType
6219 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6220                                                 ObjCObjectTypeLoc TL) {
6221   // Transform base type.
6222   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6223   if (BaseType.isNull())
6224     return QualType();
6225 
6226   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6227 
6228   // Transform type arguments.
6229   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6230   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6231     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6232     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6233     QualType TypeArg = TypeArgInfo->getType();
6234     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6235       AnyChanged = true;
6236 
6237       // We have a pack expansion. Instantiate it.
6238       const auto *PackExpansion = PackExpansionLoc.getType()
6239                                     ->castAs<PackExpansionType>();
6240       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6241       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6242                                               Unexpanded);
6243       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6244 
6245       // Determine whether the set of unexpanded parameter packs can
6246       // and should be expanded.
6247       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6248       bool Expand = false;
6249       bool RetainExpansion = false;
6250       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6251       if (getDerived().TryExpandParameterPacks(
6252             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6253             Unexpanded, Expand, RetainExpansion, NumExpansions))
6254         return QualType();
6255 
6256       if (!Expand) {
6257         // We can't expand this pack expansion into separate arguments yet;
6258         // just substitute into the pattern and create a new pack expansion
6259         // type.
6260         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6261 
6262         TypeLocBuilder TypeArgBuilder;
6263         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6264         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6265                                                              PatternLoc);
6266         if (NewPatternType.isNull())
6267           return QualType();
6268 
6269         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6270                                       NewPatternType, NumExpansions);
6271         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6272         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6273         NewTypeArgInfos.push_back(
6274           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6275         continue;
6276       }
6277 
6278       // Substitute into the pack expansion pattern for each slice of the
6279       // pack.
6280       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6281         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6282 
6283         TypeLocBuilder TypeArgBuilder;
6284         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6285 
6286         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6287                                                          PatternLoc);
6288         if (NewTypeArg.isNull())
6289           return QualType();
6290 
6291         NewTypeArgInfos.push_back(
6292           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6293       }
6294 
6295       continue;
6296     }
6297 
6298     TypeLocBuilder TypeArgBuilder;
6299     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6300     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6301     if (NewTypeArg.isNull())
6302       return QualType();
6303 
6304     // If nothing changed, just keep the old TypeSourceInfo.
6305     if (NewTypeArg == TypeArg) {
6306       NewTypeArgInfos.push_back(TypeArgInfo);
6307       continue;
6308     }
6309 
6310     NewTypeArgInfos.push_back(
6311       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6312     AnyChanged = true;
6313   }
6314 
6315   QualType Result = TL.getType();
6316   if (getDerived().AlwaysRebuild() || AnyChanged) {
6317     // Rebuild the type.
6318     Result = getDerived().RebuildObjCObjectType(
6319                BaseType,
6320                TL.getLocStart(),
6321                TL.getTypeArgsLAngleLoc(),
6322                NewTypeArgInfos,
6323                TL.getTypeArgsRAngleLoc(),
6324                TL.getProtocolLAngleLoc(),
6325                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6326                                   TL.getNumProtocols()),
6327                TL.getProtocolLocs(),
6328                TL.getProtocolRAngleLoc());
6329 
6330     if (Result.isNull())
6331       return QualType();
6332   }
6333 
6334   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6335   NewT.setHasBaseTypeAsWritten(true);
6336   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6337   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6338     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6339   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6340   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6341   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6342     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6343   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6344   return Result;
6345 }
6346 
6347 template<typename Derived>
6348 QualType
6349 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6350                                                ObjCObjectPointerTypeLoc TL) {
6351   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6352   if (PointeeType.isNull())
6353     return QualType();
6354 
6355   QualType Result = TL.getType();
6356   if (getDerived().AlwaysRebuild() ||
6357       PointeeType != TL.getPointeeLoc().getType()) {
6358     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6359                                                        TL.getStarLoc());
6360     if (Result.isNull())
6361       return QualType();
6362   }
6363 
6364   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6365   NewT.setStarLoc(TL.getStarLoc());
6366   return Result;
6367 }
6368 
6369 //===----------------------------------------------------------------------===//
6370 // Statement transformation
6371 //===----------------------------------------------------------------------===//
6372 template<typename Derived>
6373 StmtResult
6374 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6375   return S;
6376 }
6377 
6378 template<typename Derived>
6379 StmtResult
6380 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6381   return getDerived().TransformCompoundStmt(S, false);
6382 }
6383 
6384 template<typename Derived>
6385 StmtResult
6386 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6387                                               bool IsStmtExpr) {
6388   Sema::CompoundScopeRAII CompoundScope(getSema());
6389 
6390   bool SubStmtInvalid = false;
6391   bool SubStmtChanged = false;
6392   SmallVector<Stmt*, 8> Statements;
6393   for (auto *B : S->body()) {
6394     StmtResult Result = getDerived().TransformStmt(B);
6395     if (Result.isInvalid()) {
6396       // Immediately fail if this was a DeclStmt, since it's very
6397       // likely that this will cause problems for future statements.
6398       if (isa<DeclStmt>(B))
6399         return StmtError();
6400 
6401       // Otherwise, just keep processing substatements and fail later.
6402       SubStmtInvalid = true;
6403       continue;
6404     }
6405 
6406     SubStmtChanged = SubStmtChanged || Result.get() != B;
6407     Statements.push_back(Result.getAs<Stmt>());
6408   }
6409 
6410   if (SubStmtInvalid)
6411     return StmtError();
6412 
6413   if (!getDerived().AlwaysRebuild() &&
6414       !SubStmtChanged)
6415     return S;
6416 
6417   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6418                                           Statements,
6419                                           S->getRBracLoc(),
6420                                           IsStmtExpr);
6421 }
6422 
6423 template<typename Derived>
6424 StmtResult
6425 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6426   ExprResult LHS, RHS;
6427   {
6428     EnterExpressionEvaluationContext Unevaluated(
6429         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6430 
6431     // Transform the left-hand case value.
6432     LHS = getDerived().TransformExpr(S->getLHS());
6433     LHS = SemaRef.ActOnConstantExpression(LHS);
6434     if (LHS.isInvalid())
6435       return StmtError();
6436 
6437     // Transform the right-hand case value (for the GNU case-range extension).
6438     RHS = getDerived().TransformExpr(S->getRHS());
6439     RHS = SemaRef.ActOnConstantExpression(RHS);
6440     if (RHS.isInvalid())
6441       return StmtError();
6442   }
6443 
6444   // Build the case statement.
6445   // Case statements are always rebuilt so that they will attached to their
6446   // transformed switch statement.
6447   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6448                                                        LHS.get(),
6449                                                        S->getEllipsisLoc(),
6450                                                        RHS.get(),
6451                                                        S->getColonLoc());
6452   if (Case.isInvalid())
6453     return StmtError();
6454 
6455   // Transform the statement following the case
6456   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6457   if (SubStmt.isInvalid())
6458     return StmtError();
6459 
6460   // Attach the body to the case statement
6461   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6462 }
6463 
6464 template<typename Derived>
6465 StmtResult
6466 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6467   // Transform the statement following the default case
6468   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6469   if (SubStmt.isInvalid())
6470     return StmtError();
6471 
6472   // Default statements are always rebuilt
6473   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6474                                          SubStmt.get());
6475 }
6476 
6477 template<typename Derived>
6478 StmtResult
6479 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6480   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6481   if (SubStmt.isInvalid())
6482     return StmtError();
6483 
6484   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6485                                         S->getDecl());
6486   if (!LD)
6487     return StmtError();
6488 
6489 
6490   // FIXME: Pass the real colon location in.
6491   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6492                                        cast<LabelDecl>(LD), SourceLocation(),
6493                                        SubStmt.get());
6494 }
6495 
6496 template <typename Derived>
6497 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6498   if (!R)
6499     return R;
6500 
6501   switch (R->getKind()) {
6502 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6503 #define ATTR(X)
6504 #define PRAGMA_SPELLING_ATTR(X)                                                \
6505   case attr::X:                                                                \
6506     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6507 #include "clang/Basic/AttrList.inc"
6508   default:
6509     return R;
6510   }
6511 }
6512 
6513 template <typename Derived>
6514 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6515   bool AttrsChanged = false;
6516   SmallVector<const Attr *, 1> Attrs;
6517 
6518   // Visit attributes and keep track if any are transformed.
6519   for (const auto *I : S->getAttrs()) {
6520     const Attr *R = getDerived().TransformAttr(I);
6521     AttrsChanged |= (I != R);
6522     Attrs.push_back(R);
6523   }
6524 
6525   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6526   if (SubStmt.isInvalid())
6527     return StmtError();
6528 
6529   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6530     return S;
6531 
6532   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6533                                             SubStmt.get());
6534 }
6535 
6536 template<typename Derived>
6537 StmtResult
6538 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6539   // Transform the initialization statement
6540   StmtResult Init = getDerived().TransformStmt(S->getInit());
6541   if (Init.isInvalid())
6542     return StmtError();
6543 
6544   // Transform the condition
6545   Sema::ConditionResult Cond = getDerived().TransformCondition(
6546       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6547       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6548                        : Sema::ConditionKind::Boolean);
6549   if (Cond.isInvalid())
6550     return StmtError();
6551 
6552   // If this is a constexpr if, determine which arm we should instantiate.
6553   llvm::Optional<bool> ConstexprConditionValue;
6554   if (S->isConstexpr())
6555     ConstexprConditionValue = Cond.getKnownValue();
6556 
6557   // Transform the "then" branch.
6558   StmtResult Then;
6559   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6560     Then = getDerived().TransformStmt(S->getThen());
6561     if (Then.isInvalid())
6562       return StmtError();
6563   } else {
6564     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6565   }
6566 
6567   // Transform the "else" branch.
6568   StmtResult Else;
6569   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6570     Else = getDerived().TransformStmt(S->getElse());
6571     if (Else.isInvalid())
6572       return StmtError();
6573   }
6574 
6575   if (!getDerived().AlwaysRebuild() &&
6576       Init.get() == S->getInit() &&
6577       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6578       Then.get() == S->getThen() &&
6579       Else.get() == S->getElse())
6580     return S;
6581 
6582   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6583                                     Init.get(), Then.get(), S->getElseLoc(),
6584                                     Else.get());
6585 }
6586 
6587 template<typename Derived>
6588 StmtResult
6589 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6590   // Transform the initialization statement
6591   StmtResult Init = getDerived().TransformStmt(S->getInit());
6592   if (Init.isInvalid())
6593     return StmtError();
6594 
6595   // Transform the condition.
6596   Sema::ConditionResult Cond = getDerived().TransformCondition(
6597       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6598       Sema::ConditionKind::Switch);
6599   if (Cond.isInvalid())
6600     return StmtError();
6601 
6602   // Rebuild the switch statement.
6603   StmtResult Switch
6604     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(),
6605                                           S->getInit(), Cond);
6606   if (Switch.isInvalid())
6607     return StmtError();
6608 
6609   // Transform the body of the switch statement.
6610   StmtResult Body = getDerived().TransformStmt(S->getBody());
6611   if (Body.isInvalid())
6612     return StmtError();
6613 
6614   // Complete the switch statement.
6615   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6616                                             Body.get());
6617 }
6618 
6619 template<typename Derived>
6620 StmtResult
6621 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6622   // Transform the condition
6623   Sema::ConditionResult Cond = getDerived().TransformCondition(
6624       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6625       Sema::ConditionKind::Boolean);
6626   if (Cond.isInvalid())
6627     return StmtError();
6628 
6629   // Transform the body
6630   StmtResult Body = getDerived().TransformStmt(S->getBody());
6631   if (Body.isInvalid())
6632     return StmtError();
6633 
6634   if (!getDerived().AlwaysRebuild() &&
6635       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6636       Body.get() == S->getBody())
6637     return Owned(S);
6638 
6639   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6640 }
6641 
6642 template<typename Derived>
6643 StmtResult
6644 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6645   // Transform the body
6646   StmtResult Body = getDerived().TransformStmt(S->getBody());
6647   if (Body.isInvalid())
6648     return StmtError();
6649 
6650   // Transform the condition
6651   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6652   if (Cond.isInvalid())
6653     return StmtError();
6654 
6655   if (!getDerived().AlwaysRebuild() &&
6656       Cond.get() == S->getCond() &&
6657       Body.get() == S->getBody())
6658     return S;
6659 
6660   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6661                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6662                                     S->getRParenLoc());
6663 }
6664 
6665 template<typename Derived>
6666 StmtResult
6667 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6668   // Transform the initialization statement
6669   StmtResult Init = getDerived().TransformStmt(S->getInit());
6670   if (Init.isInvalid())
6671     return StmtError();
6672 
6673   // In OpenMP loop region loop control variable must be captured and be
6674   // private. Perform analysis of first part (if any).
6675   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6676     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6677 
6678   // Transform the condition
6679   Sema::ConditionResult Cond = getDerived().TransformCondition(
6680       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6681       Sema::ConditionKind::Boolean);
6682   if (Cond.isInvalid())
6683     return StmtError();
6684 
6685   // Transform the increment
6686   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6687   if (Inc.isInvalid())
6688     return StmtError();
6689 
6690   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6691   if (S->getInc() && !FullInc.get())
6692     return StmtError();
6693 
6694   // Transform the body
6695   StmtResult Body = getDerived().TransformStmt(S->getBody());
6696   if (Body.isInvalid())
6697     return StmtError();
6698 
6699   if (!getDerived().AlwaysRebuild() &&
6700       Init.get() == S->getInit() &&
6701       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6702       Inc.get() == S->getInc() &&
6703       Body.get() == S->getBody())
6704     return S;
6705 
6706   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6707                                      Init.get(), Cond, FullInc,
6708                                      S->getRParenLoc(), Body.get());
6709 }
6710 
6711 template<typename Derived>
6712 StmtResult
6713 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6714   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6715                                         S->getLabel());
6716   if (!LD)
6717     return StmtError();
6718 
6719   // Goto statements must always be rebuilt, to resolve the label.
6720   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6721                                       cast<LabelDecl>(LD));
6722 }
6723 
6724 template<typename Derived>
6725 StmtResult
6726 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6727   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6728   if (Target.isInvalid())
6729     return StmtError();
6730   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6731 
6732   if (!getDerived().AlwaysRebuild() &&
6733       Target.get() == S->getTarget())
6734     return S;
6735 
6736   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6737                                               Target.get());
6738 }
6739 
6740 template<typename Derived>
6741 StmtResult
6742 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6743   return S;
6744 }
6745 
6746 template<typename Derived>
6747 StmtResult
6748 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6749   return S;
6750 }
6751 
6752 template<typename Derived>
6753 StmtResult
6754 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6755   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6756                                                         /*NotCopyInit*/false);
6757   if (Result.isInvalid())
6758     return StmtError();
6759 
6760   // FIXME: We always rebuild the return statement because there is no way
6761   // to tell whether the return type of the function has changed.
6762   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6763 }
6764 
6765 template<typename Derived>
6766 StmtResult
6767 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6768   bool DeclChanged = false;
6769   SmallVector<Decl *, 4> Decls;
6770   for (auto *D : S->decls()) {
6771     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6772     if (!Transformed)
6773       return StmtError();
6774 
6775     if (Transformed != D)
6776       DeclChanged = true;
6777 
6778     Decls.push_back(Transformed);
6779   }
6780 
6781   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6782     return S;
6783 
6784   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6785 }
6786 
6787 template<typename Derived>
6788 StmtResult
6789 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6790 
6791   SmallVector<Expr*, 8> Constraints;
6792   SmallVector<Expr*, 8> Exprs;
6793   SmallVector<IdentifierInfo *, 4> Names;
6794 
6795   ExprResult AsmString;
6796   SmallVector<Expr*, 8> Clobbers;
6797 
6798   bool ExprsChanged = false;
6799 
6800   // Go through the outputs.
6801   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6802     Names.push_back(S->getOutputIdentifier(I));
6803 
6804     // No need to transform the constraint literal.
6805     Constraints.push_back(S->getOutputConstraintLiteral(I));
6806 
6807     // Transform the output expr.
6808     Expr *OutputExpr = S->getOutputExpr(I);
6809     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6810     if (Result.isInvalid())
6811       return StmtError();
6812 
6813     ExprsChanged |= Result.get() != OutputExpr;
6814 
6815     Exprs.push_back(Result.get());
6816   }
6817 
6818   // Go through the inputs.
6819   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6820     Names.push_back(S->getInputIdentifier(I));
6821 
6822     // No need to transform the constraint literal.
6823     Constraints.push_back(S->getInputConstraintLiteral(I));
6824 
6825     // Transform the input expr.
6826     Expr *InputExpr = S->getInputExpr(I);
6827     ExprResult Result = getDerived().TransformExpr(InputExpr);
6828     if (Result.isInvalid())
6829       return StmtError();
6830 
6831     ExprsChanged |= Result.get() != InputExpr;
6832 
6833     Exprs.push_back(Result.get());
6834   }
6835 
6836   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6837     return S;
6838 
6839   // Go through the clobbers.
6840   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6841     Clobbers.push_back(S->getClobberStringLiteral(I));
6842 
6843   // No need to transform the asm string literal.
6844   AsmString = S->getAsmString();
6845   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6846                                         S->isVolatile(), S->getNumOutputs(),
6847                                         S->getNumInputs(), Names.data(),
6848                                         Constraints, Exprs, AsmString.get(),
6849                                         Clobbers, S->getRParenLoc());
6850 }
6851 
6852 template<typename Derived>
6853 StmtResult
6854 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6855   ArrayRef<Token> AsmToks =
6856     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6857 
6858   bool HadError = false, HadChange = false;
6859 
6860   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6861   SmallVector<Expr*, 8> TransformedExprs;
6862   TransformedExprs.reserve(SrcExprs.size());
6863   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6864     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6865     if (!Result.isUsable()) {
6866       HadError = true;
6867     } else {
6868       HadChange |= (Result.get() != SrcExprs[i]);
6869       TransformedExprs.push_back(Result.get());
6870     }
6871   }
6872 
6873   if (HadError) return StmtError();
6874   if (!HadChange && !getDerived().AlwaysRebuild())
6875     return Owned(S);
6876 
6877   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6878                                        AsmToks, S->getAsmString(),
6879                                        S->getNumOutputs(), S->getNumInputs(),
6880                                        S->getAllConstraints(), S->getClobbers(),
6881                                        TransformedExprs, S->getEndLoc());
6882 }
6883 
6884 // C++ Coroutines TS
6885 
6886 template<typename Derived>
6887 StmtResult
6888 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6889   auto *ScopeInfo = SemaRef.getCurFunction();
6890   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
6891   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
6892          ScopeInfo->NeedsCoroutineSuspends &&
6893          ScopeInfo->CoroutineSuspends.first == nullptr &&
6894          ScopeInfo->CoroutineSuspends.second == nullptr &&
6895          "expected clean scope info");
6896 
6897   // Set that we have (possibly-invalid) suspend points before we do anything
6898   // that may fail.
6899   ScopeInfo->setNeedsCoroutineSuspends(false);
6900 
6901   // The new CoroutinePromise object needs to be built and put into the current
6902   // FunctionScopeInfo before any transformations or rebuilding occurs.
6903   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
6904   if (!Promise)
6905     return StmtError();
6906   getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise);
6907   ScopeInfo->CoroutinePromise = Promise;
6908 
6909   // Transform the implicit coroutine statements we built during the initial
6910   // parse.
6911   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
6912   if (InitSuspend.isInvalid())
6913     return StmtError();
6914   StmtResult FinalSuspend =
6915       getDerived().TransformStmt(S->getFinalSuspendStmt());
6916   if (FinalSuspend.isInvalid())
6917     return StmtError();
6918   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
6919   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
6920 
6921   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
6922   if (BodyRes.isInvalid())
6923     return StmtError();
6924 
6925   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
6926   if (Builder.isInvalid())
6927     return StmtError();
6928 
6929   Expr *ReturnObject = S->getReturnValueInit();
6930   assert(ReturnObject && "the return object is expected to be valid");
6931   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
6932                                                      /*NoCopyInit*/ false);
6933   if (Res.isInvalid())
6934     return StmtError();
6935   Builder.ReturnValue = Res.get();
6936 
6937   if (S->hasDependentPromiseType()) {
6938     assert(!Promise->getType()->isDependentType() &&
6939            "the promise type must no longer be dependent");
6940     assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
6941            !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
6942            "these nodes should not have been built yet");
6943     if (!Builder.buildDependentStatements())
6944       return StmtError();
6945   } else {
6946     if (auto *OnFallthrough = S->getFallthroughHandler()) {
6947       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
6948       if (Res.isInvalid())
6949         return StmtError();
6950       Builder.OnFallthrough = Res.get();
6951     }
6952 
6953     if (auto *OnException = S->getExceptionHandler()) {
6954       StmtResult Res = getDerived().TransformStmt(OnException);
6955       if (Res.isInvalid())
6956         return StmtError();
6957       Builder.OnException = Res.get();
6958     }
6959 
6960     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
6961       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
6962       if (Res.isInvalid())
6963         return StmtError();
6964       Builder.ReturnStmtOnAllocFailure = Res.get();
6965     }
6966 
6967     // Transform any additional statements we may have already built
6968     assert(S->getAllocate() && S->getDeallocate() &&
6969            "allocation and deallocation calls must already be built");
6970     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
6971     if (AllocRes.isInvalid())
6972       return StmtError();
6973     Builder.Allocate = AllocRes.get();
6974 
6975     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
6976     if (DeallocRes.isInvalid())
6977       return StmtError();
6978     Builder.Deallocate = DeallocRes.get();
6979 
6980     assert(S->getResultDecl() && "ResultDecl must already be built");
6981     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
6982     if (ResultDecl.isInvalid())
6983       return StmtError();
6984     Builder.ResultDecl = ResultDecl.get();
6985 
6986     if (auto *ReturnStmt = S->getReturnStmt()) {
6987       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
6988       if (Res.isInvalid())
6989         return StmtError();
6990       Builder.ReturnStmt = Res.get();
6991     }
6992   }
6993   if (!Builder.buildParameterMoves())
6994     return StmtError();
6995 
6996   return getDerived().RebuildCoroutineBodyStmt(Builder);
6997 }
6998 
6999 template<typename Derived>
7000 StmtResult
7001 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7002   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7003                                                         /*NotCopyInit*/false);
7004   if (Result.isInvalid())
7005     return StmtError();
7006 
7007   // Always rebuild; we don't know if this needs to be injected into a new
7008   // context or if the promise type has changed.
7009   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7010                                           S->isImplicit());
7011 }
7012 
7013 template<typename Derived>
7014 ExprResult
7015 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7016   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7017                                                         /*NotCopyInit*/false);
7018   if (Result.isInvalid())
7019     return ExprError();
7020 
7021   // Always rebuild; we don't know if this needs to be injected into a new
7022   // context or if the promise type has changed.
7023   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7024                                          E->isImplicit());
7025 }
7026 
7027 template <typename Derived>
7028 ExprResult
7029 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7030   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7031                                                         /*NotCopyInit*/ false);
7032   if (OperandResult.isInvalid())
7033     return ExprError();
7034 
7035   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7036           E->getOperatorCoawaitLookup());
7037 
7038   if (LookupResult.isInvalid())
7039     return ExprError();
7040 
7041   // Always rebuild; we don't know if this needs to be injected into a new
7042   // context or if the promise type has changed.
7043   return getDerived().RebuildDependentCoawaitExpr(
7044       E->getKeywordLoc(), OperandResult.get(),
7045       cast<UnresolvedLookupExpr>(LookupResult.get()));
7046 }
7047 
7048 template<typename Derived>
7049 ExprResult
7050 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7051   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7052                                                         /*NotCopyInit*/false);
7053   if (Result.isInvalid())
7054     return ExprError();
7055 
7056   // Always rebuild; we don't know if this needs to be injected into a new
7057   // context or if the promise type has changed.
7058   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7059 }
7060 
7061 // Objective-C Statements.
7062 
7063 template<typename Derived>
7064 StmtResult
7065 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7066   // Transform the body of the @try.
7067   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7068   if (TryBody.isInvalid())
7069     return StmtError();
7070 
7071   // Transform the @catch statements (if present).
7072   bool AnyCatchChanged = false;
7073   SmallVector<Stmt*, 8> CatchStmts;
7074   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7075     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7076     if (Catch.isInvalid())
7077       return StmtError();
7078     if (Catch.get() != S->getCatchStmt(I))
7079       AnyCatchChanged = true;
7080     CatchStmts.push_back(Catch.get());
7081   }
7082 
7083   // Transform the @finally statement (if present).
7084   StmtResult Finally;
7085   if (S->getFinallyStmt()) {
7086     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7087     if (Finally.isInvalid())
7088       return StmtError();
7089   }
7090 
7091   // If nothing changed, just retain this statement.
7092   if (!getDerived().AlwaysRebuild() &&
7093       TryBody.get() == S->getTryBody() &&
7094       !AnyCatchChanged &&
7095       Finally.get() == S->getFinallyStmt())
7096     return S;
7097 
7098   // Build a new statement.
7099   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7100                                            CatchStmts, Finally.get());
7101 }
7102 
7103 template<typename Derived>
7104 StmtResult
7105 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7106   // Transform the @catch parameter, if there is one.
7107   VarDecl *Var = nullptr;
7108   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7109     TypeSourceInfo *TSInfo = nullptr;
7110     if (FromVar->getTypeSourceInfo()) {
7111       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7112       if (!TSInfo)
7113         return StmtError();
7114     }
7115 
7116     QualType T;
7117     if (TSInfo)
7118       T = TSInfo->getType();
7119     else {
7120       T = getDerived().TransformType(FromVar->getType());
7121       if (T.isNull())
7122         return StmtError();
7123     }
7124 
7125     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7126     if (!Var)
7127       return StmtError();
7128   }
7129 
7130   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7131   if (Body.isInvalid())
7132     return StmtError();
7133 
7134   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7135                                              S->getRParenLoc(),
7136                                              Var, Body.get());
7137 }
7138 
7139 template<typename Derived>
7140 StmtResult
7141 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7142   // Transform the body.
7143   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7144   if (Body.isInvalid())
7145     return StmtError();
7146 
7147   // If nothing changed, just retain this statement.
7148   if (!getDerived().AlwaysRebuild() &&
7149       Body.get() == S->getFinallyBody())
7150     return S;
7151 
7152   // Build a new statement.
7153   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7154                                                Body.get());
7155 }
7156 
7157 template<typename Derived>
7158 StmtResult
7159 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7160   ExprResult Operand;
7161   if (S->getThrowExpr()) {
7162     Operand = getDerived().TransformExpr(S->getThrowExpr());
7163     if (Operand.isInvalid())
7164       return StmtError();
7165   }
7166 
7167   if (!getDerived().AlwaysRebuild() &&
7168       Operand.get() == S->getThrowExpr())
7169     return S;
7170 
7171   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7172 }
7173 
7174 template<typename Derived>
7175 StmtResult
7176 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7177                                                   ObjCAtSynchronizedStmt *S) {
7178   // Transform the object we are locking.
7179   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7180   if (Object.isInvalid())
7181     return StmtError();
7182   Object =
7183     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7184                                                   Object.get());
7185   if (Object.isInvalid())
7186     return StmtError();
7187 
7188   // Transform the body.
7189   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7190   if (Body.isInvalid())
7191     return StmtError();
7192 
7193   // If nothing change, just retain the current statement.
7194   if (!getDerived().AlwaysRebuild() &&
7195       Object.get() == S->getSynchExpr() &&
7196       Body.get() == S->getSynchBody())
7197     return S;
7198 
7199   // Build a new statement.
7200   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7201                                                     Object.get(), Body.get());
7202 }
7203 
7204 template<typename Derived>
7205 StmtResult
7206 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7207                                               ObjCAutoreleasePoolStmt *S) {
7208   // Transform the body.
7209   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7210   if (Body.isInvalid())
7211     return StmtError();
7212 
7213   // If nothing changed, just retain this statement.
7214   if (!getDerived().AlwaysRebuild() &&
7215       Body.get() == S->getSubStmt())
7216     return S;
7217 
7218   // Build a new statement.
7219   return getDerived().RebuildObjCAutoreleasePoolStmt(
7220                         S->getAtLoc(), Body.get());
7221 }
7222 
7223 template<typename Derived>
7224 StmtResult
7225 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7226                                                   ObjCForCollectionStmt *S) {
7227   // Transform the element statement.
7228   StmtResult Element = getDerived().TransformStmt(S->getElement());
7229   if (Element.isInvalid())
7230     return StmtError();
7231 
7232   // Transform the collection expression.
7233   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7234   if (Collection.isInvalid())
7235     return StmtError();
7236 
7237   // Transform the body.
7238   StmtResult Body = getDerived().TransformStmt(S->getBody());
7239   if (Body.isInvalid())
7240     return StmtError();
7241 
7242   // If nothing changed, just retain this statement.
7243   if (!getDerived().AlwaysRebuild() &&
7244       Element.get() == S->getElement() &&
7245       Collection.get() == S->getCollection() &&
7246       Body.get() == S->getBody())
7247     return S;
7248 
7249   // Build a new statement.
7250   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7251                                                    Element.get(),
7252                                                    Collection.get(),
7253                                                    S->getRParenLoc(),
7254                                                    Body.get());
7255 }
7256 
7257 template <typename Derived>
7258 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7259   // Transform the exception declaration, if any.
7260   VarDecl *Var = nullptr;
7261   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7262     TypeSourceInfo *T =
7263         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7264     if (!T)
7265       return StmtError();
7266 
7267     Var = getDerived().RebuildExceptionDecl(
7268         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7269         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7270     if (!Var || Var->isInvalidDecl())
7271       return StmtError();
7272   }
7273 
7274   // Transform the actual exception handler.
7275   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7276   if (Handler.isInvalid())
7277     return StmtError();
7278 
7279   if (!getDerived().AlwaysRebuild() && !Var &&
7280       Handler.get() == S->getHandlerBlock())
7281     return S;
7282 
7283   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7284 }
7285 
7286 template <typename Derived>
7287 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7288   // Transform the try block itself.
7289   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7290   if (TryBlock.isInvalid())
7291     return StmtError();
7292 
7293   // Transform the handlers.
7294   bool HandlerChanged = false;
7295   SmallVector<Stmt *, 8> Handlers;
7296   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7297     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7298     if (Handler.isInvalid())
7299       return StmtError();
7300 
7301     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7302     Handlers.push_back(Handler.getAs<Stmt>());
7303   }
7304 
7305   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7306       !HandlerChanged)
7307     return S;
7308 
7309   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7310                                         Handlers);
7311 }
7312 
7313 template<typename Derived>
7314 StmtResult
7315 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7316   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7317   if (Range.isInvalid())
7318     return StmtError();
7319 
7320   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7321   if (Begin.isInvalid())
7322     return StmtError();
7323   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7324   if (End.isInvalid())
7325     return StmtError();
7326 
7327   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7328   if (Cond.isInvalid())
7329     return StmtError();
7330   if (Cond.get())
7331     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7332   if (Cond.isInvalid())
7333     return StmtError();
7334   if (Cond.get())
7335     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7336 
7337   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7338   if (Inc.isInvalid())
7339     return StmtError();
7340   if (Inc.get())
7341     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7342 
7343   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7344   if (LoopVar.isInvalid())
7345     return StmtError();
7346 
7347   StmtResult NewStmt = S;
7348   if (getDerived().AlwaysRebuild() ||
7349       Range.get() != S->getRangeStmt() ||
7350       Begin.get() != S->getBeginStmt() ||
7351       End.get() != S->getEndStmt() ||
7352       Cond.get() != S->getCond() ||
7353       Inc.get() != S->getInc() ||
7354       LoopVar.get() != S->getLoopVarStmt()) {
7355     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7356                                                   S->getCoawaitLoc(),
7357                                                   S->getColonLoc(), Range.get(),
7358                                                   Begin.get(), End.get(),
7359                                                   Cond.get(),
7360                                                   Inc.get(), LoopVar.get(),
7361                                                   S->getRParenLoc());
7362     if (NewStmt.isInvalid())
7363       return StmtError();
7364   }
7365 
7366   StmtResult Body = getDerived().TransformStmt(S->getBody());
7367   if (Body.isInvalid())
7368     return StmtError();
7369 
7370   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7371   // it now so we have a new statement to attach the body to.
7372   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7373     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7374                                                   S->getCoawaitLoc(),
7375                                                   S->getColonLoc(), Range.get(),
7376                                                   Begin.get(), End.get(),
7377                                                   Cond.get(),
7378                                                   Inc.get(), LoopVar.get(),
7379                                                   S->getRParenLoc());
7380     if (NewStmt.isInvalid())
7381       return StmtError();
7382   }
7383 
7384   if (NewStmt.get() == S)
7385     return S;
7386 
7387   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7388 }
7389 
7390 template<typename Derived>
7391 StmtResult
7392 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7393                                                     MSDependentExistsStmt *S) {
7394   // Transform the nested-name-specifier, if any.
7395   NestedNameSpecifierLoc QualifierLoc;
7396   if (S->getQualifierLoc()) {
7397     QualifierLoc
7398       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7399     if (!QualifierLoc)
7400       return StmtError();
7401   }
7402 
7403   // Transform the declaration name.
7404   DeclarationNameInfo NameInfo = S->getNameInfo();
7405   if (NameInfo.getName()) {
7406     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7407     if (!NameInfo.getName())
7408       return StmtError();
7409   }
7410 
7411   // Check whether anything changed.
7412   if (!getDerived().AlwaysRebuild() &&
7413       QualifierLoc == S->getQualifierLoc() &&
7414       NameInfo.getName() == S->getNameInfo().getName())
7415     return S;
7416 
7417   // Determine whether this name exists, if we can.
7418   CXXScopeSpec SS;
7419   SS.Adopt(QualifierLoc);
7420   bool Dependent = false;
7421   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7422   case Sema::IER_Exists:
7423     if (S->isIfExists())
7424       break;
7425 
7426     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7427 
7428   case Sema::IER_DoesNotExist:
7429     if (S->isIfNotExists())
7430       break;
7431 
7432     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7433 
7434   case Sema::IER_Dependent:
7435     Dependent = true;
7436     break;
7437 
7438   case Sema::IER_Error:
7439     return StmtError();
7440   }
7441 
7442   // We need to continue with the instantiation, so do so now.
7443   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7444   if (SubStmt.isInvalid())
7445     return StmtError();
7446 
7447   // If we have resolved the name, just transform to the substatement.
7448   if (!Dependent)
7449     return SubStmt;
7450 
7451   // The name is still dependent, so build a dependent expression again.
7452   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7453                                                    S->isIfExists(),
7454                                                    QualifierLoc,
7455                                                    NameInfo,
7456                                                    SubStmt.get());
7457 }
7458 
7459 template<typename Derived>
7460 ExprResult
7461 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7462   NestedNameSpecifierLoc QualifierLoc;
7463   if (E->getQualifierLoc()) {
7464     QualifierLoc
7465     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7466     if (!QualifierLoc)
7467       return ExprError();
7468   }
7469 
7470   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7471     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7472   if (!PD)
7473     return ExprError();
7474 
7475   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7476   if (Base.isInvalid())
7477     return ExprError();
7478 
7479   return new (SemaRef.getASTContext())
7480       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7481                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7482                         QualifierLoc, E->getMemberLoc());
7483 }
7484 
7485 template <typename Derived>
7486 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7487     MSPropertySubscriptExpr *E) {
7488   auto BaseRes = getDerived().TransformExpr(E->getBase());
7489   if (BaseRes.isInvalid())
7490     return ExprError();
7491   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7492   if (IdxRes.isInvalid())
7493     return ExprError();
7494 
7495   if (!getDerived().AlwaysRebuild() &&
7496       BaseRes.get() == E->getBase() &&
7497       IdxRes.get() == E->getIdx())
7498     return E;
7499 
7500   return getDerived().RebuildArraySubscriptExpr(
7501       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7502 }
7503 
7504 template <typename Derived>
7505 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7506   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7507   if (TryBlock.isInvalid())
7508     return StmtError();
7509 
7510   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7511   if (Handler.isInvalid())
7512     return StmtError();
7513 
7514   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7515       Handler.get() == S->getHandler())
7516     return S;
7517 
7518   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7519                                         TryBlock.get(), Handler.get());
7520 }
7521 
7522 template <typename Derived>
7523 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7524   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7525   if (Block.isInvalid())
7526     return StmtError();
7527 
7528   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7529 }
7530 
7531 template <typename Derived>
7532 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7533   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7534   if (FilterExpr.isInvalid())
7535     return StmtError();
7536 
7537   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7538   if (Block.isInvalid())
7539     return StmtError();
7540 
7541   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7542                                            Block.get());
7543 }
7544 
7545 template <typename Derived>
7546 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7547   if (isa<SEHFinallyStmt>(Handler))
7548     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7549   else
7550     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7551 }
7552 
7553 template<typename Derived>
7554 StmtResult
7555 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7556   return S;
7557 }
7558 
7559 //===----------------------------------------------------------------------===//
7560 // OpenMP directive transformation
7561 //===----------------------------------------------------------------------===//
7562 template <typename Derived>
7563 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7564     OMPExecutableDirective *D) {
7565 
7566   // Transform the clauses
7567   llvm::SmallVector<OMPClause *, 16> TClauses;
7568   ArrayRef<OMPClause *> Clauses = D->clauses();
7569   TClauses.reserve(Clauses.size());
7570   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7571        I != E; ++I) {
7572     if (*I) {
7573       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7574       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7575       getDerived().getSema().EndOpenMPClause();
7576       if (Clause)
7577         TClauses.push_back(Clause);
7578     } else {
7579       TClauses.push_back(nullptr);
7580     }
7581   }
7582   StmtResult AssociatedStmt;
7583   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7584     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7585                                                   /*CurScope=*/nullptr);
7586     StmtResult Body;
7587     {
7588       Sema::CompoundScopeRAII CompoundScope(getSema());
7589       int ThisCaptureLevel =
7590           Sema::getOpenMPCaptureLevels(D->getDirectiveKind());
7591       Stmt *CS = D->getAssociatedStmt();
7592       while (--ThisCaptureLevel >= 0)
7593         CS = cast<CapturedStmt>(CS)->getCapturedStmt();
7594       Body = getDerived().TransformStmt(CS);
7595     }
7596     AssociatedStmt =
7597         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7598     if (AssociatedStmt.isInvalid()) {
7599       return StmtError();
7600     }
7601   }
7602   if (TClauses.size() != Clauses.size()) {
7603     return StmtError();
7604   }
7605 
7606   // Transform directive name for 'omp critical' directive.
7607   DeclarationNameInfo DirName;
7608   if (D->getDirectiveKind() == OMPD_critical) {
7609     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7610     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7611   }
7612   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7613   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7614     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7615   } else if (D->getDirectiveKind() == OMPD_cancel) {
7616     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7617   }
7618 
7619   return getDerived().RebuildOMPExecutableDirective(
7620       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7621       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7622 }
7623 
7624 template <typename Derived>
7625 StmtResult
7626 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7627   DeclarationNameInfo DirName;
7628   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7629                                              D->getLocStart());
7630   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7631   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7632   return Res;
7633 }
7634 
7635 template <typename Derived>
7636 StmtResult
7637 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7638   DeclarationNameInfo DirName;
7639   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7640                                              D->getLocStart());
7641   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7642   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7643   return Res;
7644 }
7645 
7646 template <typename Derived>
7647 StmtResult
7648 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7649   DeclarationNameInfo DirName;
7650   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7651                                              D->getLocStart());
7652   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7653   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7654   return Res;
7655 }
7656 
7657 template <typename Derived>
7658 StmtResult
7659 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7660   DeclarationNameInfo DirName;
7661   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7662                                              D->getLocStart());
7663   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7664   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7665   return Res;
7666 }
7667 
7668 template <typename Derived>
7669 StmtResult
7670 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7671   DeclarationNameInfo DirName;
7672   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7673                                              D->getLocStart());
7674   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7675   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7676   return Res;
7677 }
7678 
7679 template <typename Derived>
7680 StmtResult
7681 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7682   DeclarationNameInfo DirName;
7683   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7684                                              D->getLocStart());
7685   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7686   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7687   return Res;
7688 }
7689 
7690 template <typename Derived>
7691 StmtResult
7692 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7693   DeclarationNameInfo DirName;
7694   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7695                                              D->getLocStart());
7696   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7697   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7698   return Res;
7699 }
7700 
7701 template <typename Derived>
7702 StmtResult
7703 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7704   DeclarationNameInfo DirName;
7705   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7706                                              D->getLocStart());
7707   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7708   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7709   return Res;
7710 }
7711 
7712 template <typename Derived>
7713 StmtResult
7714 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7715   getDerived().getSema().StartOpenMPDSABlock(
7716       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7717   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7718   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7719   return Res;
7720 }
7721 
7722 template <typename Derived>
7723 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7724     OMPParallelForDirective *D) {
7725   DeclarationNameInfo DirName;
7726   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7727                                              nullptr, D->getLocStart());
7728   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7729   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7730   return Res;
7731 }
7732 
7733 template <typename Derived>
7734 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7735     OMPParallelForSimdDirective *D) {
7736   DeclarationNameInfo DirName;
7737   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7738                                              nullptr, D->getLocStart());
7739   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7740   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7741   return Res;
7742 }
7743 
7744 template <typename Derived>
7745 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7746     OMPParallelSectionsDirective *D) {
7747   DeclarationNameInfo DirName;
7748   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7749                                              nullptr, D->getLocStart());
7750   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7751   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7752   return Res;
7753 }
7754 
7755 template <typename Derived>
7756 StmtResult
7757 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7758   DeclarationNameInfo DirName;
7759   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7760                                              D->getLocStart());
7761   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7762   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7763   return Res;
7764 }
7765 
7766 template <typename Derived>
7767 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7768     OMPTaskyieldDirective *D) {
7769   DeclarationNameInfo DirName;
7770   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7771                                              D->getLocStart());
7772   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7773   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7774   return Res;
7775 }
7776 
7777 template <typename Derived>
7778 StmtResult
7779 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7780   DeclarationNameInfo DirName;
7781   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7782                                              D->getLocStart());
7783   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7784   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7785   return Res;
7786 }
7787 
7788 template <typename Derived>
7789 StmtResult
7790 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7791   DeclarationNameInfo DirName;
7792   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7793                                              D->getLocStart());
7794   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7795   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7796   return Res;
7797 }
7798 
7799 template <typename Derived>
7800 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7801     OMPTaskgroupDirective *D) {
7802   DeclarationNameInfo DirName;
7803   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7804                                              D->getLocStart());
7805   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7806   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7807   return Res;
7808 }
7809 
7810 template <typename Derived>
7811 StmtResult
7812 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7813   DeclarationNameInfo DirName;
7814   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7815                                              D->getLocStart());
7816   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7817   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7818   return Res;
7819 }
7820 
7821 template <typename Derived>
7822 StmtResult
7823 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7824   DeclarationNameInfo DirName;
7825   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7826                                              D->getLocStart());
7827   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7828   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7829   return Res;
7830 }
7831 
7832 template <typename Derived>
7833 StmtResult
7834 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7835   DeclarationNameInfo DirName;
7836   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7837                                              D->getLocStart());
7838   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7839   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7840   return Res;
7841 }
7842 
7843 template <typename Derived>
7844 StmtResult
7845 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7846   DeclarationNameInfo DirName;
7847   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7848                                              D->getLocStart());
7849   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7850   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7851   return Res;
7852 }
7853 
7854 template <typename Derived>
7855 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7856     OMPTargetDataDirective *D) {
7857   DeclarationNameInfo DirName;
7858   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7859                                              D->getLocStart());
7860   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7861   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7862   return Res;
7863 }
7864 
7865 template <typename Derived>
7866 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7867     OMPTargetEnterDataDirective *D) {
7868   DeclarationNameInfo DirName;
7869   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7870                                              nullptr, D->getLocStart());
7871   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7872   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7873   return Res;
7874 }
7875 
7876 template <typename Derived>
7877 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7878     OMPTargetExitDataDirective *D) {
7879   DeclarationNameInfo DirName;
7880   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7881                                              nullptr, D->getLocStart());
7882   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7883   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7884   return Res;
7885 }
7886 
7887 template <typename Derived>
7888 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7889     OMPTargetParallelDirective *D) {
7890   DeclarationNameInfo DirName;
7891   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7892                                              nullptr, D->getLocStart());
7893   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7894   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7895   return Res;
7896 }
7897 
7898 template <typename Derived>
7899 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7900     OMPTargetParallelForDirective *D) {
7901   DeclarationNameInfo DirName;
7902   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7903                                              nullptr, D->getLocStart());
7904   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7905   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7906   return Res;
7907 }
7908 
7909 template <typename Derived>
7910 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7911     OMPTargetUpdateDirective *D) {
7912   DeclarationNameInfo DirName;
7913   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7914                                              nullptr, D->getLocStart());
7915   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7916   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7917   return Res;
7918 }
7919 
7920 template <typename Derived>
7921 StmtResult
7922 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7923   DeclarationNameInfo DirName;
7924   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7925                                              D->getLocStart());
7926   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7927   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7928   return Res;
7929 }
7930 
7931 template <typename Derived>
7932 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7933     OMPCancellationPointDirective *D) {
7934   DeclarationNameInfo DirName;
7935   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7936                                              nullptr, D->getLocStart());
7937   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7938   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7939   return Res;
7940 }
7941 
7942 template <typename Derived>
7943 StmtResult
7944 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7945   DeclarationNameInfo DirName;
7946   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7947                                              D->getLocStart());
7948   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7949   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7950   return Res;
7951 }
7952 
7953 template <typename Derived>
7954 StmtResult
7955 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7956   DeclarationNameInfo DirName;
7957   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7958                                              D->getLocStart());
7959   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7960   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7961   return Res;
7962 }
7963 
7964 template <typename Derived>
7965 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
7966     OMPTaskLoopSimdDirective *D) {
7967   DeclarationNameInfo DirName;
7968   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
7969                                              nullptr, D->getLocStart());
7970   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7971   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7972   return Res;
7973 }
7974 
7975 template <typename Derived>
7976 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
7977     OMPDistributeDirective *D) {
7978   DeclarationNameInfo DirName;
7979   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
7980                                              D->getLocStart());
7981   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7982   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7983   return Res;
7984 }
7985 
7986 template <typename Derived>
7987 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
7988     OMPDistributeParallelForDirective *D) {
7989   DeclarationNameInfo DirName;
7990   getDerived().getSema().StartOpenMPDSABlock(
7991       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
7992   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7993   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7994   return Res;
7995 }
7996 
7997 template <typename Derived>
7998 StmtResult
7999 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8000     OMPDistributeParallelForSimdDirective *D) {
8001   DeclarationNameInfo DirName;
8002   getDerived().getSema().StartOpenMPDSABlock(
8003       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
8004   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8005   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8006   return Res;
8007 }
8008 
8009 template <typename Derived>
8010 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8011     OMPDistributeSimdDirective *D) {
8012   DeclarationNameInfo DirName;
8013   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8014                                              nullptr, D->getLocStart());
8015   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8016   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8017   return Res;
8018 }
8019 
8020 template <typename Derived>
8021 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8022     OMPTargetParallelForSimdDirective *D) {
8023   DeclarationNameInfo DirName;
8024   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
8025                                              DirName, nullptr,
8026                                              D->getLocStart());
8027   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8028   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8029   return Res;
8030 }
8031 
8032 template <typename Derived>
8033 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8034     OMPTargetSimdDirective *D) {
8035   DeclarationNameInfo DirName;
8036   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8037                                              D->getLocStart());
8038   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8039   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8040   return Res;
8041 }
8042 
8043 template <typename Derived>
8044 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8045     OMPTeamsDistributeDirective *D) {
8046   DeclarationNameInfo DirName;
8047   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8048                                              nullptr, D->getLocStart());
8049   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8050   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8051   return Res;
8052 }
8053 
8054 template <typename Derived>
8055 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8056     OMPTeamsDistributeSimdDirective *D) {
8057   DeclarationNameInfo DirName;
8058   getDerived().getSema().StartOpenMPDSABlock(
8059       OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8060   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8061   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8062   return Res;
8063 }
8064 
8065 template <typename Derived>
8066 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8067     OMPTeamsDistributeParallelForSimdDirective *D) {
8068   DeclarationNameInfo DirName;
8069   getDerived().getSema().StartOpenMPDSABlock(
8070       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
8071   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8072   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8073   return Res;
8074 }
8075 
8076 template <typename Derived>
8077 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8078     OMPTeamsDistributeParallelForDirective *D) {
8079   DeclarationNameInfo DirName;
8080   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for,
8081       DirName, nullptr, D->getLocStart());
8082   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8083   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8084   return Res;
8085 }
8086 
8087 template <typename Derived>
8088 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8089     OMPTargetTeamsDirective *D) {
8090   DeclarationNameInfo DirName;
8091   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8092                                              nullptr, D->getLocStart());
8093   auto Res = getDerived().TransformOMPExecutableDirective(D);
8094   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8095   return Res;
8096 }
8097 
8098 template <typename Derived>
8099 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8100     OMPTargetTeamsDistributeDirective *D) {
8101   DeclarationNameInfo DirName;
8102   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute,
8103       DirName, nullptr, D->getLocStart());
8104   auto Res = getDerived().TransformOMPExecutableDirective(D);
8105   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8106   return Res;
8107 }
8108 
8109 template <typename Derived>
8110 StmtResult
8111 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8112     OMPTargetTeamsDistributeParallelForDirective *D) {
8113   DeclarationNameInfo DirName;
8114   getDerived().getSema().StartOpenMPDSABlock(
8115       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8116       D->getLocStart());
8117   auto Res = getDerived().TransformOMPExecutableDirective(D);
8118   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8119   return Res;
8120 }
8121 
8122 template <typename Derived>
8123 StmtResult TreeTransform<Derived>::
8124     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8125         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8126   DeclarationNameInfo DirName;
8127   getDerived().getSema().StartOpenMPDSABlock(
8128       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8129       D->getLocStart());
8130   auto Res = getDerived().TransformOMPExecutableDirective(D);
8131   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8132   return Res;
8133 }
8134 
8135 template <typename Derived>
8136 StmtResult
8137 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8138     OMPTargetTeamsDistributeSimdDirective *D) {
8139   DeclarationNameInfo DirName;
8140   getDerived().getSema().StartOpenMPDSABlock(
8141       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8142   auto Res = getDerived().TransformOMPExecutableDirective(D);
8143   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8144   return Res;
8145 }
8146 
8147 
8148 //===----------------------------------------------------------------------===//
8149 // OpenMP clause transformation
8150 //===----------------------------------------------------------------------===//
8151 template <typename Derived>
8152 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8153   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8154   if (Cond.isInvalid())
8155     return nullptr;
8156   return getDerived().RebuildOMPIfClause(
8157       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
8158       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
8159 }
8160 
8161 template <typename Derived>
8162 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8163   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8164   if (Cond.isInvalid())
8165     return nullptr;
8166   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
8167                                             C->getLParenLoc(), C->getLocEnd());
8168 }
8169 
8170 template <typename Derived>
8171 OMPClause *
8172 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8173   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8174   if (NumThreads.isInvalid())
8175     return nullptr;
8176   return getDerived().RebuildOMPNumThreadsClause(
8177       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8178 }
8179 
8180 template <typename Derived>
8181 OMPClause *
8182 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8183   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8184   if (E.isInvalid())
8185     return nullptr;
8186   return getDerived().RebuildOMPSafelenClause(
8187       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8188 }
8189 
8190 template <typename Derived>
8191 OMPClause *
8192 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8193   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8194   if (E.isInvalid())
8195     return nullptr;
8196   return getDerived().RebuildOMPSimdlenClause(
8197       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8198 }
8199 
8200 template <typename Derived>
8201 OMPClause *
8202 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8203   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8204   if (E.isInvalid())
8205     return nullptr;
8206   return getDerived().RebuildOMPCollapseClause(
8207       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8208 }
8209 
8210 template <typename Derived>
8211 OMPClause *
8212 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8213   return getDerived().RebuildOMPDefaultClause(
8214       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
8215       C->getLParenLoc(), C->getLocEnd());
8216 }
8217 
8218 template <typename Derived>
8219 OMPClause *
8220 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8221   return getDerived().RebuildOMPProcBindClause(
8222       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
8223       C->getLParenLoc(), C->getLocEnd());
8224 }
8225 
8226 template <typename Derived>
8227 OMPClause *
8228 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8229   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8230   if (E.isInvalid())
8231     return nullptr;
8232   return getDerived().RebuildOMPScheduleClause(
8233       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8234       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8235       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8236       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8237 }
8238 
8239 template <typename Derived>
8240 OMPClause *
8241 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8242   ExprResult E;
8243   if (auto *Num = C->getNumForLoops()) {
8244     E = getDerived().TransformExpr(Num);
8245     if (E.isInvalid())
8246       return nullptr;
8247   }
8248   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
8249                                               C->getLParenLoc(), E.get());
8250 }
8251 
8252 template <typename Derived>
8253 OMPClause *
8254 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8255   // No need to rebuild this clause, no template-dependent parameters.
8256   return C;
8257 }
8258 
8259 template <typename Derived>
8260 OMPClause *
8261 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8262   // No need to rebuild this clause, no template-dependent parameters.
8263   return C;
8264 }
8265 
8266 template <typename Derived>
8267 OMPClause *
8268 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8269   // No need to rebuild this clause, no template-dependent parameters.
8270   return C;
8271 }
8272 
8273 template <typename Derived>
8274 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8275   // No need to rebuild this clause, no template-dependent parameters.
8276   return C;
8277 }
8278 
8279 template <typename Derived>
8280 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8281   // No need to rebuild this clause, no template-dependent parameters.
8282   return C;
8283 }
8284 
8285 template <typename Derived>
8286 OMPClause *
8287 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8288   // No need to rebuild this clause, no template-dependent parameters.
8289   return C;
8290 }
8291 
8292 template <typename Derived>
8293 OMPClause *
8294 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8295   // No need to rebuild this clause, no template-dependent parameters.
8296   return C;
8297 }
8298 
8299 template <typename Derived>
8300 OMPClause *
8301 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8302   // No need to rebuild this clause, no template-dependent parameters.
8303   return C;
8304 }
8305 
8306 template <typename Derived>
8307 OMPClause *
8308 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8309   // No need to rebuild this clause, no template-dependent parameters.
8310   return C;
8311 }
8312 
8313 template <typename Derived>
8314 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8315   // No need to rebuild this clause, no template-dependent parameters.
8316   return C;
8317 }
8318 
8319 template <typename Derived>
8320 OMPClause *
8321 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8322   // No need to rebuild this clause, no template-dependent parameters.
8323   return C;
8324 }
8325 
8326 template <typename Derived>
8327 OMPClause *
8328 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8329   llvm::SmallVector<Expr *, 16> Vars;
8330   Vars.reserve(C->varlist_size());
8331   for (auto *VE : C->varlists()) {
8332     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8333     if (EVar.isInvalid())
8334       return nullptr;
8335     Vars.push_back(EVar.get());
8336   }
8337   return getDerived().RebuildOMPPrivateClause(
8338       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8339 }
8340 
8341 template <typename Derived>
8342 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8343     OMPFirstprivateClause *C) {
8344   llvm::SmallVector<Expr *, 16> Vars;
8345   Vars.reserve(C->varlist_size());
8346   for (auto *VE : C->varlists()) {
8347     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8348     if (EVar.isInvalid())
8349       return nullptr;
8350     Vars.push_back(EVar.get());
8351   }
8352   return getDerived().RebuildOMPFirstprivateClause(
8353       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8354 }
8355 
8356 template <typename Derived>
8357 OMPClause *
8358 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8359   llvm::SmallVector<Expr *, 16> Vars;
8360   Vars.reserve(C->varlist_size());
8361   for (auto *VE : C->varlists()) {
8362     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8363     if (EVar.isInvalid())
8364       return nullptr;
8365     Vars.push_back(EVar.get());
8366   }
8367   return getDerived().RebuildOMPLastprivateClause(
8368       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8369 }
8370 
8371 template <typename Derived>
8372 OMPClause *
8373 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8374   llvm::SmallVector<Expr *, 16> Vars;
8375   Vars.reserve(C->varlist_size());
8376   for (auto *VE : C->varlists()) {
8377     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8378     if (EVar.isInvalid())
8379       return nullptr;
8380     Vars.push_back(EVar.get());
8381   }
8382   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
8383                                              C->getLParenLoc(), C->getLocEnd());
8384 }
8385 
8386 template <typename Derived>
8387 OMPClause *
8388 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8389   llvm::SmallVector<Expr *, 16> Vars;
8390   Vars.reserve(C->varlist_size());
8391   for (auto *VE : C->varlists()) {
8392     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8393     if (EVar.isInvalid())
8394       return nullptr;
8395     Vars.push_back(EVar.get());
8396   }
8397   CXXScopeSpec ReductionIdScopeSpec;
8398   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8399 
8400   DeclarationNameInfo NameInfo = C->getNameInfo();
8401   if (NameInfo.getName()) {
8402     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8403     if (!NameInfo.getName())
8404       return nullptr;
8405   }
8406   // Build a list of all UDR decls with the same names ranged by the Scopes.
8407   // The Scope boundary is a duplication of the previous decl.
8408   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8409   for (auto *E : C->reduction_ops()) {
8410     // Transform all the decls.
8411     if (E) {
8412       auto *ULE = cast<UnresolvedLookupExpr>(E);
8413       UnresolvedSet<8> Decls;
8414       for (auto *D : ULE->decls()) {
8415         NamedDecl *InstD =
8416             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8417         Decls.addDecl(InstD, InstD->getAccess());
8418       }
8419       UnresolvedReductions.push_back(
8420        UnresolvedLookupExpr::Create(
8421           SemaRef.Context, /*NamingClass=*/nullptr,
8422           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8423           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8424           Decls.begin(), Decls.end()));
8425     } else
8426       UnresolvedReductions.push_back(nullptr);
8427   }
8428   return getDerived().RebuildOMPReductionClause(
8429       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8430       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8431 }
8432 
8433 template <typename Derived>
8434 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8435     OMPTaskReductionClause *C) {
8436   llvm::SmallVector<Expr *, 16> Vars;
8437   Vars.reserve(C->varlist_size());
8438   for (auto *VE : C->varlists()) {
8439     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8440     if (EVar.isInvalid())
8441       return nullptr;
8442     Vars.push_back(EVar.get());
8443   }
8444   CXXScopeSpec ReductionIdScopeSpec;
8445   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8446 
8447   DeclarationNameInfo NameInfo = C->getNameInfo();
8448   if (NameInfo.getName()) {
8449     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8450     if (!NameInfo.getName())
8451       return nullptr;
8452   }
8453   // Build a list of all UDR decls with the same names ranged by the Scopes.
8454   // The Scope boundary is a duplication of the previous decl.
8455   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8456   for (auto *E : C->reduction_ops()) {
8457     // Transform all the decls.
8458     if (E) {
8459       auto *ULE = cast<UnresolvedLookupExpr>(E);
8460       UnresolvedSet<8> Decls;
8461       for (auto *D : ULE->decls()) {
8462         NamedDecl *InstD =
8463             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8464         Decls.addDecl(InstD, InstD->getAccess());
8465       }
8466       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8467           SemaRef.Context, /*NamingClass=*/nullptr,
8468           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8469           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8470     } else
8471       UnresolvedReductions.push_back(nullptr);
8472   }
8473   return getDerived().RebuildOMPTaskReductionClause(
8474       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8475       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8476 }
8477 
8478 template <typename Derived>
8479 OMPClause *
8480 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
8481   llvm::SmallVector<Expr *, 16> Vars;
8482   Vars.reserve(C->varlist_size());
8483   for (auto *VE : C->varlists()) {
8484     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8485     if (EVar.isInvalid())
8486       return nullptr;
8487     Vars.push_back(EVar.get());
8488   }
8489   CXXScopeSpec ReductionIdScopeSpec;
8490   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8491 
8492   DeclarationNameInfo NameInfo = C->getNameInfo();
8493   if (NameInfo.getName()) {
8494     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8495     if (!NameInfo.getName())
8496       return nullptr;
8497   }
8498   // Build a list of all UDR decls with the same names ranged by the Scopes.
8499   // The Scope boundary is a duplication of the previous decl.
8500   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8501   for (auto *E : C->reduction_ops()) {
8502     // Transform all the decls.
8503     if (E) {
8504       auto *ULE = cast<UnresolvedLookupExpr>(E);
8505       UnresolvedSet<8> Decls;
8506       for (auto *D : ULE->decls()) {
8507         NamedDecl *InstD =
8508             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8509         Decls.addDecl(InstD, InstD->getAccess());
8510       }
8511       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8512           SemaRef.Context, /*NamingClass=*/nullptr,
8513           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8514           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8515     } else
8516       UnresolvedReductions.push_back(nullptr);
8517   }
8518   return getDerived().RebuildOMPInReductionClause(
8519       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8520       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8521 }
8522 
8523 template <typename Derived>
8524 OMPClause *
8525 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8526   llvm::SmallVector<Expr *, 16> Vars;
8527   Vars.reserve(C->varlist_size());
8528   for (auto *VE : C->varlists()) {
8529     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8530     if (EVar.isInvalid())
8531       return nullptr;
8532     Vars.push_back(EVar.get());
8533   }
8534   ExprResult Step = getDerived().TransformExpr(C->getStep());
8535   if (Step.isInvalid())
8536     return nullptr;
8537   return getDerived().RebuildOMPLinearClause(
8538       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
8539       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
8540 }
8541 
8542 template <typename Derived>
8543 OMPClause *
8544 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8545   llvm::SmallVector<Expr *, 16> Vars;
8546   Vars.reserve(C->varlist_size());
8547   for (auto *VE : C->varlists()) {
8548     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8549     if (EVar.isInvalid())
8550       return nullptr;
8551     Vars.push_back(EVar.get());
8552   }
8553   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8554   if (Alignment.isInvalid())
8555     return nullptr;
8556   return getDerived().RebuildOMPAlignedClause(
8557       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
8558       C->getColonLoc(), C->getLocEnd());
8559 }
8560 
8561 template <typename Derived>
8562 OMPClause *
8563 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8564   llvm::SmallVector<Expr *, 16> Vars;
8565   Vars.reserve(C->varlist_size());
8566   for (auto *VE : C->varlists()) {
8567     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8568     if (EVar.isInvalid())
8569       return nullptr;
8570     Vars.push_back(EVar.get());
8571   }
8572   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
8573                                              C->getLParenLoc(), C->getLocEnd());
8574 }
8575 
8576 template <typename Derived>
8577 OMPClause *
8578 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8579   llvm::SmallVector<Expr *, 16> Vars;
8580   Vars.reserve(C->varlist_size());
8581   for (auto *VE : C->varlists()) {
8582     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8583     if (EVar.isInvalid())
8584       return nullptr;
8585     Vars.push_back(EVar.get());
8586   }
8587   return getDerived().RebuildOMPCopyprivateClause(
8588       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8589 }
8590 
8591 template <typename Derived>
8592 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8593   llvm::SmallVector<Expr *, 16> Vars;
8594   Vars.reserve(C->varlist_size());
8595   for (auto *VE : C->varlists()) {
8596     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8597     if (EVar.isInvalid())
8598       return nullptr;
8599     Vars.push_back(EVar.get());
8600   }
8601   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
8602                                             C->getLParenLoc(), C->getLocEnd());
8603 }
8604 
8605 template <typename Derived>
8606 OMPClause *
8607 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8608   llvm::SmallVector<Expr *, 16> Vars;
8609   Vars.reserve(C->varlist_size());
8610   for (auto *VE : C->varlists()) {
8611     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8612     if (EVar.isInvalid())
8613       return nullptr;
8614     Vars.push_back(EVar.get());
8615   }
8616   return getDerived().RebuildOMPDependClause(
8617       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8618       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8619 }
8620 
8621 template <typename Derived>
8622 OMPClause *
8623 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8624   ExprResult E = getDerived().TransformExpr(C->getDevice());
8625   if (E.isInvalid())
8626     return nullptr;
8627   return getDerived().RebuildOMPDeviceClause(
8628       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8629 }
8630 
8631 template <typename Derived>
8632 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8633   llvm::SmallVector<Expr *, 16> Vars;
8634   Vars.reserve(C->varlist_size());
8635   for (auto *VE : C->varlists()) {
8636     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8637     if (EVar.isInvalid())
8638       return nullptr;
8639     Vars.push_back(EVar.get());
8640   }
8641   return getDerived().RebuildOMPMapClause(
8642       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8643       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8644       C->getLParenLoc(), C->getLocEnd());
8645 }
8646 
8647 template <typename Derived>
8648 OMPClause *
8649 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8650   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8651   if (E.isInvalid())
8652     return nullptr;
8653   return getDerived().RebuildOMPNumTeamsClause(
8654       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8655 }
8656 
8657 template <typename Derived>
8658 OMPClause *
8659 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8660   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8661   if (E.isInvalid())
8662     return nullptr;
8663   return getDerived().RebuildOMPThreadLimitClause(
8664       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8665 }
8666 
8667 template <typename Derived>
8668 OMPClause *
8669 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8670   ExprResult E = getDerived().TransformExpr(C->getPriority());
8671   if (E.isInvalid())
8672     return nullptr;
8673   return getDerived().RebuildOMPPriorityClause(
8674       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8675 }
8676 
8677 template <typename Derived>
8678 OMPClause *
8679 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8680   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8681   if (E.isInvalid())
8682     return nullptr;
8683   return getDerived().RebuildOMPGrainsizeClause(
8684       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8685 }
8686 
8687 template <typename Derived>
8688 OMPClause *
8689 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8690   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8691   if (E.isInvalid())
8692     return nullptr;
8693   return getDerived().RebuildOMPNumTasksClause(
8694       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8695 }
8696 
8697 template <typename Derived>
8698 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8699   ExprResult E = getDerived().TransformExpr(C->getHint());
8700   if (E.isInvalid())
8701     return nullptr;
8702   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8703                                            C->getLParenLoc(), C->getLocEnd());
8704 }
8705 
8706 template <typename Derived>
8707 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8708     OMPDistScheduleClause *C) {
8709   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8710   if (E.isInvalid())
8711     return nullptr;
8712   return getDerived().RebuildOMPDistScheduleClause(
8713       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8714       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8715 }
8716 
8717 template <typename Derived>
8718 OMPClause *
8719 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8720   return C;
8721 }
8722 
8723 template <typename Derived>
8724 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8725   llvm::SmallVector<Expr *, 16> Vars;
8726   Vars.reserve(C->varlist_size());
8727   for (auto *VE : C->varlists()) {
8728     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8729     if (EVar.isInvalid())
8730       return 0;
8731     Vars.push_back(EVar.get());
8732   }
8733   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8734                                          C->getLParenLoc(), C->getLocEnd());
8735 }
8736 
8737 template <typename Derived>
8738 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8739   llvm::SmallVector<Expr *, 16> Vars;
8740   Vars.reserve(C->varlist_size());
8741   for (auto *VE : C->varlists()) {
8742     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8743     if (EVar.isInvalid())
8744       return 0;
8745     Vars.push_back(EVar.get());
8746   }
8747   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8748                                            C->getLParenLoc(), C->getLocEnd());
8749 }
8750 
8751 template <typename Derived>
8752 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8753     OMPUseDevicePtrClause *C) {
8754   llvm::SmallVector<Expr *, 16> Vars;
8755   Vars.reserve(C->varlist_size());
8756   for (auto *VE : C->varlists()) {
8757     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8758     if (EVar.isInvalid())
8759       return nullptr;
8760     Vars.push_back(EVar.get());
8761   }
8762   return getDerived().RebuildOMPUseDevicePtrClause(
8763       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8764 }
8765 
8766 template <typename Derived>
8767 OMPClause *
8768 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8769   llvm::SmallVector<Expr *, 16> Vars;
8770   Vars.reserve(C->varlist_size());
8771   for (auto *VE : C->varlists()) {
8772     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8773     if (EVar.isInvalid())
8774       return nullptr;
8775     Vars.push_back(EVar.get());
8776   }
8777   return getDerived().RebuildOMPIsDevicePtrClause(
8778       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8779 }
8780 
8781 //===----------------------------------------------------------------------===//
8782 // Expression transformation
8783 //===----------------------------------------------------------------------===//
8784 template<typename Derived>
8785 ExprResult
8786 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8787   if (!E->isTypeDependent())
8788     return E;
8789 
8790   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8791                                             E->getIdentType());
8792 }
8793 
8794 template<typename Derived>
8795 ExprResult
8796 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8797   NestedNameSpecifierLoc QualifierLoc;
8798   if (E->getQualifierLoc()) {
8799     QualifierLoc
8800       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8801     if (!QualifierLoc)
8802       return ExprError();
8803   }
8804 
8805   ValueDecl *ND
8806     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8807                                                          E->getDecl()));
8808   if (!ND)
8809     return ExprError();
8810 
8811   DeclarationNameInfo NameInfo = E->getNameInfo();
8812   if (NameInfo.getName()) {
8813     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8814     if (!NameInfo.getName())
8815       return ExprError();
8816   }
8817 
8818   if (!getDerived().AlwaysRebuild() &&
8819       QualifierLoc == E->getQualifierLoc() &&
8820       ND == E->getDecl() &&
8821       NameInfo.getName() == E->getDecl()->getDeclName() &&
8822       !E->hasExplicitTemplateArgs()) {
8823 
8824     // Mark it referenced in the new context regardless.
8825     // FIXME: this is a bit instantiation-specific.
8826     SemaRef.MarkDeclRefReferenced(E);
8827 
8828     return E;
8829   }
8830 
8831   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8832   if (E->hasExplicitTemplateArgs()) {
8833     TemplateArgs = &TransArgs;
8834     TransArgs.setLAngleLoc(E->getLAngleLoc());
8835     TransArgs.setRAngleLoc(E->getRAngleLoc());
8836     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8837                                                 E->getNumTemplateArgs(),
8838                                                 TransArgs))
8839       return ExprError();
8840   }
8841 
8842   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8843                                          TemplateArgs);
8844 }
8845 
8846 template<typename Derived>
8847 ExprResult
8848 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8849   return E;
8850 }
8851 
8852 template<typename Derived>
8853 ExprResult
8854 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8855   return E;
8856 }
8857 
8858 template<typename Derived>
8859 ExprResult
8860 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8861   return E;
8862 }
8863 
8864 template<typename Derived>
8865 ExprResult
8866 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8867   return E;
8868 }
8869 
8870 template<typename Derived>
8871 ExprResult
8872 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8873   return E;
8874 }
8875 
8876 template<typename Derived>
8877 ExprResult
8878 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8879   if (FunctionDecl *FD = E->getDirectCallee())
8880     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8881   return SemaRef.MaybeBindToTemporary(E);
8882 }
8883 
8884 template<typename Derived>
8885 ExprResult
8886 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8887   ExprResult ControllingExpr =
8888     getDerived().TransformExpr(E->getControllingExpr());
8889   if (ControllingExpr.isInvalid())
8890     return ExprError();
8891 
8892   SmallVector<Expr *, 4> AssocExprs;
8893   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8894   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8895     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8896     if (TS) {
8897       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8898       if (!AssocType)
8899         return ExprError();
8900       AssocTypes.push_back(AssocType);
8901     } else {
8902       AssocTypes.push_back(nullptr);
8903     }
8904 
8905     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8906     if (AssocExpr.isInvalid())
8907       return ExprError();
8908     AssocExprs.push_back(AssocExpr.get());
8909   }
8910 
8911   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8912                                                   E->getDefaultLoc(),
8913                                                   E->getRParenLoc(),
8914                                                   ControllingExpr.get(),
8915                                                   AssocTypes,
8916                                                   AssocExprs);
8917 }
8918 
8919 template<typename Derived>
8920 ExprResult
8921 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8922   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8923   if (SubExpr.isInvalid())
8924     return ExprError();
8925 
8926   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8927     return E;
8928 
8929   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8930                                        E->getRParen());
8931 }
8932 
8933 /// \brief The operand of a unary address-of operator has special rules: it's
8934 /// allowed to refer to a non-static member of a class even if there's no 'this'
8935 /// object available.
8936 template<typename Derived>
8937 ExprResult
8938 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8939   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8940     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8941   else
8942     return getDerived().TransformExpr(E);
8943 }
8944 
8945 template<typename Derived>
8946 ExprResult
8947 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8948   ExprResult SubExpr;
8949   if (E->getOpcode() == UO_AddrOf)
8950     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8951   else
8952     SubExpr = TransformExpr(E->getSubExpr());
8953   if (SubExpr.isInvalid())
8954     return ExprError();
8955 
8956   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8957     return E;
8958 
8959   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
8960                                            E->getOpcode(),
8961                                            SubExpr.get());
8962 }
8963 
8964 template<typename Derived>
8965 ExprResult
8966 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
8967   // Transform the type.
8968   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
8969   if (!Type)
8970     return ExprError();
8971 
8972   // Transform all of the components into components similar to what the
8973   // parser uses.
8974   // FIXME: It would be slightly more efficient in the non-dependent case to
8975   // just map FieldDecls, rather than requiring the rebuilder to look for
8976   // the fields again. However, __builtin_offsetof is rare enough in
8977   // template code that we don't care.
8978   bool ExprChanged = false;
8979   typedef Sema::OffsetOfComponent Component;
8980   SmallVector<Component, 4> Components;
8981   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
8982     const OffsetOfNode &ON = E->getComponent(I);
8983     Component Comp;
8984     Comp.isBrackets = true;
8985     Comp.LocStart = ON.getSourceRange().getBegin();
8986     Comp.LocEnd = ON.getSourceRange().getEnd();
8987     switch (ON.getKind()) {
8988     case OffsetOfNode::Array: {
8989       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
8990       ExprResult Index = getDerived().TransformExpr(FromIndex);
8991       if (Index.isInvalid())
8992         return ExprError();
8993 
8994       ExprChanged = ExprChanged || Index.get() != FromIndex;
8995       Comp.isBrackets = true;
8996       Comp.U.E = Index.get();
8997       break;
8998     }
8999 
9000     case OffsetOfNode::Field:
9001     case OffsetOfNode::Identifier:
9002       Comp.isBrackets = false;
9003       Comp.U.IdentInfo = ON.getFieldName();
9004       if (!Comp.U.IdentInfo)
9005         continue;
9006 
9007       break;
9008 
9009     case OffsetOfNode::Base:
9010       // Will be recomputed during the rebuild.
9011       continue;
9012     }
9013 
9014     Components.push_back(Comp);
9015   }
9016 
9017   // If nothing changed, retain the existing expression.
9018   if (!getDerived().AlwaysRebuild() &&
9019       Type == E->getTypeSourceInfo() &&
9020       !ExprChanged)
9021     return E;
9022 
9023   // Build a new offsetof expression.
9024   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9025                                           Components, E->getRParenLoc());
9026 }
9027 
9028 template<typename Derived>
9029 ExprResult
9030 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9031   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9032          "opaque value expression requires transformation");
9033   return E;
9034 }
9035 
9036 template<typename Derived>
9037 ExprResult
9038 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9039   return E;
9040 }
9041 
9042 template<typename Derived>
9043 ExprResult
9044 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9045   // Rebuild the syntactic form.  The original syntactic form has
9046   // opaque-value expressions in it, so strip those away and rebuild
9047   // the result.  This is a really awful way of doing this, but the
9048   // better solution (rebuilding the semantic expressions and
9049   // rebinding OVEs as necessary) doesn't work; we'd need
9050   // TreeTransform to not strip away implicit conversions.
9051   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9052   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9053   if (result.isInvalid()) return ExprError();
9054 
9055   // If that gives us a pseudo-object result back, the pseudo-object
9056   // expression must have been an lvalue-to-rvalue conversion which we
9057   // should reapply.
9058   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9059     result = SemaRef.checkPseudoObjectRValue(result.get());
9060 
9061   return result;
9062 }
9063 
9064 template<typename Derived>
9065 ExprResult
9066 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9067                                                 UnaryExprOrTypeTraitExpr *E) {
9068   if (E->isArgumentType()) {
9069     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9070 
9071     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9072     if (!NewT)
9073       return ExprError();
9074 
9075     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9076       return E;
9077 
9078     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9079                                                     E->getKind(),
9080                                                     E->getSourceRange());
9081   }
9082 
9083   // C++0x [expr.sizeof]p1:
9084   //   The operand is either an expression, which is an unevaluated operand
9085   //   [...]
9086   EnterExpressionEvaluationContext Unevaluated(
9087       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9088       Sema::ReuseLambdaContextDecl);
9089 
9090   // Try to recover if we have something like sizeof(T::X) where X is a type.
9091   // Notably, there must be *exactly* one set of parens if X is a type.
9092   TypeSourceInfo *RecoveryTSI = nullptr;
9093   ExprResult SubExpr;
9094   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9095   if (auto *DRE =
9096           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9097     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9098         PE, DRE, false, &RecoveryTSI);
9099   else
9100     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9101 
9102   if (RecoveryTSI) {
9103     return getDerived().RebuildUnaryExprOrTypeTrait(
9104         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9105   } else if (SubExpr.isInvalid())
9106     return ExprError();
9107 
9108   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9109     return E;
9110 
9111   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9112                                                   E->getOperatorLoc(),
9113                                                   E->getKind(),
9114                                                   E->getSourceRange());
9115 }
9116 
9117 template<typename Derived>
9118 ExprResult
9119 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9120   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9121   if (LHS.isInvalid())
9122     return ExprError();
9123 
9124   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9125   if (RHS.isInvalid())
9126     return ExprError();
9127 
9128 
9129   if (!getDerived().AlwaysRebuild() &&
9130       LHS.get() == E->getLHS() &&
9131       RHS.get() == E->getRHS())
9132     return E;
9133 
9134   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
9135                                            /*FIXME:*/E->getLHS()->getLocStart(),
9136                                                 RHS.get(),
9137                                                 E->getRBracketLoc());
9138 }
9139 
9140 template <typename Derived>
9141 ExprResult
9142 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9143   ExprResult Base = getDerived().TransformExpr(E->getBase());
9144   if (Base.isInvalid())
9145     return ExprError();
9146 
9147   ExprResult LowerBound;
9148   if (E->getLowerBound()) {
9149     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9150     if (LowerBound.isInvalid())
9151       return ExprError();
9152   }
9153 
9154   ExprResult Length;
9155   if (E->getLength()) {
9156     Length = getDerived().TransformExpr(E->getLength());
9157     if (Length.isInvalid())
9158       return ExprError();
9159   }
9160 
9161   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9162       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9163     return E;
9164 
9165   return getDerived().RebuildOMPArraySectionExpr(
9166       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
9167       Length.get(), E->getRBracketLoc());
9168 }
9169 
9170 template<typename Derived>
9171 ExprResult
9172 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9173   // Transform the callee.
9174   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9175   if (Callee.isInvalid())
9176     return ExprError();
9177 
9178   // Transform arguments.
9179   bool ArgChanged = false;
9180   SmallVector<Expr*, 8> Args;
9181   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9182                                   &ArgChanged))
9183     return ExprError();
9184 
9185   if (!getDerived().AlwaysRebuild() &&
9186       Callee.get() == E->getCallee() &&
9187       !ArgChanged)
9188     return SemaRef.MaybeBindToTemporary(E);
9189 
9190   // FIXME: Wrong source location information for the '('.
9191   SourceLocation FakeLParenLoc
9192     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9193   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9194                                       Args,
9195                                       E->getRParenLoc());
9196 }
9197 
9198 template<typename Derived>
9199 ExprResult
9200 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9201   ExprResult Base = getDerived().TransformExpr(E->getBase());
9202   if (Base.isInvalid())
9203     return ExprError();
9204 
9205   NestedNameSpecifierLoc QualifierLoc;
9206   if (E->hasQualifier()) {
9207     QualifierLoc
9208       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9209 
9210     if (!QualifierLoc)
9211       return ExprError();
9212   }
9213   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9214 
9215   ValueDecl *Member
9216     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9217                                                          E->getMemberDecl()));
9218   if (!Member)
9219     return ExprError();
9220 
9221   NamedDecl *FoundDecl = E->getFoundDecl();
9222   if (FoundDecl == E->getMemberDecl()) {
9223     FoundDecl = Member;
9224   } else {
9225     FoundDecl = cast_or_null<NamedDecl>(
9226                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9227     if (!FoundDecl)
9228       return ExprError();
9229   }
9230 
9231   if (!getDerived().AlwaysRebuild() &&
9232       Base.get() == E->getBase() &&
9233       QualifierLoc == E->getQualifierLoc() &&
9234       Member == E->getMemberDecl() &&
9235       FoundDecl == E->getFoundDecl() &&
9236       !E->hasExplicitTemplateArgs()) {
9237 
9238     // Mark it referenced in the new context regardless.
9239     // FIXME: this is a bit instantiation-specific.
9240     SemaRef.MarkMemberReferenced(E);
9241 
9242     return E;
9243   }
9244 
9245   TemplateArgumentListInfo TransArgs;
9246   if (E->hasExplicitTemplateArgs()) {
9247     TransArgs.setLAngleLoc(E->getLAngleLoc());
9248     TransArgs.setRAngleLoc(E->getRAngleLoc());
9249     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9250                                                 E->getNumTemplateArgs(),
9251                                                 TransArgs))
9252       return ExprError();
9253   }
9254 
9255   // FIXME: Bogus source location for the operator
9256   SourceLocation FakeOperatorLoc =
9257       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9258 
9259   // FIXME: to do this check properly, we will need to preserve the
9260   // first-qualifier-in-scope here, just in case we had a dependent
9261   // base (and therefore couldn't do the check) and a
9262   // nested-name-qualifier (and therefore could do the lookup).
9263   NamedDecl *FirstQualifierInScope = nullptr;
9264   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9265   if (MemberNameInfo.getName()) {
9266     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9267     if (!MemberNameInfo.getName())
9268       return ExprError();
9269   }
9270 
9271   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9272                                         E->isArrow(),
9273                                         QualifierLoc,
9274                                         TemplateKWLoc,
9275                                         MemberNameInfo,
9276                                         Member,
9277                                         FoundDecl,
9278                                         (E->hasExplicitTemplateArgs()
9279                                            ? &TransArgs : nullptr),
9280                                         FirstQualifierInScope);
9281 }
9282 
9283 template<typename Derived>
9284 ExprResult
9285 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9286   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9287   if (LHS.isInvalid())
9288     return ExprError();
9289 
9290   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9291   if (RHS.isInvalid())
9292     return ExprError();
9293 
9294   if (!getDerived().AlwaysRebuild() &&
9295       LHS.get() == E->getLHS() &&
9296       RHS.get() == E->getRHS())
9297     return E;
9298 
9299   Sema::FPContractStateRAII FPContractState(getSema());
9300   getSema().FPFeatures = E->getFPFeatures();
9301 
9302   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9303                                             LHS.get(), RHS.get());
9304 }
9305 
9306 template<typename Derived>
9307 ExprResult
9308 TreeTransform<Derived>::TransformCompoundAssignOperator(
9309                                                       CompoundAssignOperator *E) {
9310   return getDerived().TransformBinaryOperator(E);
9311 }
9312 
9313 template<typename Derived>
9314 ExprResult TreeTransform<Derived>::
9315 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9316   // Just rebuild the common and RHS expressions and see whether we
9317   // get any changes.
9318 
9319   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9320   if (commonExpr.isInvalid())
9321     return ExprError();
9322 
9323   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9324   if (rhs.isInvalid())
9325     return ExprError();
9326 
9327   if (!getDerived().AlwaysRebuild() &&
9328       commonExpr.get() == e->getCommon() &&
9329       rhs.get() == e->getFalseExpr())
9330     return e;
9331 
9332   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9333                                                  e->getQuestionLoc(),
9334                                                  nullptr,
9335                                                  e->getColonLoc(),
9336                                                  rhs.get());
9337 }
9338 
9339 template<typename Derived>
9340 ExprResult
9341 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9342   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9343   if (Cond.isInvalid())
9344     return ExprError();
9345 
9346   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9347   if (LHS.isInvalid())
9348     return ExprError();
9349 
9350   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9351   if (RHS.isInvalid())
9352     return ExprError();
9353 
9354   if (!getDerived().AlwaysRebuild() &&
9355       Cond.get() == E->getCond() &&
9356       LHS.get() == E->getLHS() &&
9357       RHS.get() == E->getRHS())
9358     return E;
9359 
9360   return getDerived().RebuildConditionalOperator(Cond.get(),
9361                                                  E->getQuestionLoc(),
9362                                                  LHS.get(),
9363                                                  E->getColonLoc(),
9364                                                  RHS.get());
9365 }
9366 
9367 template<typename Derived>
9368 ExprResult
9369 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9370   // Implicit casts are eliminated during transformation, since they
9371   // will be recomputed by semantic analysis after transformation.
9372   return getDerived().TransformExpr(E->getSubExprAsWritten());
9373 }
9374 
9375 template<typename Derived>
9376 ExprResult
9377 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9378   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9379   if (!Type)
9380     return ExprError();
9381 
9382   ExprResult SubExpr
9383     = getDerived().TransformExpr(E->getSubExprAsWritten());
9384   if (SubExpr.isInvalid())
9385     return ExprError();
9386 
9387   if (!getDerived().AlwaysRebuild() &&
9388       Type == E->getTypeInfoAsWritten() &&
9389       SubExpr.get() == E->getSubExpr())
9390     return E;
9391 
9392   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9393                                             Type,
9394                                             E->getRParenLoc(),
9395                                             SubExpr.get());
9396 }
9397 
9398 template<typename Derived>
9399 ExprResult
9400 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9401   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9402   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9403   if (!NewT)
9404     return ExprError();
9405 
9406   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9407   if (Init.isInvalid())
9408     return ExprError();
9409 
9410   if (!getDerived().AlwaysRebuild() &&
9411       OldT == NewT &&
9412       Init.get() == E->getInitializer())
9413     return SemaRef.MaybeBindToTemporary(E);
9414 
9415   // Note: the expression type doesn't necessarily match the
9416   // type-as-written, but that's okay, because it should always be
9417   // derivable from the initializer.
9418 
9419   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
9420                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
9421                                                  Init.get());
9422 }
9423 
9424 template<typename Derived>
9425 ExprResult
9426 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9427   ExprResult Base = getDerived().TransformExpr(E->getBase());
9428   if (Base.isInvalid())
9429     return ExprError();
9430 
9431   if (!getDerived().AlwaysRebuild() &&
9432       Base.get() == E->getBase())
9433     return E;
9434 
9435   // FIXME: Bad source location
9436   SourceLocation FakeOperatorLoc =
9437       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
9438   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9439                                                   E->getAccessorLoc(),
9440                                                   E->getAccessor());
9441 }
9442 
9443 template<typename Derived>
9444 ExprResult
9445 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9446   if (InitListExpr *Syntactic = E->getSyntacticForm())
9447     E = Syntactic;
9448 
9449   bool InitChanged = false;
9450 
9451   SmallVector<Expr*, 4> Inits;
9452   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9453                                   Inits, &InitChanged))
9454     return ExprError();
9455 
9456   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9457     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9458     // in some cases. We can't reuse it in general, because the syntactic and
9459     // semantic forms are linked, and we can't know that semantic form will
9460     // match even if the syntactic form does.
9461   }
9462 
9463   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9464                                       E->getRBraceLoc(), E->getType());
9465 }
9466 
9467 template<typename Derived>
9468 ExprResult
9469 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9470   Designation Desig;
9471 
9472   // transform the initializer value
9473   ExprResult Init = getDerived().TransformExpr(E->getInit());
9474   if (Init.isInvalid())
9475     return ExprError();
9476 
9477   // transform the designators.
9478   SmallVector<Expr*, 4> ArrayExprs;
9479   bool ExprChanged = false;
9480   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9481     if (D.isFieldDesignator()) {
9482       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9483                                                D.getDotLoc(),
9484                                                D.getFieldLoc()));
9485       if (D.getField()) {
9486         FieldDecl *Field = cast_or_null<FieldDecl>(
9487             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9488         if (Field != D.getField())
9489           // Rebuild the expression when the transformed FieldDecl is
9490           // different to the already assigned FieldDecl.
9491           ExprChanged = true;
9492       } else {
9493         // Ensure that the designator expression is rebuilt when there isn't
9494         // a resolved FieldDecl in the designator as we don't want to assign
9495         // a FieldDecl to a pattern designator that will be instantiated again.
9496         ExprChanged = true;
9497       }
9498       continue;
9499     }
9500 
9501     if (D.isArrayDesignator()) {
9502       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9503       if (Index.isInvalid())
9504         return ExprError();
9505 
9506       Desig.AddDesignator(
9507           Designator::getArray(Index.get(), D.getLBracketLoc()));
9508 
9509       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9510       ArrayExprs.push_back(Index.get());
9511       continue;
9512     }
9513 
9514     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9515     ExprResult Start
9516       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9517     if (Start.isInvalid())
9518       return ExprError();
9519 
9520     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9521     if (End.isInvalid())
9522       return ExprError();
9523 
9524     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9525                                                   End.get(),
9526                                                   D.getLBracketLoc(),
9527                                                   D.getEllipsisLoc()));
9528 
9529     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9530                   End.get() != E->getArrayRangeEnd(D);
9531 
9532     ArrayExprs.push_back(Start.get());
9533     ArrayExprs.push_back(End.get());
9534   }
9535 
9536   if (!getDerived().AlwaysRebuild() &&
9537       Init.get() == E->getInit() &&
9538       !ExprChanged)
9539     return E;
9540 
9541   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9542                                                 E->getEqualOrColonLoc(),
9543                                                 E->usesGNUSyntax(), Init.get());
9544 }
9545 
9546 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9547 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9548 template<typename Derived>
9549 ExprResult
9550 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9551     DesignatedInitUpdateExpr *E) {
9552   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9553                    "initializer");
9554   return ExprError();
9555 }
9556 
9557 template<typename Derived>
9558 ExprResult
9559 TreeTransform<Derived>::TransformNoInitExpr(
9560     NoInitExpr *E) {
9561   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9562   return ExprError();
9563 }
9564 
9565 template<typename Derived>
9566 ExprResult
9567 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9568   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9569   return ExprError();
9570 }
9571 
9572 template<typename Derived>
9573 ExprResult
9574 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9575   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9576   return ExprError();
9577 }
9578 
9579 template<typename Derived>
9580 ExprResult
9581 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9582                                                      ImplicitValueInitExpr *E) {
9583   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9584 
9585   // FIXME: Will we ever have proper type location here? Will we actually
9586   // need to transform the type?
9587   QualType T = getDerived().TransformType(E->getType());
9588   if (T.isNull())
9589     return ExprError();
9590 
9591   if (!getDerived().AlwaysRebuild() &&
9592       T == E->getType())
9593     return E;
9594 
9595   return getDerived().RebuildImplicitValueInitExpr(T);
9596 }
9597 
9598 template<typename Derived>
9599 ExprResult
9600 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9601   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9602   if (!TInfo)
9603     return ExprError();
9604 
9605   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9606   if (SubExpr.isInvalid())
9607     return ExprError();
9608 
9609   if (!getDerived().AlwaysRebuild() &&
9610       TInfo == E->getWrittenTypeInfo() &&
9611       SubExpr.get() == E->getSubExpr())
9612     return E;
9613 
9614   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9615                                        TInfo, E->getRParenLoc());
9616 }
9617 
9618 template<typename Derived>
9619 ExprResult
9620 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9621   bool ArgumentChanged = false;
9622   SmallVector<Expr*, 4> Inits;
9623   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9624                      &ArgumentChanged))
9625     return ExprError();
9626 
9627   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9628                                            Inits,
9629                                            E->getRParenLoc());
9630 }
9631 
9632 /// \brief Transform an address-of-label expression.
9633 ///
9634 /// By default, the transformation of an address-of-label expression always
9635 /// rebuilds the expression, so that the label identifier can be resolved to
9636 /// the corresponding label statement by semantic analysis.
9637 template<typename Derived>
9638 ExprResult
9639 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9640   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9641                                         E->getLabel());
9642   if (!LD)
9643     return ExprError();
9644 
9645   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9646                                            cast<LabelDecl>(LD));
9647 }
9648 
9649 template<typename Derived>
9650 ExprResult
9651 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9652   SemaRef.ActOnStartStmtExpr();
9653   StmtResult SubStmt
9654     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9655   if (SubStmt.isInvalid()) {
9656     SemaRef.ActOnStmtExprError();
9657     return ExprError();
9658   }
9659 
9660   if (!getDerived().AlwaysRebuild() &&
9661       SubStmt.get() == E->getSubStmt()) {
9662     // Calling this an 'error' is unintuitive, but it does the right thing.
9663     SemaRef.ActOnStmtExprError();
9664     return SemaRef.MaybeBindToTemporary(E);
9665   }
9666 
9667   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9668                                       SubStmt.get(),
9669                                       E->getRParenLoc());
9670 }
9671 
9672 template<typename Derived>
9673 ExprResult
9674 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9675   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9676   if (Cond.isInvalid())
9677     return ExprError();
9678 
9679   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9680   if (LHS.isInvalid())
9681     return ExprError();
9682 
9683   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9684   if (RHS.isInvalid())
9685     return ExprError();
9686 
9687   if (!getDerived().AlwaysRebuild() &&
9688       Cond.get() == E->getCond() &&
9689       LHS.get() == E->getLHS() &&
9690       RHS.get() == E->getRHS())
9691     return E;
9692 
9693   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9694                                         Cond.get(), LHS.get(), RHS.get(),
9695                                         E->getRParenLoc());
9696 }
9697 
9698 template<typename Derived>
9699 ExprResult
9700 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9701   return E;
9702 }
9703 
9704 template<typename Derived>
9705 ExprResult
9706 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9707   switch (E->getOperator()) {
9708   case OO_New:
9709   case OO_Delete:
9710   case OO_Array_New:
9711   case OO_Array_Delete:
9712     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9713 
9714   case OO_Call: {
9715     // This is a call to an object's operator().
9716     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9717 
9718     // Transform the object itself.
9719     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9720     if (Object.isInvalid())
9721       return ExprError();
9722 
9723     // FIXME: Poor location information
9724     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9725         static_cast<Expr *>(Object.get())->getLocEnd());
9726 
9727     // Transform the call arguments.
9728     SmallVector<Expr*, 8> Args;
9729     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9730                                     Args))
9731       return ExprError();
9732 
9733     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9734                                         Args,
9735                                         E->getLocEnd());
9736   }
9737 
9738 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9739   case OO_##Name:
9740 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9741 #include "clang/Basic/OperatorKinds.def"
9742   case OO_Subscript:
9743     // Handled below.
9744     break;
9745 
9746   case OO_Conditional:
9747     llvm_unreachable("conditional operator is not actually overloadable");
9748 
9749   case OO_None:
9750   case NUM_OVERLOADED_OPERATORS:
9751     llvm_unreachable("not an overloaded operator?");
9752   }
9753 
9754   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9755   if (Callee.isInvalid())
9756     return ExprError();
9757 
9758   ExprResult First;
9759   if (E->getOperator() == OO_Amp)
9760     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9761   else
9762     First = getDerived().TransformExpr(E->getArg(0));
9763   if (First.isInvalid())
9764     return ExprError();
9765 
9766   ExprResult Second;
9767   if (E->getNumArgs() == 2) {
9768     Second = getDerived().TransformExpr(E->getArg(1));
9769     if (Second.isInvalid())
9770       return ExprError();
9771   }
9772 
9773   if (!getDerived().AlwaysRebuild() &&
9774       Callee.get() == E->getCallee() &&
9775       First.get() == E->getArg(0) &&
9776       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9777     return SemaRef.MaybeBindToTemporary(E);
9778 
9779   Sema::FPContractStateRAII FPContractState(getSema());
9780   getSema().FPFeatures = E->getFPFeatures();
9781 
9782   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9783                                                  E->getOperatorLoc(),
9784                                                  Callee.get(),
9785                                                  First.get(),
9786                                                  Second.get());
9787 }
9788 
9789 template<typename Derived>
9790 ExprResult
9791 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9792   return getDerived().TransformCallExpr(E);
9793 }
9794 
9795 template<typename Derived>
9796 ExprResult
9797 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9798   // Transform the callee.
9799   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9800   if (Callee.isInvalid())
9801     return ExprError();
9802 
9803   // Transform exec config.
9804   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9805   if (EC.isInvalid())
9806     return ExprError();
9807 
9808   // Transform arguments.
9809   bool ArgChanged = false;
9810   SmallVector<Expr*, 8> Args;
9811   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9812                                   &ArgChanged))
9813     return ExprError();
9814 
9815   if (!getDerived().AlwaysRebuild() &&
9816       Callee.get() == E->getCallee() &&
9817       !ArgChanged)
9818     return SemaRef.MaybeBindToTemporary(E);
9819 
9820   // FIXME: Wrong source location information for the '('.
9821   SourceLocation FakeLParenLoc
9822     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9823   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9824                                       Args,
9825                                       E->getRParenLoc(), EC.get());
9826 }
9827 
9828 template<typename Derived>
9829 ExprResult
9830 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9831   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9832   if (!Type)
9833     return ExprError();
9834 
9835   ExprResult SubExpr
9836     = getDerived().TransformExpr(E->getSubExprAsWritten());
9837   if (SubExpr.isInvalid())
9838     return ExprError();
9839 
9840   if (!getDerived().AlwaysRebuild() &&
9841       Type == E->getTypeInfoAsWritten() &&
9842       SubExpr.get() == E->getSubExpr())
9843     return E;
9844   return getDerived().RebuildCXXNamedCastExpr(
9845       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9846       Type, E->getAngleBrackets().getEnd(),
9847       // FIXME. this should be '(' location
9848       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9849 }
9850 
9851 template<typename Derived>
9852 ExprResult
9853 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9854   return getDerived().TransformCXXNamedCastExpr(E);
9855 }
9856 
9857 template<typename Derived>
9858 ExprResult
9859 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9860   return getDerived().TransformCXXNamedCastExpr(E);
9861 }
9862 
9863 template<typename Derived>
9864 ExprResult
9865 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9866                                                       CXXReinterpretCastExpr *E) {
9867   return getDerived().TransformCXXNamedCastExpr(E);
9868 }
9869 
9870 template<typename Derived>
9871 ExprResult
9872 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9873   return getDerived().TransformCXXNamedCastExpr(E);
9874 }
9875 
9876 template<typename Derived>
9877 ExprResult
9878 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9879                                                      CXXFunctionalCastExpr *E) {
9880   TypeSourceInfo *Type =
9881       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
9882   if (!Type)
9883     return ExprError();
9884 
9885   ExprResult SubExpr
9886     = getDerived().TransformExpr(E->getSubExprAsWritten());
9887   if (SubExpr.isInvalid())
9888     return ExprError();
9889 
9890   if (!getDerived().AlwaysRebuild() &&
9891       Type == E->getTypeInfoAsWritten() &&
9892       SubExpr.get() == E->getSubExpr())
9893     return E;
9894 
9895   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9896                                                    E->getLParenLoc(),
9897                                                    SubExpr.get(),
9898                                                    E->getRParenLoc());
9899 }
9900 
9901 template<typename Derived>
9902 ExprResult
9903 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9904   if (E->isTypeOperand()) {
9905     TypeSourceInfo *TInfo
9906       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9907     if (!TInfo)
9908       return ExprError();
9909 
9910     if (!getDerived().AlwaysRebuild() &&
9911         TInfo == E->getTypeOperandSourceInfo())
9912       return E;
9913 
9914     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9915                                              E->getLocStart(),
9916                                              TInfo,
9917                                              E->getLocEnd());
9918   }
9919 
9920   // We don't know whether the subexpression is potentially evaluated until
9921   // after we perform semantic analysis.  We speculatively assume it is
9922   // unevaluated; it will get fixed later if the subexpression is in fact
9923   // potentially evaluated.
9924   EnterExpressionEvaluationContext Unevaluated(
9925       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9926       Sema::ReuseLambdaContextDecl);
9927 
9928   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9929   if (SubExpr.isInvalid())
9930     return ExprError();
9931 
9932   if (!getDerived().AlwaysRebuild() &&
9933       SubExpr.get() == E->getExprOperand())
9934     return E;
9935 
9936   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9937                                            E->getLocStart(),
9938                                            SubExpr.get(),
9939                                            E->getLocEnd());
9940 }
9941 
9942 template<typename Derived>
9943 ExprResult
9944 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9945   if (E->isTypeOperand()) {
9946     TypeSourceInfo *TInfo
9947       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9948     if (!TInfo)
9949       return ExprError();
9950 
9951     if (!getDerived().AlwaysRebuild() &&
9952         TInfo == E->getTypeOperandSourceInfo())
9953       return E;
9954 
9955     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9956                                              E->getLocStart(),
9957                                              TInfo,
9958                                              E->getLocEnd());
9959   }
9960 
9961   EnterExpressionEvaluationContext Unevaluated(
9962       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
9963 
9964   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9965   if (SubExpr.isInvalid())
9966     return ExprError();
9967 
9968   if (!getDerived().AlwaysRebuild() &&
9969       SubExpr.get() == E->getExprOperand())
9970     return E;
9971 
9972   return getDerived().RebuildCXXUuidofExpr(E->getType(),
9973                                            E->getLocStart(),
9974                                            SubExpr.get(),
9975                                            E->getLocEnd());
9976 }
9977 
9978 template<typename Derived>
9979 ExprResult
9980 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
9981   return E;
9982 }
9983 
9984 template<typename Derived>
9985 ExprResult
9986 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
9987                                                      CXXNullPtrLiteralExpr *E) {
9988   return E;
9989 }
9990 
9991 template<typename Derived>
9992 ExprResult
9993 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
9994   QualType T = getSema().getCurrentThisType();
9995 
9996   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
9997     // Make sure that we capture 'this'.
9998     getSema().CheckCXXThisCapture(E->getLocStart());
9999     return E;
10000   }
10001 
10002   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
10003 }
10004 
10005 template<typename Derived>
10006 ExprResult
10007 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10008   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10009   if (SubExpr.isInvalid())
10010     return ExprError();
10011 
10012   if (!getDerived().AlwaysRebuild() &&
10013       SubExpr.get() == E->getSubExpr())
10014     return E;
10015 
10016   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10017                                           E->isThrownVariableInScope());
10018 }
10019 
10020 template<typename Derived>
10021 ExprResult
10022 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10023   ParmVarDecl *Param
10024     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
10025                                                            E->getParam()));
10026   if (!Param)
10027     return ExprError();
10028 
10029   if (!getDerived().AlwaysRebuild() &&
10030       Param == E->getParam())
10031     return E;
10032 
10033   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10034 }
10035 
10036 template<typename Derived>
10037 ExprResult
10038 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10039   FieldDecl *Field
10040     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
10041                                                          E->getField()));
10042   if (!Field)
10043     return ExprError();
10044 
10045   if (!getDerived().AlwaysRebuild() && Field == E->getField())
10046     return E;
10047 
10048   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10049 }
10050 
10051 template<typename Derived>
10052 ExprResult
10053 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10054                                                     CXXScalarValueInitExpr *E) {
10055   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10056   if (!T)
10057     return ExprError();
10058 
10059   if (!getDerived().AlwaysRebuild() &&
10060       T == E->getTypeSourceInfo())
10061     return E;
10062 
10063   return getDerived().RebuildCXXScalarValueInitExpr(T,
10064                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10065                                                     E->getRParenLoc());
10066 }
10067 
10068 template<typename Derived>
10069 ExprResult
10070 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10071   // Transform the type that we're allocating
10072   TypeSourceInfo *AllocTypeInfo =
10073       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10074   if (!AllocTypeInfo)
10075     return ExprError();
10076 
10077   // Transform the size of the array we're allocating (if any).
10078   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
10079   if (ArraySize.isInvalid())
10080     return ExprError();
10081 
10082   // Transform the placement arguments (if any).
10083   bool ArgumentChanged = false;
10084   SmallVector<Expr*, 8> PlacementArgs;
10085   if (getDerived().TransformExprs(E->getPlacementArgs(),
10086                                   E->getNumPlacementArgs(), true,
10087                                   PlacementArgs, &ArgumentChanged))
10088     return ExprError();
10089 
10090   // Transform the initializer (if any).
10091   Expr *OldInit = E->getInitializer();
10092   ExprResult NewInit;
10093   if (OldInit)
10094     NewInit = getDerived().TransformInitializer(OldInit, true);
10095   if (NewInit.isInvalid())
10096     return ExprError();
10097 
10098   // Transform new operator and delete operator.
10099   FunctionDecl *OperatorNew = nullptr;
10100   if (E->getOperatorNew()) {
10101     OperatorNew = cast_or_null<FunctionDecl>(
10102                                  getDerived().TransformDecl(E->getLocStart(),
10103                                                          E->getOperatorNew()));
10104     if (!OperatorNew)
10105       return ExprError();
10106   }
10107 
10108   FunctionDecl *OperatorDelete = nullptr;
10109   if (E->getOperatorDelete()) {
10110     OperatorDelete = cast_or_null<FunctionDecl>(
10111                                    getDerived().TransformDecl(E->getLocStart(),
10112                                                        E->getOperatorDelete()));
10113     if (!OperatorDelete)
10114       return ExprError();
10115   }
10116 
10117   if (!getDerived().AlwaysRebuild() &&
10118       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10119       ArraySize.get() == E->getArraySize() &&
10120       NewInit.get() == OldInit &&
10121       OperatorNew == E->getOperatorNew() &&
10122       OperatorDelete == E->getOperatorDelete() &&
10123       !ArgumentChanged) {
10124     // Mark any declarations we need as referenced.
10125     // FIXME: instantiation-specific.
10126     if (OperatorNew)
10127       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
10128     if (OperatorDelete)
10129       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
10130 
10131     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10132       QualType ElementType
10133         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10134       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10135         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10136         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10137           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
10138         }
10139       }
10140     }
10141 
10142     return E;
10143   }
10144 
10145   QualType AllocType = AllocTypeInfo->getType();
10146   if (!ArraySize.get()) {
10147     // If no array size was specified, but the new expression was
10148     // instantiated with an array type (e.g., "new T" where T is
10149     // instantiated with "int[4]"), extract the outer bound from the
10150     // array type as our array size. We do this with constant and
10151     // dependently-sized array types.
10152     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10153     if (!ArrayT) {
10154       // Do nothing
10155     } else if (const ConstantArrayType *ConsArrayT
10156                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10157       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10158                                          SemaRef.Context.getSizeType(),
10159                                          /*FIXME:*/ E->getLocStart());
10160       AllocType = ConsArrayT->getElementType();
10161     } else if (const DependentSizedArrayType *DepArrayT
10162                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10163       if (DepArrayT->getSizeExpr()) {
10164         ArraySize = DepArrayT->getSizeExpr();
10165         AllocType = DepArrayT->getElementType();
10166       }
10167     }
10168   }
10169 
10170   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
10171                                         E->isGlobalNew(),
10172                                         /*FIXME:*/E->getLocStart(),
10173                                         PlacementArgs,
10174                                         /*FIXME:*/E->getLocStart(),
10175                                         E->getTypeIdParens(),
10176                                         AllocType,
10177                                         AllocTypeInfo,
10178                                         ArraySize.get(),
10179                                         E->getDirectInitRange(),
10180                                         NewInit.get());
10181 }
10182 
10183 template<typename Derived>
10184 ExprResult
10185 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10186   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10187   if (Operand.isInvalid())
10188     return ExprError();
10189 
10190   // Transform the delete operator, if known.
10191   FunctionDecl *OperatorDelete = nullptr;
10192   if (E->getOperatorDelete()) {
10193     OperatorDelete = cast_or_null<FunctionDecl>(
10194                                    getDerived().TransformDecl(E->getLocStart(),
10195                                                        E->getOperatorDelete()));
10196     if (!OperatorDelete)
10197       return ExprError();
10198   }
10199 
10200   if (!getDerived().AlwaysRebuild() &&
10201       Operand.get() == E->getArgument() &&
10202       OperatorDelete == E->getOperatorDelete()) {
10203     // Mark any declarations we need as referenced.
10204     // FIXME: instantiation-specific.
10205     if (OperatorDelete)
10206       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
10207 
10208     if (!E->getArgument()->isTypeDependent()) {
10209       QualType Destroyed = SemaRef.Context.getBaseElementType(
10210                                                          E->getDestroyedType());
10211       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10212         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10213         SemaRef.MarkFunctionReferenced(E->getLocStart(),
10214                                        SemaRef.LookupDestructor(Record));
10215       }
10216     }
10217 
10218     return E;
10219   }
10220 
10221   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
10222                                            E->isGlobalDelete(),
10223                                            E->isArrayForm(),
10224                                            Operand.get());
10225 }
10226 
10227 template<typename Derived>
10228 ExprResult
10229 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10230                                                      CXXPseudoDestructorExpr *E) {
10231   ExprResult Base = getDerived().TransformExpr(E->getBase());
10232   if (Base.isInvalid())
10233     return ExprError();
10234 
10235   ParsedType ObjectTypePtr;
10236   bool MayBePseudoDestructor = false;
10237   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10238                                               E->getOperatorLoc(),
10239                                         E->isArrow()? tok::arrow : tok::period,
10240                                               ObjectTypePtr,
10241                                               MayBePseudoDestructor);
10242   if (Base.isInvalid())
10243     return ExprError();
10244 
10245   QualType ObjectType = ObjectTypePtr.get();
10246   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10247   if (QualifierLoc) {
10248     QualifierLoc
10249       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10250     if (!QualifierLoc)
10251       return ExprError();
10252   }
10253   CXXScopeSpec SS;
10254   SS.Adopt(QualifierLoc);
10255 
10256   PseudoDestructorTypeStorage Destroyed;
10257   if (E->getDestroyedTypeInfo()) {
10258     TypeSourceInfo *DestroyedTypeInfo
10259       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10260                                                 ObjectType, nullptr, SS);
10261     if (!DestroyedTypeInfo)
10262       return ExprError();
10263     Destroyed = DestroyedTypeInfo;
10264   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10265     // We aren't likely to be able to resolve the identifier down to a type
10266     // now anyway, so just retain the identifier.
10267     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10268                                             E->getDestroyedTypeLoc());
10269   } else {
10270     // Look for a destructor known with the given name.
10271     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10272                                               *E->getDestroyedTypeIdentifier(),
10273                                                 E->getDestroyedTypeLoc(),
10274                                                 /*Scope=*/nullptr,
10275                                                 SS, ObjectTypePtr,
10276                                                 false);
10277     if (!T)
10278       return ExprError();
10279 
10280     Destroyed
10281       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10282                                                  E->getDestroyedTypeLoc());
10283   }
10284 
10285   TypeSourceInfo *ScopeTypeInfo = nullptr;
10286   if (E->getScopeTypeInfo()) {
10287     CXXScopeSpec EmptySS;
10288     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10289                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10290     if (!ScopeTypeInfo)
10291       return ExprError();
10292   }
10293 
10294   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10295                                                      E->getOperatorLoc(),
10296                                                      E->isArrow(),
10297                                                      SS,
10298                                                      ScopeTypeInfo,
10299                                                      E->getColonColonLoc(),
10300                                                      E->getTildeLoc(),
10301                                                      Destroyed);
10302 }
10303 
10304 template <typename Derived>
10305 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10306                                                         bool RequiresADL,
10307                                                         LookupResult &R) {
10308   // Transform all the decls.
10309   bool AllEmptyPacks = true;
10310   for (auto *OldD : Old->decls()) {
10311     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10312     if (!InstD) {
10313       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10314       // This can happen because of dependent hiding.
10315       if (isa<UsingShadowDecl>(OldD))
10316         continue;
10317       else {
10318         R.clear();
10319         return true;
10320       }
10321     }
10322 
10323     // Expand using pack declarations.
10324     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10325     ArrayRef<NamedDecl*> Decls = SingleDecl;
10326     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10327       Decls = UPD->expansions();
10328 
10329     // Expand using declarations.
10330     for (auto *D : Decls) {
10331       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10332         for (auto *SD : UD->shadows())
10333           R.addDecl(SD);
10334       } else {
10335         R.addDecl(D);
10336       }
10337     }
10338 
10339     AllEmptyPacks &= Decls.empty();
10340   };
10341 
10342   // C++ [temp.res]/8.4.2:
10343   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10344   //   a name in the template definition found a using-declaration, but the
10345   //   lookup in the corresponding scope in the instantiation odoes not find
10346   //   any declarations because the using-declaration was a pack expansion and
10347   //   the corresponding pack is empty
10348   if (AllEmptyPacks && !RequiresADL) {
10349     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10350         << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName();
10351     return true;
10352   }
10353 
10354   // Resolve a kind, but don't do any further analysis.  If it's
10355   // ambiguous, the callee needs to deal with it.
10356   R.resolveKind();
10357   return false;
10358 }
10359 
10360 template<typename Derived>
10361 ExprResult
10362 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10363                                                   UnresolvedLookupExpr *Old) {
10364   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10365                  Sema::LookupOrdinaryName);
10366 
10367   // Transform the declaration set.
10368   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10369     return ExprError();
10370 
10371   // Rebuild the nested-name qualifier, if present.
10372   CXXScopeSpec SS;
10373   if (Old->getQualifierLoc()) {
10374     NestedNameSpecifierLoc QualifierLoc
10375       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10376     if (!QualifierLoc)
10377       return ExprError();
10378 
10379     SS.Adopt(QualifierLoc);
10380   }
10381 
10382   if (Old->getNamingClass()) {
10383     CXXRecordDecl *NamingClass
10384       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10385                                                             Old->getNameLoc(),
10386                                                         Old->getNamingClass()));
10387     if (!NamingClass) {
10388       R.clear();
10389       return ExprError();
10390     }
10391 
10392     R.setNamingClass(NamingClass);
10393   }
10394 
10395   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10396 
10397   // If we have neither explicit template arguments, nor the template keyword,
10398   // it's a normal declaration name or member reference.
10399   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10400     NamedDecl *D = R.getAsSingle<NamedDecl>();
10401     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10402     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10403     // give a good diagnostic.
10404     if (D && D->isCXXInstanceMember()) {
10405       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10406                                                      /*TemplateArgs=*/nullptr,
10407                                                      /*Scope=*/nullptr);
10408     }
10409 
10410     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10411   }
10412 
10413   // If we have template arguments, rebuild them, then rebuild the
10414   // templateid expression.
10415   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10416   if (Old->hasExplicitTemplateArgs() &&
10417       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10418                                               Old->getNumTemplateArgs(),
10419                                               TransArgs)) {
10420     R.clear();
10421     return ExprError();
10422   }
10423 
10424   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10425                                             Old->requiresADL(), &TransArgs);
10426 }
10427 
10428 template<typename Derived>
10429 ExprResult
10430 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10431   bool ArgChanged = false;
10432   SmallVector<TypeSourceInfo *, 4> Args;
10433   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10434     TypeSourceInfo *From = E->getArg(I);
10435     TypeLoc FromTL = From->getTypeLoc();
10436     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10437       TypeLocBuilder TLB;
10438       TLB.reserve(FromTL.getFullDataSize());
10439       QualType To = getDerived().TransformType(TLB, FromTL);
10440       if (To.isNull())
10441         return ExprError();
10442 
10443       if (To == From->getType())
10444         Args.push_back(From);
10445       else {
10446         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10447         ArgChanged = true;
10448       }
10449       continue;
10450     }
10451 
10452     ArgChanged = true;
10453 
10454     // We have a pack expansion. Instantiate it.
10455     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10456     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10457     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10458     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10459 
10460     // Determine whether the set of unexpanded parameter packs can and should
10461     // be expanded.
10462     bool Expand = true;
10463     bool RetainExpansion = false;
10464     Optional<unsigned> OrigNumExpansions =
10465         ExpansionTL.getTypePtr()->getNumExpansions();
10466     Optional<unsigned> NumExpansions = OrigNumExpansions;
10467     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10468                                              PatternTL.getSourceRange(),
10469                                              Unexpanded,
10470                                              Expand, RetainExpansion,
10471                                              NumExpansions))
10472       return ExprError();
10473 
10474     if (!Expand) {
10475       // The transform has determined that we should perform a simple
10476       // transformation on the pack expansion, producing another pack
10477       // expansion.
10478       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10479 
10480       TypeLocBuilder TLB;
10481       TLB.reserve(From->getTypeLoc().getFullDataSize());
10482 
10483       QualType To = getDerived().TransformType(TLB, PatternTL);
10484       if (To.isNull())
10485         return ExprError();
10486 
10487       To = getDerived().RebuildPackExpansionType(To,
10488                                                  PatternTL.getSourceRange(),
10489                                                  ExpansionTL.getEllipsisLoc(),
10490                                                  NumExpansions);
10491       if (To.isNull())
10492         return ExprError();
10493 
10494       PackExpansionTypeLoc ToExpansionTL
10495         = TLB.push<PackExpansionTypeLoc>(To);
10496       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10497       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10498       continue;
10499     }
10500 
10501     // Expand the pack expansion by substituting for each argument in the
10502     // pack(s).
10503     for (unsigned I = 0; I != *NumExpansions; ++I) {
10504       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10505       TypeLocBuilder TLB;
10506       TLB.reserve(PatternTL.getFullDataSize());
10507       QualType To = getDerived().TransformType(TLB, PatternTL);
10508       if (To.isNull())
10509         return ExprError();
10510 
10511       if (To->containsUnexpandedParameterPack()) {
10512         To = getDerived().RebuildPackExpansionType(To,
10513                                                    PatternTL.getSourceRange(),
10514                                                    ExpansionTL.getEllipsisLoc(),
10515                                                    NumExpansions);
10516         if (To.isNull())
10517           return ExprError();
10518 
10519         PackExpansionTypeLoc ToExpansionTL
10520           = TLB.push<PackExpansionTypeLoc>(To);
10521         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10522       }
10523 
10524       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10525     }
10526 
10527     if (!RetainExpansion)
10528       continue;
10529 
10530     // If we're supposed to retain a pack expansion, do so by temporarily
10531     // forgetting the partially-substituted parameter pack.
10532     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10533 
10534     TypeLocBuilder TLB;
10535     TLB.reserve(From->getTypeLoc().getFullDataSize());
10536 
10537     QualType To = getDerived().TransformType(TLB, PatternTL);
10538     if (To.isNull())
10539       return ExprError();
10540 
10541     To = getDerived().RebuildPackExpansionType(To,
10542                                                PatternTL.getSourceRange(),
10543                                                ExpansionTL.getEllipsisLoc(),
10544                                                NumExpansions);
10545     if (To.isNull())
10546       return ExprError();
10547 
10548     PackExpansionTypeLoc ToExpansionTL
10549       = TLB.push<PackExpansionTypeLoc>(To);
10550     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10551     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10552   }
10553 
10554   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10555     return E;
10556 
10557   return getDerived().RebuildTypeTrait(E->getTrait(),
10558                                        E->getLocStart(),
10559                                        Args,
10560                                        E->getLocEnd());
10561 }
10562 
10563 template<typename Derived>
10564 ExprResult
10565 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10566   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10567   if (!T)
10568     return ExprError();
10569 
10570   if (!getDerived().AlwaysRebuild() &&
10571       T == E->getQueriedTypeSourceInfo())
10572     return E;
10573 
10574   ExprResult SubExpr;
10575   {
10576     EnterExpressionEvaluationContext Unevaluated(
10577         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10578     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10579     if (SubExpr.isInvalid())
10580       return ExprError();
10581 
10582     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10583       return E;
10584   }
10585 
10586   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10587                                             E->getLocStart(),
10588                                             T,
10589                                             SubExpr.get(),
10590                                             E->getLocEnd());
10591 }
10592 
10593 template<typename Derived>
10594 ExprResult
10595 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10596   ExprResult SubExpr;
10597   {
10598     EnterExpressionEvaluationContext Unevaluated(
10599         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10600     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10601     if (SubExpr.isInvalid())
10602       return ExprError();
10603 
10604     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10605       return E;
10606   }
10607 
10608   return getDerived().RebuildExpressionTrait(
10609       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10610 }
10611 
10612 template <typename Derived>
10613 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10614     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10615     TypeSourceInfo **RecoveryTSI) {
10616   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10617       DRE, AddrTaken, RecoveryTSI);
10618 
10619   // Propagate both errors and recovered types, which return ExprEmpty.
10620   if (!NewDRE.isUsable())
10621     return NewDRE;
10622 
10623   // We got an expr, wrap it up in parens.
10624   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10625     return PE;
10626   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10627                                        PE->getRParen());
10628 }
10629 
10630 template <typename Derived>
10631 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10632     DependentScopeDeclRefExpr *E) {
10633   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10634                                             nullptr);
10635 }
10636 
10637 template<typename Derived>
10638 ExprResult
10639 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10640                                                DependentScopeDeclRefExpr *E,
10641                                                bool IsAddressOfOperand,
10642                                                TypeSourceInfo **RecoveryTSI) {
10643   assert(E->getQualifierLoc());
10644   NestedNameSpecifierLoc QualifierLoc
10645   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10646   if (!QualifierLoc)
10647     return ExprError();
10648   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10649 
10650   // TODO: If this is a conversion-function-id, verify that the
10651   // destination type name (if present) resolves the same way after
10652   // instantiation as it did in the local scope.
10653 
10654   DeclarationNameInfo NameInfo
10655     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10656   if (!NameInfo.getName())
10657     return ExprError();
10658 
10659   if (!E->hasExplicitTemplateArgs()) {
10660     if (!getDerived().AlwaysRebuild() &&
10661         QualifierLoc == E->getQualifierLoc() &&
10662         // Note: it is sufficient to compare the Name component of NameInfo:
10663         // if name has not changed, DNLoc has not changed either.
10664         NameInfo.getName() == E->getDeclName())
10665       return E;
10666 
10667     return getDerived().RebuildDependentScopeDeclRefExpr(
10668         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10669         IsAddressOfOperand, RecoveryTSI);
10670   }
10671 
10672   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10673   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10674                                               E->getNumTemplateArgs(),
10675                                               TransArgs))
10676     return ExprError();
10677 
10678   return getDerived().RebuildDependentScopeDeclRefExpr(
10679       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10680       RecoveryTSI);
10681 }
10682 
10683 template<typename Derived>
10684 ExprResult
10685 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10686   // CXXConstructExprs other than for list-initialization and
10687   // CXXTemporaryObjectExpr are always implicit, so when we have
10688   // a 1-argument construction we just transform that argument.
10689   if ((E->getNumArgs() == 1 ||
10690        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10691       (!getDerived().DropCallArgument(E->getArg(0))) &&
10692       !E->isListInitialization())
10693     return getDerived().TransformExpr(E->getArg(0));
10694 
10695   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10696 
10697   QualType T = getDerived().TransformType(E->getType());
10698   if (T.isNull())
10699     return ExprError();
10700 
10701   CXXConstructorDecl *Constructor
10702     = cast_or_null<CXXConstructorDecl>(
10703                                 getDerived().TransformDecl(E->getLocStart(),
10704                                                          E->getConstructor()));
10705   if (!Constructor)
10706     return ExprError();
10707 
10708   bool ArgumentChanged = false;
10709   SmallVector<Expr*, 8> Args;
10710   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10711                                   &ArgumentChanged))
10712     return ExprError();
10713 
10714   if (!getDerived().AlwaysRebuild() &&
10715       T == E->getType() &&
10716       Constructor == E->getConstructor() &&
10717       !ArgumentChanged) {
10718     // Mark the constructor as referenced.
10719     // FIXME: Instantiation-specific
10720     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10721     return E;
10722   }
10723 
10724   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10725                                               Constructor,
10726                                               E->isElidable(), Args,
10727                                               E->hadMultipleCandidates(),
10728                                               E->isListInitialization(),
10729                                               E->isStdInitListInitialization(),
10730                                               E->requiresZeroInitialization(),
10731                                               E->getConstructionKind(),
10732                                               E->getParenOrBraceRange());
10733 }
10734 
10735 template<typename Derived>
10736 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10737     CXXInheritedCtorInitExpr *E) {
10738   QualType T = getDerived().TransformType(E->getType());
10739   if (T.isNull())
10740     return ExprError();
10741 
10742   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10743       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10744   if (!Constructor)
10745     return ExprError();
10746 
10747   if (!getDerived().AlwaysRebuild() &&
10748       T == E->getType() &&
10749       Constructor == E->getConstructor()) {
10750     // Mark the constructor as referenced.
10751     // FIXME: Instantiation-specific
10752     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10753     return E;
10754   }
10755 
10756   return getDerived().RebuildCXXInheritedCtorInitExpr(
10757       T, E->getLocation(), Constructor,
10758       E->constructsVBase(), E->inheritedFromVBase());
10759 }
10760 
10761 /// \brief Transform a C++ temporary-binding expression.
10762 ///
10763 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10764 /// transform the subexpression and return that.
10765 template<typename Derived>
10766 ExprResult
10767 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10768   return getDerived().TransformExpr(E->getSubExpr());
10769 }
10770 
10771 /// \brief Transform a C++ expression that contains cleanups that should
10772 /// be run after the expression is evaluated.
10773 ///
10774 /// Since ExprWithCleanups nodes are implicitly generated, we
10775 /// just transform the subexpression and return that.
10776 template<typename Derived>
10777 ExprResult
10778 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10779   return getDerived().TransformExpr(E->getSubExpr());
10780 }
10781 
10782 template<typename Derived>
10783 ExprResult
10784 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10785                                                     CXXTemporaryObjectExpr *E) {
10786   TypeSourceInfo *T =
10787       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
10788   if (!T)
10789     return ExprError();
10790 
10791   CXXConstructorDecl *Constructor
10792     = cast_or_null<CXXConstructorDecl>(
10793                                   getDerived().TransformDecl(E->getLocStart(),
10794                                                          E->getConstructor()));
10795   if (!Constructor)
10796     return ExprError();
10797 
10798   bool ArgumentChanged = false;
10799   SmallVector<Expr*, 8> Args;
10800   Args.reserve(E->getNumArgs());
10801   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10802                      &ArgumentChanged))
10803     return ExprError();
10804 
10805   if (!getDerived().AlwaysRebuild() &&
10806       T == E->getTypeSourceInfo() &&
10807       Constructor == E->getConstructor() &&
10808       !ArgumentChanged) {
10809     // FIXME: Instantiation-specific
10810     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10811     return SemaRef.MaybeBindToTemporary(E);
10812   }
10813 
10814   // FIXME: Pass in E->isListInitialization().
10815   return getDerived().RebuildCXXTemporaryObjectExpr(T,
10816                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10817                                                     Args,
10818                                                     E->getLocEnd());
10819 }
10820 
10821 template<typename Derived>
10822 ExprResult
10823 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10824   // Transform any init-capture expressions before entering the scope of the
10825   // lambda body, because they are not semantically within that scope.
10826   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10827   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10828   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10829                                   E->explicit_capture_begin());
10830   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10831                                     CEnd = E->capture_end();
10832        C != CEnd; ++C) {
10833     if (!E->isInitCapture(C))
10834       continue;
10835     EnterExpressionEvaluationContext EEEC(
10836         getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
10837     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10838         C->getCapturedVar()->getInit(),
10839         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10840 
10841     if (NewExprInitResult.isInvalid())
10842       return ExprError();
10843     Expr *NewExprInit = NewExprInitResult.get();
10844 
10845     VarDecl *OldVD = C->getCapturedVar();
10846     QualType NewInitCaptureType =
10847         getSema().buildLambdaInitCaptureInitialization(
10848             C->getLocation(), OldVD->getType()->isReferenceType(),
10849             OldVD->getIdentifier(),
10850             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10851     NewExprInitResult = NewExprInit;
10852     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10853         std::make_pair(NewExprInitResult, NewInitCaptureType);
10854   }
10855 
10856   // Transform the template parameters, and add them to the current
10857   // instantiation scope. The null case is handled correctly.
10858   auto TPL = getDerived().TransformTemplateParameterList(
10859       E->getTemplateParameterList());
10860 
10861   // Transform the type of the original lambda's call operator.
10862   // The transformation MUST be done in the CurrentInstantiationScope since
10863   // it introduces a mapping of the original to the newly created
10864   // transformed parameters.
10865   TypeSourceInfo *NewCallOpTSI = nullptr;
10866   {
10867     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10868     FunctionProtoTypeLoc OldCallOpFPTL =
10869         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10870 
10871     TypeLocBuilder NewCallOpTLBuilder;
10872     SmallVector<QualType, 4> ExceptionStorage;
10873     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10874     QualType NewCallOpType = TransformFunctionProtoType(
10875         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10876         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10877           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10878                                               ExceptionStorage, Changed);
10879         });
10880     if (NewCallOpType.isNull())
10881       return ExprError();
10882     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10883                                                         NewCallOpType);
10884   }
10885 
10886   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10887   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10888   LSI->GLTemplateParameterList = TPL;
10889 
10890   // Create the local class that will describe the lambda.
10891   CXXRecordDecl *Class
10892     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10893                                         NewCallOpTSI,
10894                                         /*KnownDependent=*/false,
10895                                         E->getCaptureDefault());
10896   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10897 
10898   // Build the call operator.
10899   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10900       Class, E->getIntroducerRange(), NewCallOpTSI,
10901       E->getCallOperator()->getLocEnd(),
10902       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10903       E->getCallOperator()->isConstexpr());
10904 
10905   LSI->CallOperator = NewCallOperator;
10906 
10907   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10908        I != NumParams; ++I) {
10909     auto *P = NewCallOperator->getParamDecl(I);
10910     if (P->hasUninstantiatedDefaultArg()) {
10911       EnterExpressionEvaluationContext Eval(
10912           getSema(),
10913           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
10914       ExprResult R = getDerived().TransformExpr(
10915           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10916       P->setDefaultArg(R.get());
10917     }
10918   }
10919 
10920   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10921   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10922 
10923   // Introduce the context of the call operator.
10924   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10925                                  /*NewThisContext*/false);
10926 
10927   // Enter the scope of the lambda.
10928   getSema().buildLambdaScope(LSI, NewCallOperator,
10929                              E->getIntroducerRange(),
10930                              E->getCaptureDefault(),
10931                              E->getCaptureDefaultLoc(),
10932                              E->hasExplicitParameters(),
10933                              E->hasExplicitResultType(),
10934                              E->isMutable());
10935 
10936   bool Invalid = false;
10937 
10938   // Transform captures.
10939   bool FinishedExplicitCaptures = false;
10940   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10941                                  CEnd = E->capture_end();
10942        C != CEnd; ++C) {
10943     // When we hit the first implicit capture, tell Sema that we've finished
10944     // the list of explicit captures.
10945     if (!FinishedExplicitCaptures && C->isImplicit()) {
10946       getSema().finishLambdaExplicitCaptures(LSI);
10947       FinishedExplicitCaptures = true;
10948     }
10949 
10950     // Capturing 'this' is trivial.
10951     if (C->capturesThis()) {
10952       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10953                                     /*BuildAndDiagnose*/ true, nullptr,
10954                                     C->getCaptureKind() == LCK_StarThis);
10955       continue;
10956     }
10957     // Captured expression will be recaptured during captured variables
10958     // rebuilding.
10959     if (C->capturesVLAType())
10960       continue;
10961 
10962     // Rebuild init-captures, including the implied field declaration.
10963     if (E->isInitCapture(C)) {
10964       InitCaptureInfoTy InitExprTypePair =
10965           InitCaptureExprsAndTypes[C - E->capture_begin()];
10966       ExprResult Init = InitExprTypePair.first;
10967       QualType InitQualType = InitExprTypePair.second;
10968       if (Init.isInvalid() || InitQualType.isNull()) {
10969         Invalid = true;
10970         continue;
10971       }
10972       VarDecl *OldVD = C->getCapturedVar();
10973       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
10974           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
10975           OldVD->getInitStyle(), Init.get());
10976       if (!NewVD)
10977         Invalid = true;
10978       else {
10979         getDerived().transformedLocalDecl(OldVD, NewVD);
10980       }
10981       getSema().buildInitCaptureField(LSI, NewVD);
10982       continue;
10983     }
10984 
10985     assert(C->capturesVariable() && "unexpected kind of lambda capture");
10986 
10987     // Determine the capture kind for Sema.
10988     Sema::TryCaptureKind Kind
10989       = C->isImplicit()? Sema::TryCapture_Implicit
10990                        : C->getCaptureKind() == LCK_ByCopy
10991                            ? Sema::TryCapture_ExplicitByVal
10992                            : Sema::TryCapture_ExplicitByRef;
10993     SourceLocation EllipsisLoc;
10994     if (C->isPackExpansion()) {
10995       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
10996       bool ShouldExpand = false;
10997       bool RetainExpansion = false;
10998       Optional<unsigned> NumExpansions;
10999       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11000                                                C->getLocation(),
11001                                                Unexpanded,
11002                                                ShouldExpand, RetainExpansion,
11003                                                NumExpansions)) {
11004         Invalid = true;
11005         continue;
11006       }
11007 
11008       if (ShouldExpand) {
11009         // The transform has determined that we should perform an expansion;
11010         // transform and capture each of the arguments.
11011         // expansion of the pattern. Do so.
11012         VarDecl *Pack = C->getCapturedVar();
11013         for (unsigned I = 0; I != *NumExpansions; ++I) {
11014           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11015           VarDecl *CapturedVar
11016             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11017                                                                Pack));
11018           if (!CapturedVar) {
11019             Invalid = true;
11020             continue;
11021           }
11022 
11023           // Capture the transformed variable.
11024           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11025         }
11026 
11027         // FIXME: Retain a pack expansion if RetainExpansion is true.
11028 
11029         continue;
11030       }
11031 
11032       EllipsisLoc = C->getEllipsisLoc();
11033     }
11034 
11035     // Transform the captured variable.
11036     VarDecl *CapturedVar
11037       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11038                                                          C->getCapturedVar()));
11039     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11040       Invalid = true;
11041       continue;
11042     }
11043 
11044     // Capture the transformed variable.
11045     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11046                                  EllipsisLoc);
11047   }
11048   if (!FinishedExplicitCaptures)
11049     getSema().finishLambdaExplicitCaptures(LSI);
11050 
11051   // Enter a new evaluation context to insulate the lambda from any
11052   // cleanups from the enclosing full-expression.
11053   getSema().PushExpressionEvaluationContext(
11054       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11055 
11056   // Instantiate the body of the lambda expression.
11057   StmtResult Body =
11058       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
11059 
11060   // ActOnLambda* will pop the function scope for us.
11061   FuncScopeCleanup.disable();
11062 
11063   if (Body.isInvalid()) {
11064     SavedContext.pop();
11065     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
11066                                /*IsInstantiation=*/true);
11067     return ExprError();
11068   }
11069 
11070   // Copy the LSI before ActOnFinishFunctionBody removes it.
11071   // FIXME: This is dumb. Store the lambda information somewhere that outlives
11072   // the call operator.
11073   auto LSICopy = *LSI;
11074   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
11075                                     /*IsInstantiation*/ true);
11076   SavedContext.pop();
11077 
11078   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
11079                                    &LSICopy);
11080 }
11081 
11082 template<typename Derived>
11083 ExprResult
11084 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
11085                                                   CXXUnresolvedConstructExpr *E) {
11086   TypeSourceInfo *T =
11087       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11088   if (!T)
11089     return ExprError();
11090 
11091   bool ArgumentChanged = false;
11092   SmallVector<Expr*, 8> Args;
11093   Args.reserve(E->arg_size());
11094   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
11095                                   &ArgumentChanged))
11096     return ExprError();
11097 
11098   if (!getDerived().AlwaysRebuild() &&
11099       T == E->getTypeSourceInfo() &&
11100       !ArgumentChanged)
11101     return E;
11102 
11103   // FIXME: we're faking the locations of the commas
11104   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
11105                                                         E->getLParenLoc(),
11106                                                         Args,
11107                                                         E->getRParenLoc());
11108 }
11109 
11110 template<typename Derived>
11111 ExprResult
11112 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
11113                                              CXXDependentScopeMemberExpr *E) {
11114   // Transform the base of the expression.
11115   ExprResult Base((Expr*) nullptr);
11116   Expr *OldBase;
11117   QualType BaseType;
11118   QualType ObjectType;
11119   if (!E->isImplicitAccess()) {
11120     OldBase = E->getBase();
11121     Base = getDerived().TransformExpr(OldBase);
11122     if (Base.isInvalid())
11123       return ExprError();
11124 
11125     // Start the member reference and compute the object's type.
11126     ParsedType ObjectTy;
11127     bool MayBePseudoDestructor = false;
11128     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11129                                                 E->getOperatorLoc(),
11130                                       E->isArrow()? tok::arrow : tok::period,
11131                                                 ObjectTy,
11132                                                 MayBePseudoDestructor);
11133     if (Base.isInvalid())
11134       return ExprError();
11135 
11136     ObjectType = ObjectTy.get();
11137     BaseType = ((Expr*) Base.get())->getType();
11138   } else {
11139     OldBase = nullptr;
11140     BaseType = getDerived().TransformType(E->getBaseType());
11141     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11142   }
11143 
11144   // Transform the first part of the nested-name-specifier that qualifies
11145   // the member name.
11146   NamedDecl *FirstQualifierInScope
11147     = getDerived().TransformFirstQualifierInScope(
11148                                             E->getFirstQualifierFoundInScope(),
11149                                             E->getQualifierLoc().getBeginLoc());
11150 
11151   NestedNameSpecifierLoc QualifierLoc;
11152   if (E->getQualifier()) {
11153     QualifierLoc
11154       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11155                                                      ObjectType,
11156                                                      FirstQualifierInScope);
11157     if (!QualifierLoc)
11158       return ExprError();
11159   }
11160 
11161   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11162 
11163   // TODO: If this is a conversion-function-id, verify that the
11164   // destination type name (if present) resolves the same way after
11165   // instantiation as it did in the local scope.
11166 
11167   DeclarationNameInfo NameInfo
11168     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11169   if (!NameInfo.getName())
11170     return ExprError();
11171 
11172   if (!E->hasExplicitTemplateArgs()) {
11173     // This is a reference to a member without an explicitly-specified
11174     // template argument list. Optimize for this common case.
11175     if (!getDerived().AlwaysRebuild() &&
11176         Base.get() == OldBase &&
11177         BaseType == E->getBaseType() &&
11178         QualifierLoc == E->getQualifierLoc() &&
11179         NameInfo.getName() == E->getMember() &&
11180         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11181       return E;
11182 
11183     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11184                                                        BaseType,
11185                                                        E->isArrow(),
11186                                                        E->getOperatorLoc(),
11187                                                        QualifierLoc,
11188                                                        TemplateKWLoc,
11189                                                        FirstQualifierInScope,
11190                                                        NameInfo,
11191                                                        /*TemplateArgs*/nullptr);
11192   }
11193 
11194   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11195   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11196                                               E->getNumTemplateArgs(),
11197                                               TransArgs))
11198     return ExprError();
11199 
11200   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11201                                                      BaseType,
11202                                                      E->isArrow(),
11203                                                      E->getOperatorLoc(),
11204                                                      QualifierLoc,
11205                                                      TemplateKWLoc,
11206                                                      FirstQualifierInScope,
11207                                                      NameInfo,
11208                                                      &TransArgs);
11209 }
11210 
11211 template<typename Derived>
11212 ExprResult
11213 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11214   // Transform the base of the expression.
11215   ExprResult Base((Expr*) nullptr);
11216   QualType BaseType;
11217   if (!Old->isImplicitAccess()) {
11218     Base = getDerived().TransformExpr(Old->getBase());
11219     if (Base.isInvalid())
11220       return ExprError();
11221     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11222                                                      Old->isArrow());
11223     if (Base.isInvalid())
11224       return ExprError();
11225     BaseType = Base.get()->getType();
11226   } else {
11227     BaseType = getDerived().TransformType(Old->getBaseType());
11228   }
11229 
11230   NestedNameSpecifierLoc QualifierLoc;
11231   if (Old->getQualifierLoc()) {
11232     QualifierLoc
11233     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11234     if (!QualifierLoc)
11235       return ExprError();
11236   }
11237 
11238   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11239 
11240   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11241                  Sema::LookupOrdinaryName);
11242 
11243   // Transform the declaration set.
11244   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11245     return ExprError();
11246 
11247   // Determine the naming class.
11248   if (Old->getNamingClass()) {
11249     CXXRecordDecl *NamingClass
11250       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11251                                                           Old->getMemberLoc(),
11252                                                         Old->getNamingClass()));
11253     if (!NamingClass)
11254       return ExprError();
11255 
11256     R.setNamingClass(NamingClass);
11257   }
11258 
11259   TemplateArgumentListInfo TransArgs;
11260   if (Old->hasExplicitTemplateArgs()) {
11261     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11262     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11263     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11264                                                 Old->getNumTemplateArgs(),
11265                                                 TransArgs))
11266       return ExprError();
11267   }
11268 
11269   // FIXME: to do this check properly, we will need to preserve the
11270   // first-qualifier-in-scope here, just in case we had a dependent
11271   // base (and therefore couldn't do the check) and a
11272   // nested-name-qualifier (and therefore could do the lookup).
11273   NamedDecl *FirstQualifierInScope = nullptr;
11274 
11275   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11276                                                   BaseType,
11277                                                   Old->getOperatorLoc(),
11278                                                   Old->isArrow(),
11279                                                   QualifierLoc,
11280                                                   TemplateKWLoc,
11281                                                   FirstQualifierInScope,
11282                                                   R,
11283                                               (Old->hasExplicitTemplateArgs()
11284                                                   ? &TransArgs : nullptr));
11285 }
11286 
11287 template<typename Derived>
11288 ExprResult
11289 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11290   EnterExpressionEvaluationContext Unevaluated(
11291       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11292   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11293   if (SubExpr.isInvalid())
11294     return ExprError();
11295 
11296   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11297     return E;
11298 
11299   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11300 }
11301 
11302 template<typename Derived>
11303 ExprResult
11304 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11305   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11306   if (Pattern.isInvalid())
11307     return ExprError();
11308 
11309   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11310     return E;
11311 
11312   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11313                                            E->getNumExpansions());
11314 }
11315 
11316 template<typename Derived>
11317 ExprResult
11318 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11319   // If E is not value-dependent, then nothing will change when we transform it.
11320   // Note: This is an instantiation-centric view.
11321   if (!E->isValueDependent())
11322     return E;
11323 
11324   EnterExpressionEvaluationContext Unevaluated(
11325       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11326 
11327   ArrayRef<TemplateArgument> PackArgs;
11328   TemplateArgument ArgStorage;
11329 
11330   // Find the argument list to transform.
11331   if (E->isPartiallySubstituted()) {
11332     PackArgs = E->getPartialArguments();
11333   } else if (E->isValueDependent()) {
11334     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11335     bool ShouldExpand = false;
11336     bool RetainExpansion = false;
11337     Optional<unsigned> NumExpansions;
11338     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11339                                              Unexpanded,
11340                                              ShouldExpand, RetainExpansion,
11341                                              NumExpansions))
11342       return ExprError();
11343 
11344     // If we need to expand the pack, build a template argument from it and
11345     // expand that.
11346     if (ShouldExpand) {
11347       auto *Pack = E->getPack();
11348       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11349         ArgStorage = getSema().Context.getPackExpansionType(
11350             getSema().Context.getTypeDeclType(TTPD), None);
11351       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11352         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11353       } else {
11354         auto *VD = cast<ValueDecl>(Pack);
11355         ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
11356                                                     VK_RValue, E->getPackLoc());
11357         if (DRE.isInvalid())
11358           return ExprError();
11359         ArgStorage = new (getSema().Context) PackExpansionExpr(
11360             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11361       }
11362       PackArgs = ArgStorage;
11363     }
11364   }
11365 
11366   // If we're not expanding the pack, just transform the decl.
11367   if (!PackArgs.size()) {
11368     auto *Pack = cast_or_null<NamedDecl>(
11369         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11370     if (!Pack)
11371       return ExprError();
11372     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11373                                               E->getPackLoc(),
11374                                               E->getRParenLoc(), None, None);
11375   }
11376 
11377   // Try to compute the result without performing a partial substitution.
11378   Optional<unsigned> Result = 0;
11379   for (const TemplateArgument &Arg : PackArgs) {
11380     if (!Arg.isPackExpansion()) {
11381       Result = *Result + 1;
11382       continue;
11383     }
11384 
11385     TemplateArgumentLoc ArgLoc;
11386     InventTemplateArgumentLoc(Arg, ArgLoc);
11387 
11388     // Find the pattern of the pack expansion.
11389     SourceLocation Ellipsis;
11390     Optional<unsigned> OrigNumExpansions;
11391     TemplateArgumentLoc Pattern =
11392         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11393                                                           OrigNumExpansions);
11394 
11395     // Substitute under the pack expansion. Do not expand the pack (yet).
11396     TemplateArgumentLoc OutPattern;
11397     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11398     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11399                                                /*Uneval*/ true))
11400       return true;
11401 
11402     // See if we can determine the number of arguments from the result.
11403     Optional<unsigned> NumExpansions =
11404         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11405     if (!NumExpansions) {
11406       // No: we must be in an alias template expansion, and we're going to need
11407       // to actually expand the packs.
11408       Result = None;
11409       break;
11410     }
11411 
11412     Result = *Result + *NumExpansions;
11413   }
11414 
11415   // Common case: we could determine the number of expansions without
11416   // substituting.
11417   if (Result)
11418     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11419                                               E->getPackLoc(),
11420                                               E->getRParenLoc(), *Result, None);
11421 
11422   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11423                                                E->getPackLoc());
11424   {
11425     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11426     typedef TemplateArgumentLocInventIterator<
11427         Derived, const TemplateArgument*> PackLocIterator;
11428     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11429                                    PackLocIterator(*this, PackArgs.end()),
11430                                    TransformedPackArgs, /*Uneval*/true))
11431       return ExprError();
11432   }
11433 
11434   // Check whether we managed to fully-expand the pack.
11435   // FIXME: Is it possible for us to do so and not hit the early exit path?
11436   SmallVector<TemplateArgument, 8> Args;
11437   bool PartialSubstitution = false;
11438   for (auto &Loc : TransformedPackArgs.arguments()) {
11439     Args.push_back(Loc.getArgument());
11440     if (Loc.getArgument().isPackExpansion())
11441       PartialSubstitution = true;
11442   }
11443 
11444   if (PartialSubstitution)
11445     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11446                                               E->getPackLoc(),
11447                                               E->getRParenLoc(), None, Args);
11448 
11449   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11450                                             E->getPackLoc(), E->getRParenLoc(),
11451                                             Args.size(), None);
11452 }
11453 
11454 template<typename Derived>
11455 ExprResult
11456 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11457                                           SubstNonTypeTemplateParmPackExpr *E) {
11458   // Default behavior is to do nothing with this transformation.
11459   return E;
11460 }
11461 
11462 template<typename Derived>
11463 ExprResult
11464 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11465                                           SubstNonTypeTemplateParmExpr *E) {
11466   // Default behavior is to do nothing with this transformation.
11467   return E;
11468 }
11469 
11470 template<typename Derived>
11471 ExprResult
11472 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11473   // Default behavior is to do nothing with this transformation.
11474   return E;
11475 }
11476 
11477 template<typename Derived>
11478 ExprResult
11479 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11480                                                   MaterializeTemporaryExpr *E) {
11481   return getDerived().TransformExpr(E->GetTemporaryExpr());
11482 }
11483 
11484 template<typename Derived>
11485 ExprResult
11486 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11487   Expr *Pattern = E->getPattern();
11488 
11489   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11490   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11491   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11492 
11493   // Determine whether the set of unexpanded parameter packs can and should
11494   // be expanded.
11495   bool Expand = true;
11496   bool RetainExpansion = false;
11497   Optional<unsigned> NumExpansions;
11498   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11499                                            Pattern->getSourceRange(),
11500                                            Unexpanded,
11501                                            Expand, RetainExpansion,
11502                                            NumExpansions))
11503     return true;
11504 
11505   if (!Expand) {
11506     // Do not expand any packs here, just transform and rebuild a fold
11507     // expression.
11508     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11509 
11510     ExprResult LHS =
11511         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11512     if (LHS.isInvalid())
11513       return true;
11514 
11515     ExprResult RHS =
11516         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11517     if (RHS.isInvalid())
11518       return true;
11519 
11520     if (!getDerived().AlwaysRebuild() &&
11521         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11522       return E;
11523 
11524     return getDerived().RebuildCXXFoldExpr(
11525         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11526         RHS.get(), E->getLocEnd());
11527   }
11528 
11529   // The transform has determined that we should perform an elementwise
11530   // expansion of the pattern. Do so.
11531   ExprResult Result = getDerived().TransformExpr(E->getInit());
11532   if (Result.isInvalid())
11533     return true;
11534   bool LeftFold = E->isLeftFold();
11535 
11536   // If we're retaining an expansion for a right fold, it is the innermost
11537   // component and takes the init (if any).
11538   if (!LeftFold && RetainExpansion) {
11539     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11540 
11541     ExprResult Out = getDerived().TransformExpr(Pattern);
11542     if (Out.isInvalid())
11543       return true;
11544 
11545     Result = getDerived().RebuildCXXFoldExpr(
11546         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11547         Result.get(), E->getLocEnd());
11548     if (Result.isInvalid())
11549       return true;
11550   }
11551 
11552   for (unsigned I = 0; I != *NumExpansions; ++I) {
11553     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11554         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11555     ExprResult Out = getDerived().TransformExpr(Pattern);
11556     if (Out.isInvalid())
11557       return true;
11558 
11559     if (Out.get()->containsUnexpandedParameterPack()) {
11560       // We still have a pack; retain a pack expansion for this slice.
11561       Result = getDerived().RebuildCXXFoldExpr(
11562           E->getLocStart(),
11563           LeftFold ? Result.get() : Out.get(),
11564           E->getOperator(), E->getEllipsisLoc(),
11565           LeftFold ? Out.get() : Result.get(),
11566           E->getLocEnd());
11567     } else if (Result.isUsable()) {
11568       // We've got down to a single element; build a binary operator.
11569       Result = getDerived().RebuildBinaryOperator(
11570           E->getEllipsisLoc(), E->getOperator(),
11571           LeftFold ? Result.get() : Out.get(),
11572           LeftFold ? Out.get() : Result.get());
11573     } else
11574       Result = Out;
11575 
11576     if (Result.isInvalid())
11577       return true;
11578   }
11579 
11580   // If we're retaining an expansion for a left fold, it is the outermost
11581   // component and takes the complete expansion so far as its init (if any).
11582   if (LeftFold && RetainExpansion) {
11583     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11584 
11585     ExprResult Out = getDerived().TransformExpr(Pattern);
11586     if (Out.isInvalid())
11587       return true;
11588 
11589     Result = getDerived().RebuildCXXFoldExpr(
11590         E->getLocStart(), Result.get(),
11591         E->getOperator(), E->getEllipsisLoc(),
11592         Out.get(), E->getLocEnd());
11593     if (Result.isInvalid())
11594       return true;
11595   }
11596 
11597   // If we had no init and an empty pack, and we're not retaining an expansion,
11598   // then produce a fallback value or error.
11599   if (Result.isUnset())
11600     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11601                                                 E->getOperator());
11602 
11603   return Result;
11604 }
11605 
11606 template<typename Derived>
11607 ExprResult
11608 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11609     CXXStdInitializerListExpr *E) {
11610   return getDerived().TransformExpr(E->getSubExpr());
11611 }
11612 
11613 template<typename Derived>
11614 ExprResult
11615 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11616   return SemaRef.MaybeBindToTemporary(E);
11617 }
11618 
11619 template<typename Derived>
11620 ExprResult
11621 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11622   return E;
11623 }
11624 
11625 template<typename Derived>
11626 ExprResult
11627 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11628   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11629   if (SubExpr.isInvalid())
11630     return ExprError();
11631 
11632   if (!getDerived().AlwaysRebuild() &&
11633       SubExpr.get() == E->getSubExpr())
11634     return E;
11635 
11636   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11637 }
11638 
11639 template<typename Derived>
11640 ExprResult
11641 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11642   // Transform each of the elements.
11643   SmallVector<Expr *, 8> Elements;
11644   bool ArgChanged = false;
11645   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11646                                   /*IsCall=*/false, Elements, &ArgChanged))
11647     return ExprError();
11648 
11649   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11650     return SemaRef.MaybeBindToTemporary(E);
11651 
11652   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11653                                               Elements.data(),
11654                                               Elements.size());
11655 }
11656 
11657 template<typename Derived>
11658 ExprResult
11659 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11660                                                     ObjCDictionaryLiteral *E) {
11661   // Transform each of the elements.
11662   SmallVector<ObjCDictionaryElement, 8> Elements;
11663   bool ArgChanged = false;
11664   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11665     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11666 
11667     if (OrigElement.isPackExpansion()) {
11668       // This key/value element is a pack expansion.
11669       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11670       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11671       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11672       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11673 
11674       // Determine whether the set of unexpanded parameter packs can
11675       // and should be expanded.
11676       bool Expand = true;
11677       bool RetainExpansion = false;
11678       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11679       Optional<unsigned> NumExpansions = OrigNumExpansions;
11680       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11681                                OrigElement.Value->getLocEnd());
11682      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11683                                                PatternRange,
11684                                                Unexpanded,
11685                                                Expand, RetainExpansion,
11686                                                NumExpansions))
11687         return ExprError();
11688 
11689       if (!Expand) {
11690         // The transform has determined that we should perform a simple
11691         // transformation on the pack expansion, producing another pack
11692         // expansion.
11693         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11694         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11695         if (Key.isInvalid())
11696           return ExprError();
11697 
11698         if (Key.get() != OrigElement.Key)
11699           ArgChanged = true;
11700 
11701         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11702         if (Value.isInvalid())
11703           return ExprError();
11704 
11705         if (Value.get() != OrigElement.Value)
11706           ArgChanged = true;
11707 
11708         ObjCDictionaryElement Expansion = {
11709           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11710         };
11711         Elements.push_back(Expansion);
11712         continue;
11713       }
11714 
11715       // Record right away that the argument was changed.  This needs
11716       // to happen even if the array expands to nothing.
11717       ArgChanged = true;
11718 
11719       // The transform has determined that we should perform an elementwise
11720       // expansion of the pattern. Do so.
11721       for (unsigned I = 0; I != *NumExpansions; ++I) {
11722         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11723         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11724         if (Key.isInvalid())
11725           return ExprError();
11726 
11727         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11728         if (Value.isInvalid())
11729           return ExprError();
11730 
11731         ObjCDictionaryElement Element = {
11732           Key.get(), Value.get(), SourceLocation(), NumExpansions
11733         };
11734 
11735         // If any unexpanded parameter packs remain, we still have a
11736         // pack expansion.
11737         // FIXME: Can this really happen?
11738         if (Key.get()->containsUnexpandedParameterPack() ||
11739             Value.get()->containsUnexpandedParameterPack())
11740           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11741 
11742         Elements.push_back(Element);
11743       }
11744 
11745       // FIXME: Retain a pack expansion if RetainExpansion is true.
11746 
11747       // We've finished with this pack expansion.
11748       continue;
11749     }
11750 
11751     // Transform and check key.
11752     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11753     if (Key.isInvalid())
11754       return ExprError();
11755 
11756     if (Key.get() != OrigElement.Key)
11757       ArgChanged = true;
11758 
11759     // Transform and check value.
11760     ExprResult Value
11761       = getDerived().TransformExpr(OrigElement.Value);
11762     if (Value.isInvalid())
11763       return ExprError();
11764 
11765     if (Value.get() != OrigElement.Value)
11766       ArgChanged = true;
11767 
11768     ObjCDictionaryElement Element = {
11769       Key.get(), Value.get(), SourceLocation(), None
11770     };
11771     Elements.push_back(Element);
11772   }
11773 
11774   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11775     return SemaRef.MaybeBindToTemporary(E);
11776 
11777   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11778                                                    Elements);
11779 }
11780 
11781 template<typename Derived>
11782 ExprResult
11783 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11784   TypeSourceInfo *EncodedTypeInfo
11785     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11786   if (!EncodedTypeInfo)
11787     return ExprError();
11788 
11789   if (!getDerived().AlwaysRebuild() &&
11790       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11791     return E;
11792 
11793   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11794                                             EncodedTypeInfo,
11795                                             E->getRParenLoc());
11796 }
11797 
11798 template<typename Derived>
11799 ExprResult TreeTransform<Derived>::
11800 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11801   // This is a kind of implicit conversion, and it needs to get dropped
11802   // and recomputed for the same general reasons that ImplicitCastExprs
11803   // do, as well a more specific one: this expression is only valid when
11804   // it appears *immediately* as an argument expression.
11805   return getDerived().TransformExpr(E->getSubExpr());
11806 }
11807 
11808 template<typename Derived>
11809 ExprResult TreeTransform<Derived>::
11810 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11811   TypeSourceInfo *TSInfo
11812     = getDerived().TransformType(E->getTypeInfoAsWritten());
11813   if (!TSInfo)
11814     return ExprError();
11815 
11816   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11817   if (Result.isInvalid())
11818     return ExprError();
11819 
11820   if (!getDerived().AlwaysRebuild() &&
11821       TSInfo == E->getTypeInfoAsWritten() &&
11822       Result.get() == E->getSubExpr())
11823     return E;
11824 
11825   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11826                                       E->getBridgeKeywordLoc(), TSInfo,
11827                                       Result.get());
11828 }
11829 
11830 template <typename Derived>
11831 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11832     ObjCAvailabilityCheckExpr *E) {
11833   return E;
11834 }
11835 
11836 template<typename Derived>
11837 ExprResult
11838 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11839   // Transform arguments.
11840   bool ArgChanged = false;
11841   SmallVector<Expr*, 8> Args;
11842   Args.reserve(E->getNumArgs());
11843   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11844                                   &ArgChanged))
11845     return ExprError();
11846 
11847   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11848     // Class message: transform the receiver type.
11849     TypeSourceInfo *ReceiverTypeInfo
11850       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11851     if (!ReceiverTypeInfo)
11852       return ExprError();
11853 
11854     // If nothing changed, just retain the existing message send.
11855     if (!getDerived().AlwaysRebuild() &&
11856         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11857       return SemaRef.MaybeBindToTemporary(E);
11858 
11859     // Build a new class message send.
11860     SmallVector<SourceLocation, 16> SelLocs;
11861     E->getSelectorLocs(SelLocs);
11862     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11863                                                E->getSelector(),
11864                                                SelLocs,
11865                                                E->getMethodDecl(),
11866                                                E->getLeftLoc(),
11867                                                Args,
11868                                                E->getRightLoc());
11869   }
11870   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11871            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11872     if (!E->getMethodDecl())
11873       return ExprError();
11874 
11875     // Build a new class message send to 'super'.
11876     SmallVector<SourceLocation, 16> SelLocs;
11877     E->getSelectorLocs(SelLocs);
11878     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11879                                                E->getSelector(),
11880                                                SelLocs,
11881                                                E->getReceiverType(),
11882                                                E->getMethodDecl(),
11883                                                E->getLeftLoc(),
11884                                                Args,
11885                                                E->getRightLoc());
11886   }
11887 
11888   // Instance message: transform the receiver
11889   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11890          "Only class and instance messages may be instantiated");
11891   ExprResult Receiver
11892     = getDerived().TransformExpr(E->getInstanceReceiver());
11893   if (Receiver.isInvalid())
11894     return ExprError();
11895 
11896   // If nothing changed, just retain the existing message send.
11897   if (!getDerived().AlwaysRebuild() &&
11898       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11899     return SemaRef.MaybeBindToTemporary(E);
11900 
11901   // Build a new instance message send.
11902   SmallVector<SourceLocation, 16> SelLocs;
11903   E->getSelectorLocs(SelLocs);
11904   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11905                                              E->getSelector(),
11906                                              SelLocs,
11907                                              E->getMethodDecl(),
11908                                              E->getLeftLoc(),
11909                                              Args,
11910                                              E->getRightLoc());
11911 }
11912 
11913 template<typename Derived>
11914 ExprResult
11915 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11916   return E;
11917 }
11918 
11919 template<typename Derived>
11920 ExprResult
11921 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11922   return E;
11923 }
11924 
11925 template<typename Derived>
11926 ExprResult
11927 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11928   // Transform the base expression.
11929   ExprResult Base = getDerived().TransformExpr(E->getBase());
11930   if (Base.isInvalid())
11931     return ExprError();
11932 
11933   // We don't need to transform the ivar; it will never change.
11934 
11935   // If nothing changed, just retain the existing expression.
11936   if (!getDerived().AlwaysRebuild() &&
11937       Base.get() == E->getBase())
11938     return E;
11939 
11940   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11941                                              E->getLocation(),
11942                                              E->isArrow(), E->isFreeIvar());
11943 }
11944 
11945 template<typename Derived>
11946 ExprResult
11947 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11948   // 'super' and types never change. Property never changes. Just
11949   // retain the existing expression.
11950   if (!E->isObjectReceiver())
11951     return E;
11952 
11953   // Transform the base expression.
11954   ExprResult Base = getDerived().TransformExpr(E->getBase());
11955   if (Base.isInvalid())
11956     return ExprError();
11957 
11958   // We don't need to transform the property; it will never change.
11959 
11960   // If nothing changed, just retain the existing expression.
11961   if (!getDerived().AlwaysRebuild() &&
11962       Base.get() == E->getBase())
11963     return E;
11964 
11965   if (E->isExplicitProperty())
11966     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11967                                                    E->getExplicitProperty(),
11968                                                    E->getLocation());
11969 
11970   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11971                                                  SemaRef.Context.PseudoObjectTy,
11972                                                  E->getImplicitPropertyGetter(),
11973                                                  E->getImplicitPropertySetter(),
11974                                                  E->getLocation());
11975 }
11976 
11977 template<typename Derived>
11978 ExprResult
11979 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
11980   // Transform the base expression.
11981   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
11982   if (Base.isInvalid())
11983     return ExprError();
11984 
11985   // Transform the key expression.
11986   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
11987   if (Key.isInvalid())
11988     return ExprError();
11989 
11990   // If nothing changed, just retain the existing expression.
11991   if (!getDerived().AlwaysRebuild() &&
11992       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
11993     return E;
11994 
11995   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
11996                                                   Base.get(), Key.get(),
11997                                                   E->getAtIndexMethodDecl(),
11998                                                   E->setAtIndexMethodDecl());
11999 }
12000 
12001 template<typename Derived>
12002 ExprResult
12003 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12004   // Transform the base expression.
12005   ExprResult Base = getDerived().TransformExpr(E->getBase());
12006   if (Base.isInvalid())
12007     return ExprError();
12008 
12009   // If nothing changed, just retain the existing expression.
12010   if (!getDerived().AlwaysRebuild() &&
12011       Base.get() == E->getBase())
12012     return E;
12013 
12014   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12015                                          E->getOpLoc(),
12016                                          E->isArrow());
12017 }
12018 
12019 template<typename Derived>
12020 ExprResult
12021 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
12022   bool ArgumentChanged = false;
12023   SmallVector<Expr*, 8> SubExprs;
12024   SubExprs.reserve(E->getNumSubExprs());
12025   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12026                                   SubExprs, &ArgumentChanged))
12027     return ExprError();
12028 
12029   if (!getDerived().AlwaysRebuild() &&
12030       !ArgumentChanged)
12031     return E;
12032 
12033   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
12034                                                SubExprs,
12035                                                E->getRParenLoc());
12036 }
12037 
12038 template<typename Derived>
12039 ExprResult
12040 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
12041   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
12042   if (SrcExpr.isInvalid())
12043     return ExprError();
12044 
12045   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12046   if (!Type)
12047     return ExprError();
12048 
12049   if (!getDerived().AlwaysRebuild() &&
12050       Type == E->getTypeSourceInfo() &&
12051       SrcExpr.get() == E->getSrcExpr())
12052     return E;
12053 
12054   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
12055                                                SrcExpr.get(), Type,
12056                                                E->getRParenLoc());
12057 }
12058 
12059 template<typename Derived>
12060 ExprResult
12061 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
12062   BlockDecl *oldBlock = E->getBlockDecl();
12063 
12064   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
12065   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
12066 
12067   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
12068   blockScope->TheDecl->setBlockMissingReturnType(
12069                          oldBlock->blockMissingReturnType());
12070 
12071   SmallVector<ParmVarDecl*, 4> params;
12072   SmallVector<QualType, 4> paramTypes;
12073 
12074   const FunctionProtoType *exprFunctionType = E->getFunctionType();
12075 
12076   // Parameter substitution.
12077   Sema::ExtParameterInfoBuilder extParamInfos;
12078   if (getDerived().TransformFunctionTypeParams(
12079           E->getCaretLocation(), oldBlock->parameters(), nullptr,
12080           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
12081           extParamInfos)) {
12082     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12083     return ExprError();
12084   }
12085 
12086   QualType exprResultType =
12087       getDerived().TransformType(exprFunctionType->getReturnType());
12088 
12089   auto epi = exprFunctionType->getExtProtoInfo();
12090   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
12091 
12092   QualType functionType =
12093     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
12094   blockScope->FunctionType = functionType;
12095 
12096   // Set the parameters on the block decl.
12097   if (!params.empty())
12098     blockScope->TheDecl->setParams(params);
12099 
12100   if (!oldBlock->blockMissingReturnType()) {
12101     blockScope->HasImplicitReturnType = false;
12102     blockScope->ReturnType = exprResultType;
12103   }
12104 
12105   // Transform the body
12106   StmtResult body = getDerived().TransformStmt(E->getBody());
12107   if (body.isInvalid()) {
12108     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12109     return ExprError();
12110   }
12111 
12112 #ifndef NDEBUG
12113   // In builds with assertions, make sure that we captured everything we
12114   // captured before.
12115   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
12116     for (const auto &I : oldBlock->captures()) {
12117       VarDecl *oldCapture = I.getVariable();
12118 
12119       // Ignore parameter packs.
12120       if (isa<ParmVarDecl>(oldCapture) &&
12121           cast<ParmVarDecl>(oldCapture)->isParameterPack())
12122         continue;
12123 
12124       VarDecl *newCapture =
12125         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
12126                                                  oldCapture));
12127       assert(blockScope->CaptureMap.count(newCapture));
12128     }
12129     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
12130   }
12131 #endif
12132 
12133   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
12134                                     /*Scope=*/nullptr);
12135 }
12136 
12137 template<typename Derived>
12138 ExprResult
12139 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12140   llvm_unreachable("Cannot transform asType expressions yet");
12141 }
12142 
12143 template<typename Derived>
12144 ExprResult
12145 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12146   QualType RetTy = getDerived().TransformType(E->getType());
12147   bool ArgumentChanged = false;
12148   SmallVector<Expr*, 8> SubExprs;
12149   SubExprs.reserve(E->getNumSubExprs());
12150   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12151                                   SubExprs, &ArgumentChanged))
12152     return ExprError();
12153 
12154   if (!getDerived().AlwaysRebuild() &&
12155       !ArgumentChanged)
12156     return E;
12157 
12158   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12159                                         RetTy, E->getOp(), E->getRParenLoc());
12160 }
12161 
12162 //===----------------------------------------------------------------------===//
12163 // Type reconstruction
12164 //===----------------------------------------------------------------------===//
12165 
12166 template<typename Derived>
12167 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12168                                                     SourceLocation Star) {
12169   return SemaRef.BuildPointerType(PointeeType, Star,
12170                                   getDerived().getBaseEntity());
12171 }
12172 
12173 template<typename Derived>
12174 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12175                                                          SourceLocation Star) {
12176   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12177                                        getDerived().getBaseEntity());
12178 }
12179 
12180 template<typename Derived>
12181 QualType
12182 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12183                                              bool WrittenAsLValue,
12184                                              SourceLocation Sigil) {
12185   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12186                                     Sigil, getDerived().getBaseEntity());
12187 }
12188 
12189 template<typename Derived>
12190 QualType
12191 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12192                                                  QualType ClassType,
12193                                                  SourceLocation Sigil) {
12194   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12195                                         getDerived().getBaseEntity());
12196 }
12197 
12198 template<typename Derived>
12199 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12200            const ObjCTypeParamDecl *Decl,
12201            SourceLocation ProtocolLAngleLoc,
12202            ArrayRef<ObjCProtocolDecl *> Protocols,
12203            ArrayRef<SourceLocation> ProtocolLocs,
12204            SourceLocation ProtocolRAngleLoc) {
12205   return SemaRef.BuildObjCTypeParamType(Decl,
12206                                         ProtocolLAngleLoc, Protocols,
12207                                         ProtocolLocs, ProtocolRAngleLoc,
12208                                         /*FailOnError=*/true);
12209 }
12210 
12211 template<typename Derived>
12212 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12213            QualType BaseType,
12214            SourceLocation Loc,
12215            SourceLocation TypeArgsLAngleLoc,
12216            ArrayRef<TypeSourceInfo *> TypeArgs,
12217            SourceLocation TypeArgsRAngleLoc,
12218            SourceLocation ProtocolLAngleLoc,
12219            ArrayRef<ObjCProtocolDecl *> Protocols,
12220            ArrayRef<SourceLocation> ProtocolLocs,
12221            SourceLocation ProtocolRAngleLoc) {
12222   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12223                                      TypeArgs, TypeArgsRAngleLoc,
12224                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12225                                      ProtocolRAngleLoc,
12226                                      /*FailOnError=*/true);
12227 }
12228 
12229 template<typename Derived>
12230 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12231            QualType PointeeType,
12232            SourceLocation Star) {
12233   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12234 }
12235 
12236 template<typename Derived>
12237 QualType
12238 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12239                                          ArrayType::ArraySizeModifier SizeMod,
12240                                          const llvm::APInt *Size,
12241                                          Expr *SizeExpr,
12242                                          unsigned IndexTypeQuals,
12243                                          SourceRange BracketsRange) {
12244   if (SizeExpr || !Size)
12245     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12246                                   IndexTypeQuals, BracketsRange,
12247                                   getDerived().getBaseEntity());
12248 
12249   QualType Types[] = {
12250     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12251     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12252     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12253   };
12254   const unsigned NumTypes = llvm::array_lengthof(Types);
12255   QualType SizeType;
12256   for (unsigned I = 0; I != NumTypes; ++I)
12257     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12258       SizeType = Types[I];
12259       break;
12260     }
12261 
12262   // Note that we can return a VariableArrayType here in the case where
12263   // the element type was a dependent VariableArrayType.
12264   IntegerLiteral *ArraySize
12265       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12266                                /*FIXME*/BracketsRange.getBegin());
12267   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12268                                 IndexTypeQuals, BracketsRange,
12269                                 getDerived().getBaseEntity());
12270 }
12271 
12272 template<typename Derived>
12273 QualType
12274 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12275                                                  ArrayType::ArraySizeModifier SizeMod,
12276                                                  const llvm::APInt &Size,
12277                                                  unsigned IndexTypeQuals,
12278                                                  SourceRange BracketsRange) {
12279   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12280                                         IndexTypeQuals, BracketsRange);
12281 }
12282 
12283 template<typename Derived>
12284 QualType
12285 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12286                                           ArrayType::ArraySizeModifier SizeMod,
12287                                                  unsigned IndexTypeQuals,
12288                                                    SourceRange BracketsRange) {
12289   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12290                                        IndexTypeQuals, BracketsRange);
12291 }
12292 
12293 template<typename Derived>
12294 QualType
12295 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12296                                           ArrayType::ArraySizeModifier SizeMod,
12297                                                  Expr *SizeExpr,
12298                                                  unsigned IndexTypeQuals,
12299                                                  SourceRange BracketsRange) {
12300   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12301                                        SizeExpr,
12302                                        IndexTypeQuals, BracketsRange);
12303 }
12304 
12305 template<typename Derived>
12306 QualType
12307 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12308                                           ArrayType::ArraySizeModifier SizeMod,
12309                                                        Expr *SizeExpr,
12310                                                        unsigned IndexTypeQuals,
12311                                                    SourceRange BracketsRange) {
12312   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12313                                        SizeExpr,
12314                                        IndexTypeQuals, BracketsRange);
12315 }
12316 
12317 template<typename Derived>
12318 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12319                                                unsigned NumElements,
12320                                                VectorType::VectorKind VecKind) {
12321   // FIXME: semantic checking!
12322   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12323 }
12324 
12325 template<typename Derived>
12326 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12327                                                       unsigned NumElements,
12328                                                  SourceLocation AttributeLoc) {
12329   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12330                           NumElements, true);
12331   IntegerLiteral *VectorSize
12332     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12333                              AttributeLoc);
12334   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12335 }
12336 
12337 template<typename Derived>
12338 QualType
12339 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12340                                                            Expr *SizeExpr,
12341                                                   SourceLocation AttributeLoc) {
12342   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12343 }
12344 
12345 template<typename Derived>
12346 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12347     QualType T,
12348     MutableArrayRef<QualType> ParamTypes,
12349     const FunctionProtoType::ExtProtoInfo &EPI) {
12350   return SemaRef.BuildFunctionType(T, ParamTypes,
12351                                    getDerived().getBaseLocation(),
12352                                    getDerived().getBaseEntity(),
12353                                    EPI);
12354 }
12355 
12356 template<typename Derived>
12357 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12358   return SemaRef.Context.getFunctionNoProtoType(T);
12359 }
12360 
12361 template<typename Derived>
12362 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12363                                                             Decl *D) {
12364   assert(D && "no decl found");
12365   if (D->isInvalidDecl()) return QualType();
12366 
12367   // FIXME: Doesn't account for ObjCInterfaceDecl!
12368   TypeDecl *Ty;
12369   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12370     // A valid resolved using typename pack expansion decl can have multiple
12371     // UsingDecls, but they must each have exactly one type, and it must be
12372     // the same type in every case. But we must have at least one expansion!
12373     if (UPD->expansions().empty()) {
12374       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12375           << UPD->isCXXClassMember() << UPD;
12376       return QualType();
12377     }
12378 
12379     // We might still have some unresolved types. Try to pick a resolved type
12380     // if we can. The final instantiation will check that the remaining
12381     // unresolved types instantiate to the type we pick.
12382     QualType FallbackT;
12383     QualType T;
12384     for (auto *E : UPD->expansions()) {
12385       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12386       if (ThisT.isNull())
12387         continue;
12388       else if (ThisT->getAs<UnresolvedUsingType>())
12389         FallbackT = ThisT;
12390       else if (T.isNull())
12391         T = ThisT;
12392       else
12393         assert(getSema().Context.hasSameType(ThisT, T) &&
12394                "mismatched resolved types in using pack expansion");
12395     }
12396     return T.isNull() ? FallbackT : T;
12397   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12398     assert(Using->hasTypename() &&
12399            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12400 
12401     // A valid resolved using typename decl points to exactly one type decl.
12402     assert(++Using->shadow_begin() == Using->shadow_end());
12403     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12404   } else {
12405     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12406            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12407     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12408   }
12409 
12410   return SemaRef.Context.getTypeDeclType(Ty);
12411 }
12412 
12413 template<typename Derived>
12414 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12415                                                        SourceLocation Loc) {
12416   return SemaRef.BuildTypeofExprType(E, Loc);
12417 }
12418 
12419 template<typename Derived>
12420 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12421   return SemaRef.Context.getTypeOfType(Underlying);
12422 }
12423 
12424 template<typename Derived>
12425 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12426                                                      SourceLocation Loc) {
12427   return SemaRef.BuildDecltypeType(E, Loc);
12428 }
12429 
12430 template<typename Derived>
12431 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12432                                             UnaryTransformType::UTTKind UKind,
12433                                             SourceLocation Loc) {
12434   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12435 }
12436 
12437 template<typename Derived>
12438 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12439                                                       TemplateName Template,
12440                                              SourceLocation TemplateNameLoc,
12441                                      TemplateArgumentListInfo &TemplateArgs) {
12442   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12443 }
12444 
12445 template<typename Derived>
12446 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12447                                                    SourceLocation KWLoc) {
12448   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12449 }
12450 
12451 template<typename Derived>
12452 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12453                                                  SourceLocation KWLoc,
12454                                                  bool isReadPipe) {
12455   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12456                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12457 }
12458 
12459 template<typename Derived>
12460 TemplateName
12461 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12462                                             bool TemplateKW,
12463                                             TemplateDecl *Template) {
12464   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12465                                                   Template);
12466 }
12467 
12468 template<typename Derived>
12469 TemplateName
12470 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12471                                             const IdentifierInfo &Name,
12472                                             SourceLocation NameLoc,
12473                                             QualType ObjectType,
12474                                             NamedDecl *FirstQualifierInScope,
12475                                             bool AllowInjectedClassName) {
12476   UnqualifiedId TemplateName;
12477   TemplateName.setIdentifier(&Name, NameLoc);
12478   Sema::TemplateTy Template;
12479   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12480   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12481                                        SS, TemplateKWLoc, TemplateName,
12482                                        ParsedType::make(ObjectType),
12483                                        /*EnteringContext=*/false,
12484                                        Template, AllowInjectedClassName);
12485   return Template.get();
12486 }
12487 
12488 template<typename Derived>
12489 TemplateName
12490 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12491                                             OverloadedOperatorKind Operator,
12492                                             SourceLocation NameLoc,
12493                                             QualType ObjectType,
12494                                             bool AllowInjectedClassName) {
12495   UnqualifiedId Name;
12496   // FIXME: Bogus location information.
12497   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12498   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12499   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12500   Sema::TemplateTy Template;
12501   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12502                                        SS, TemplateKWLoc, Name,
12503                                        ParsedType::make(ObjectType),
12504                                        /*EnteringContext=*/false,
12505                                        Template, AllowInjectedClassName);
12506   return Template.get();
12507 }
12508 
12509 template<typename Derived>
12510 ExprResult
12511 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12512                                                    SourceLocation OpLoc,
12513                                                    Expr *OrigCallee,
12514                                                    Expr *First,
12515                                                    Expr *Second) {
12516   Expr *Callee = OrigCallee->IgnoreParenCasts();
12517   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12518 
12519   if (First->getObjectKind() == OK_ObjCProperty) {
12520     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12521     if (BinaryOperator::isAssignmentOp(Opc))
12522       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12523                                                  First, Second);
12524     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12525     if (Result.isInvalid())
12526       return ExprError();
12527     First = Result.get();
12528   }
12529 
12530   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12531     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12532     if (Result.isInvalid())
12533       return ExprError();
12534     Second = Result.get();
12535   }
12536 
12537   // Determine whether this should be a builtin operation.
12538   if (Op == OO_Subscript) {
12539     if (!First->getType()->isOverloadableType() &&
12540         !Second->getType()->isOverloadableType())
12541       return getSema().CreateBuiltinArraySubscriptExpr(First,
12542                                                        Callee->getLocStart(),
12543                                                        Second, OpLoc);
12544   } else if (Op == OO_Arrow) {
12545     // -> is never a builtin operation.
12546     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12547   } else if (Second == nullptr || isPostIncDec) {
12548     if (!First->getType()->isOverloadableType()) {
12549       // The argument is not of overloadable type, so try to create a
12550       // built-in unary operation.
12551       UnaryOperatorKind Opc
12552         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12553 
12554       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12555     }
12556   } else {
12557     if (!First->getType()->isOverloadableType() &&
12558         !Second->getType()->isOverloadableType()) {
12559       // Neither of the arguments is an overloadable type, so try to
12560       // create a built-in binary operation.
12561       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12562       ExprResult Result
12563         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12564       if (Result.isInvalid())
12565         return ExprError();
12566 
12567       return Result;
12568     }
12569   }
12570 
12571   // Compute the transformed set of functions (and function templates) to be
12572   // used during overload resolution.
12573   UnresolvedSet<16> Functions;
12574 
12575   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12576     assert(ULE->requiresADL());
12577     Functions.append(ULE->decls_begin(), ULE->decls_end());
12578   } else {
12579     // If we've resolved this to a particular non-member function, just call
12580     // that function. If we resolved it to a member function,
12581     // CreateOverloaded* will find that function for us.
12582     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12583     if (!isa<CXXMethodDecl>(ND))
12584       Functions.addDecl(ND);
12585   }
12586 
12587   // Add any functions found via argument-dependent lookup.
12588   Expr *Args[2] = { First, Second };
12589   unsigned NumArgs = 1 + (Second != nullptr);
12590 
12591   // Create the overloaded operator invocation for unary operators.
12592   if (NumArgs == 1 || isPostIncDec) {
12593     UnaryOperatorKind Opc
12594       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12595     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
12596   }
12597 
12598   if (Op == OO_Subscript) {
12599     SourceLocation LBrace;
12600     SourceLocation RBrace;
12601 
12602     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12603         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12604         LBrace = SourceLocation::getFromRawEncoding(
12605                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12606         RBrace = SourceLocation::getFromRawEncoding(
12607                     NameLoc.CXXOperatorName.EndOpNameLoc);
12608     } else {
12609         LBrace = Callee->getLocStart();
12610         RBrace = OpLoc;
12611     }
12612 
12613     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12614                                                       First, Second);
12615   }
12616 
12617   // Create the overloaded operator invocation for binary operators.
12618   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12619   ExprResult Result
12620     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
12621   if (Result.isInvalid())
12622     return ExprError();
12623 
12624   return Result;
12625 }
12626 
12627 template<typename Derived>
12628 ExprResult
12629 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12630                                                      SourceLocation OperatorLoc,
12631                                                        bool isArrow,
12632                                                        CXXScopeSpec &SS,
12633                                                      TypeSourceInfo *ScopeType,
12634                                                        SourceLocation CCLoc,
12635                                                        SourceLocation TildeLoc,
12636                                         PseudoDestructorTypeStorage Destroyed) {
12637   QualType BaseType = Base->getType();
12638   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12639       (!isArrow && !BaseType->getAs<RecordType>()) ||
12640       (isArrow && BaseType->getAs<PointerType>() &&
12641        !BaseType->getAs<PointerType>()->getPointeeType()
12642                                               ->template getAs<RecordType>())){
12643     // This pseudo-destructor expression is still a pseudo-destructor.
12644     return SemaRef.BuildPseudoDestructorExpr(
12645         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12646         CCLoc, TildeLoc, Destroyed);
12647   }
12648 
12649   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12650   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12651                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12652   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12653   NameInfo.setNamedTypeInfo(DestroyedType);
12654 
12655   // The scope type is now known to be a valid nested name specifier
12656   // component. Tack it on to the end of the nested name specifier.
12657   if (ScopeType) {
12658     if (!ScopeType->getType()->getAs<TagType>()) {
12659       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12660                      diag::err_expected_class_or_namespace)
12661           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12662       return ExprError();
12663     }
12664     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12665               CCLoc);
12666   }
12667 
12668   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12669   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12670                                             OperatorLoc, isArrow,
12671                                             SS, TemplateKWLoc,
12672                                             /*FIXME: FirstQualifier*/ nullptr,
12673                                             NameInfo,
12674                                             /*TemplateArgs*/ nullptr,
12675                                             /*S*/nullptr);
12676 }
12677 
12678 template<typename Derived>
12679 StmtResult
12680 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12681   SourceLocation Loc = S->getLocStart();
12682   CapturedDecl *CD = S->getCapturedDecl();
12683   unsigned NumParams = CD->getNumParams();
12684   unsigned ContextParamPos = CD->getContextParamPosition();
12685   SmallVector<Sema::CapturedParamNameType, 4> Params;
12686   for (unsigned I = 0; I < NumParams; ++I) {
12687     if (I != ContextParamPos) {
12688       Params.push_back(
12689              std::make_pair(
12690                   CD->getParam(I)->getName(),
12691                   getDerived().TransformType(CD->getParam(I)->getType())));
12692     } else {
12693       Params.push_back(std::make_pair(StringRef(), QualType()));
12694     }
12695   }
12696   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12697                                      S->getCapturedRegionKind(), Params);
12698   StmtResult Body;
12699   {
12700     Sema::CompoundScopeRAII CompoundScope(getSema());
12701     Body = getDerived().TransformStmt(S->getCapturedStmt());
12702   }
12703 
12704   if (Body.isInvalid()) {
12705     getSema().ActOnCapturedRegionError();
12706     return StmtError();
12707   }
12708 
12709   return getSema().ActOnCapturedRegionEnd(Body.get());
12710 }
12711 
12712 } // end namespace clang
12713 
12714 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12715