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