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