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