xref: /freebsd-src/contrib/llvm-project/clang/lib/Sema/TreeTransform.h (revision 4824e7fd18a1223177218d4aec1b3c6c5c4a444e)
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is useful when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Subclasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new typedef type.
937   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
938     return SemaRef.Context.getTypeDeclType(Typedef);
939   }
940 
941   /// Build a new MacroDefined type.
942   QualType RebuildMacroQualifiedType(QualType T,
943                                      const IdentifierInfo *MacroII) {
944     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
945   }
946 
947   /// Build a new class/struct/union type.
948   QualType RebuildRecordType(RecordDecl *Record) {
949     return SemaRef.Context.getTypeDeclType(Record);
950   }
951 
952   /// Build a new Enum type.
953   QualType RebuildEnumType(EnumDecl *Enum) {
954     return SemaRef.Context.getTypeDeclType(Enum);
955   }
956 
957   /// Build a new typeof(expr) type.
958   ///
959   /// By default, performs semantic analysis when building the typeof type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
962 
963   /// Build a new typeof(type) type.
964   ///
965   /// By default, builds a new TypeOfType with the given underlying type.
966   QualType RebuildTypeOfType(QualType Underlying);
967 
968   /// Build a new unary transform type.
969   QualType RebuildUnaryTransformType(QualType BaseType,
970                                      UnaryTransformType::UTTKind UKind,
971                                      SourceLocation Loc);
972 
973   /// Build a new C++11 decltype type.
974   ///
975   /// By default, performs semantic analysis when building the decltype type.
976   /// Subclasses may override this routine to provide different behavior.
977   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
978 
979   /// Build a new C++11 auto type.
980   ///
981   /// By default, builds a new AutoType with the given deduced type.
982   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
983                            ConceptDecl *TypeConstraintConcept,
984                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
985     // Note, IsDependent is always false here: we implicitly convert an 'auto'
986     // which has been deduced to a dependent type into an undeduced 'auto', so
987     // that we'll retry deduction after the transformation.
988     return SemaRef.Context.getAutoType(Deduced, Keyword,
989                                        /*IsDependent*/ false, /*IsPack=*/false,
990                                        TypeConstraintConcept,
991                                        TypeConstraintArgs);
992   }
993 
994   /// By default, builds a new DeducedTemplateSpecializationType with the given
995   /// deduced type.
996   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
997       QualType Deduced) {
998     return SemaRef.Context.getDeducedTemplateSpecializationType(
999         Template, Deduced, /*IsDependent*/ false);
1000   }
1001 
1002   /// Build a new template specialization type.
1003   ///
1004   /// By default, performs semantic analysis when building the template
1005   /// specialization type. Subclasses may override this routine to provide
1006   /// different behavior.
1007   QualType RebuildTemplateSpecializationType(TemplateName Template,
1008                                              SourceLocation TemplateLoc,
1009                                              TemplateArgumentListInfo &Args);
1010 
1011   /// Build a new parenthesized type.
1012   ///
1013   /// By default, builds a new ParenType type from the inner type.
1014   /// Subclasses may override this routine to provide different behavior.
1015   QualType RebuildParenType(QualType InnerType) {
1016     return SemaRef.BuildParenType(InnerType);
1017   }
1018 
1019   /// Build a new qualified name type.
1020   ///
1021   /// By default, builds a new ElaboratedType type from the keyword,
1022   /// the nested-name-specifier and the named type.
1023   /// Subclasses may override this routine to provide different behavior.
1024   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1025                                  ElaboratedTypeKeyword Keyword,
1026                                  NestedNameSpecifierLoc QualifierLoc,
1027                                  QualType Named) {
1028     return SemaRef.Context.getElaboratedType(Keyword,
1029                                          QualifierLoc.getNestedNameSpecifier(),
1030                                              Named);
1031   }
1032 
1033   /// Build a new typename type that refers to a template-id.
1034   ///
1035   /// By default, builds a new DependentNameType type from the
1036   /// nested-name-specifier and the given type. Subclasses may override
1037   /// this routine to provide different behavior.
1038   QualType RebuildDependentTemplateSpecializationType(
1039                                           ElaboratedTypeKeyword Keyword,
1040                                           NestedNameSpecifierLoc QualifierLoc,
1041                                           SourceLocation TemplateKWLoc,
1042                                           const IdentifierInfo *Name,
1043                                           SourceLocation NameLoc,
1044                                           TemplateArgumentListInfo &Args,
1045                                           bool AllowInjectedClassName) {
1046     // Rebuild the template name.
1047     // TODO: avoid TemplateName abstraction
1048     CXXScopeSpec SS;
1049     SS.Adopt(QualifierLoc);
1050     TemplateName InstName = getDerived().RebuildTemplateName(
1051         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1052         AllowInjectedClassName);
1053 
1054     if (InstName.isNull())
1055       return QualType();
1056 
1057     // If it's still dependent, make a dependent specialization.
1058     if (InstName.getAsDependentTemplateName())
1059       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1060                                           QualifierLoc.getNestedNameSpecifier(),
1061                                                                     Name,
1062                                                                     Args);
1063 
1064     // Otherwise, make an elaborated type wrapping a non-dependent
1065     // specialization.
1066     QualType T =
1067     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1068     if (T.isNull()) return QualType();
1069 
1070     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1071       return T;
1072 
1073     return SemaRef.Context.getElaboratedType(Keyword,
1074                                        QualifierLoc.getNestedNameSpecifier(),
1075                                              T);
1076   }
1077 
1078   /// Build a new typename type that refers to an identifier.
1079   ///
1080   /// By default, performs semantic analysis when building the typename type
1081   /// (or elaborated type). Subclasses may override this routine to provide
1082   /// different behavior.
1083   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1084                                     SourceLocation KeywordLoc,
1085                                     NestedNameSpecifierLoc QualifierLoc,
1086                                     const IdentifierInfo *Id,
1087                                     SourceLocation IdLoc,
1088                                     bool DeducedTSTContext) {
1089     CXXScopeSpec SS;
1090     SS.Adopt(QualifierLoc);
1091 
1092     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1093       // If the name is still dependent, just build a new dependent name type.
1094       if (!SemaRef.computeDeclContext(SS))
1095         return SemaRef.Context.getDependentNameType(Keyword,
1096                                           QualifierLoc.getNestedNameSpecifier(),
1097                                                     Id);
1098     }
1099 
1100     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1101       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1102                                        *Id, IdLoc, DeducedTSTContext);
1103     }
1104 
1105     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1106 
1107     // We had a dependent elaborated-type-specifier that has been transformed
1108     // into a non-dependent elaborated-type-specifier. Find the tag we're
1109     // referring to.
1110     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1112     if (!DC)
1113       return QualType();
1114 
1115     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1116       return QualType();
1117 
1118     TagDecl *Tag = nullptr;
1119     SemaRef.LookupQualifiedName(Result, DC);
1120     switch (Result.getResultKind()) {
1121       case LookupResult::NotFound:
1122       case LookupResult::NotFoundInCurrentInstantiation:
1123         break;
1124 
1125       case LookupResult::Found:
1126         Tag = Result.getAsSingle<TagDecl>();
1127         break;
1128 
1129       case LookupResult::FoundOverloaded:
1130       case LookupResult::FoundUnresolvedValue:
1131         llvm_unreachable("Tag lookup cannot find non-tags");
1132 
1133       case LookupResult::Ambiguous:
1134         // Let the LookupResult structure handle ambiguities.
1135         return QualType();
1136     }
1137 
1138     if (!Tag) {
1139       // Check where the name exists but isn't a tag type and use that to emit
1140       // better diagnostics.
1141       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1142       SemaRef.LookupQualifiedName(Result, DC);
1143       switch (Result.getResultKind()) {
1144         case LookupResult::Found:
1145         case LookupResult::FoundOverloaded:
1146         case LookupResult::FoundUnresolvedValue: {
1147           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1148           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1149           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1150                                                                << NTK << Kind;
1151           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1152           break;
1153         }
1154         default:
1155           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1156               << Kind << Id << DC << QualifierLoc.getSourceRange();
1157           break;
1158       }
1159       return QualType();
1160     }
1161 
1162     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1163                                               IdLoc, Id)) {
1164       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1165       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1166       return QualType();
1167     }
1168 
1169     // Build the elaborated-type-specifier type.
1170     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1171     return SemaRef.Context.getElaboratedType(Keyword,
1172                                          QualifierLoc.getNestedNameSpecifier(),
1173                                              T);
1174   }
1175 
1176   /// Build a new pack expansion type.
1177   ///
1178   /// By default, builds a new PackExpansionType type from the given pattern.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildPackExpansionType(QualType Pattern,
1181                                     SourceRange PatternRange,
1182                                     SourceLocation EllipsisLoc,
1183                                     Optional<unsigned> NumExpansions) {
1184     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1185                                         NumExpansions);
1186   }
1187 
1188   /// Build a new atomic type given its value type.
1189   ///
1190   /// By default, performs semantic analysis when building the atomic type.
1191   /// Subclasses may override this routine to provide different behavior.
1192   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1193 
1194   /// Build a new pipe type given its value type.
1195   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1196                            bool isReadPipe);
1197 
1198    /// Build an extended int given its value type.
1199   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1200                              SourceLocation Loc);
1201 
1202   /// Build a dependent extended int given its value type.
1203   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1204                                       SourceLocation Loc);
1205 
1206   /// Build a new template name given a nested name specifier, a flag
1207   /// indicating whether the "template" keyword was provided, and the template
1208   /// that the template name refers to.
1209   ///
1210   /// By default, builds the new template name directly. Subclasses may override
1211   /// this routine to provide different behavior.
1212   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1213                                    bool TemplateKW,
1214                                    TemplateDecl *Template);
1215 
1216   /// Build a new template name given a nested name specifier and the
1217   /// name that is referred to as a template.
1218   ///
1219   /// By default, performs semantic analysis to determine whether the name can
1220   /// be resolved to a specific template, then builds the appropriate kind of
1221   /// template name. Subclasses may override this routine to provide different
1222   /// behavior.
1223   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1224                                    SourceLocation TemplateKWLoc,
1225                                    const IdentifierInfo &Name,
1226                                    SourceLocation NameLoc, QualType ObjectType,
1227                                    NamedDecl *FirstQualifierInScope,
1228                                    bool AllowInjectedClassName);
1229 
1230   /// Build a new template name given a nested name specifier and the
1231   /// overloaded operator name that is referred to as a template.
1232   ///
1233   /// By default, performs semantic analysis to determine whether the name can
1234   /// be resolved to a specific template, then builds the appropriate kind of
1235   /// template name. Subclasses may override this routine to provide different
1236   /// behavior.
1237   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1238                                    SourceLocation TemplateKWLoc,
1239                                    OverloadedOperatorKind Operator,
1240                                    SourceLocation NameLoc, QualType ObjectType,
1241                                    bool AllowInjectedClassName);
1242 
1243   /// Build a new template name given a template template parameter pack
1244   /// and the
1245   ///
1246   /// By default, performs semantic analysis to determine whether the name can
1247   /// be resolved to a specific template, then builds the appropriate kind of
1248   /// template name. Subclasses may override this routine to provide different
1249   /// behavior.
1250   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1251                                    const TemplateArgument &ArgPack) {
1252     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1253   }
1254 
1255   /// Build a new compound statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1260                                        MultiStmtArg Statements,
1261                                        SourceLocation RBraceLoc,
1262                                        bool IsStmtExpr) {
1263     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1264                                        IsStmtExpr);
1265   }
1266 
1267   /// Build a new case statement.
1268   ///
1269   /// By default, performs semantic analysis to build the new statement.
1270   /// Subclasses may override this routine to provide different behavior.
1271   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1272                                    Expr *LHS,
1273                                    SourceLocation EllipsisLoc,
1274                                    Expr *RHS,
1275                                    SourceLocation ColonLoc) {
1276     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1277                                    ColonLoc);
1278   }
1279 
1280   /// Attach the body to a new case statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1285     getSema().ActOnCaseStmtBody(S, Body);
1286     return S;
1287   }
1288 
1289   /// Build a new default statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
1293   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1294                                       SourceLocation ColonLoc,
1295                                       Stmt *SubStmt) {
1296     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1297                                       /*CurScope=*/nullptr);
1298   }
1299 
1300   /// Build a new label statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1305                               SourceLocation ColonLoc, Stmt *SubStmt) {
1306     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1307   }
1308 
1309   /// Build a new attributed statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1314                                    ArrayRef<const Attr *> Attrs,
1315                                    Stmt *SubStmt) {
1316     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1317   }
1318 
1319   /// Build a new "if" statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
1323   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1324                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1325                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1326                            SourceLocation ElseLoc, Stmt *Else) {
1327     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1328                                  Then, ElseLoc, Else);
1329   }
1330 
1331   /// Start building a new switch statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1336                                     SourceLocation LParenLoc, Stmt *Init,
1337                                     Sema::ConditionResult Cond,
1338                                     SourceLocation RParenLoc) {
1339     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1340                                             RParenLoc);
1341   }
1342 
1343   /// Attach the body to the switch statement.
1344   ///
1345   /// By default, performs semantic analysis to build the new statement.
1346   /// Subclasses may override this routine to provide different behavior.
1347   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1348                                    Stmt *Switch, Stmt *Body) {
1349     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1350   }
1351 
1352   /// Build a new while statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
1356   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1357                               Sema::ConditionResult Cond,
1358                               SourceLocation RParenLoc, Stmt *Body) {
1359     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1360   }
1361 
1362   /// Build a new do-while statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1367                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1368                            Expr *Cond, SourceLocation RParenLoc) {
1369     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1370                                  Cond, RParenLoc);
1371   }
1372 
1373   /// Build a new for statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
1377   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1378                             Stmt *Init, Sema::ConditionResult Cond,
1379                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1380                             Stmt *Body) {
1381     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1382                                   Inc, RParenLoc, Body);
1383   }
1384 
1385   /// Build a new goto statement.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
1389   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1390                              LabelDecl *Label) {
1391     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1392   }
1393 
1394   /// Build a new indirect goto statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
1398   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1399                                      SourceLocation StarLoc,
1400                                      Expr *Target) {
1401     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1402   }
1403 
1404   /// Build a new return statement.
1405   ///
1406   /// By default, performs semantic analysis to build the new statement.
1407   /// Subclasses may override this routine to provide different behavior.
1408   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1409     return getSema().BuildReturnStmt(ReturnLoc, Result);
1410   }
1411 
1412   /// Build a new declaration statement.
1413   ///
1414   /// By default, performs semantic analysis to build the new statement.
1415   /// Subclasses may override this routine to provide different behavior.
1416   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1417                              SourceLocation StartLoc, SourceLocation EndLoc) {
1418     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1419     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1420   }
1421 
1422   /// Build a new inline asm 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 RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1427                                bool IsVolatile, unsigned NumOutputs,
1428                                unsigned NumInputs, IdentifierInfo **Names,
1429                                MultiExprArg Constraints, MultiExprArg Exprs,
1430                                Expr *AsmString, MultiExprArg Clobbers,
1431                                unsigned NumLabels,
1432                                SourceLocation RParenLoc) {
1433     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1434                                      NumInputs, Names, Constraints, Exprs,
1435                                      AsmString, Clobbers, NumLabels, RParenLoc);
1436   }
1437 
1438   /// Build a new MS style inline asm statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1443                               ArrayRef<Token> AsmToks,
1444                               StringRef AsmString,
1445                               unsigned NumOutputs, unsigned NumInputs,
1446                               ArrayRef<StringRef> Constraints,
1447                               ArrayRef<StringRef> Clobbers,
1448                               ArrayRef<Expr*> Exprs,
1449                               SourceLocation EndLoc) {
1450     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1451                                     NumOutputs, NumInputs,
1452                                     Constraints, Clobbers, Exprs, EndLoc);
1453   }
1454 
1455   /// Build a new co_return statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1460                                  bool IsImplicit) {
1461     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1462   }
1463 
1464   /// Build a new co_await expression.
1465   ///
1466   /// By default, performs semantic analysis to build the new expression.
1467   /// Subclasses may override this routine to provide different behavior.
1468   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1469                                 bool IsImplicit) {
1470     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1471   }
1472 
1473   /// Build a new co_await expression.
1474   ///
1475   /// By default, performs semantic analysis to build the new expression.
1476   /// Subclasses may override this routine to provide different behavior.
1477   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1478                                          Expr *Result,
1479                                          UnresolvedLookupExpr *Lookup) {
1480     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1481   }
1482 
1483   /// Build a new co_yield expression.
1484   ///
1485   /// By default, performs semantic analysis to build the new expression.
1486   /// Subclasses may override this routine to provide different behavior.
1487   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1488     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1489   }
1490 
1491   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1492     return getSema().BuildCoroutineBodyStmt(Args);
1493   }
1494 
1495   /// Build a new Objective-C \@try statement.
1496   ///
1497   /// By default, performs semantic analysis to build the new statement.
1498   /// Subclasses may override this routine to provide different behavior.
1499   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1500                                         Stmt *TryBody,
1501                                         MultiStmtArg CatchStmts,
1502                                         Stmt *Finally) {
1503     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1504                                         Finally);
1505   }
1506 
1507   /// Rebuild an Objective-C exception declaration.
1508   ///
1509   /// By default, performs semantic analysis to build the new declaration.
1510   /// Subclasses may override this routine to provide different behavior.
1511   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1512                                     TypeSourceInfo *TInfo, QualType T) {
1513     return getSema().BuildObjCExceptionDecl(TInfo, T,
1514                                             ExceptionDecl->getInnerLocStart(),
1515                                             ExceptionDecl->getLocation(),
1516                                             ExceptionDecl->getIdentifier());
1517   }
1518 
1519   /// Build a new Objective-C \@catch statement.
1520   ///
1521   /// By default, performs semantic analysis to build the new statement.
1522   /// Subclasses may override this routine to provide different behavior.
1523   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1524                                           SourceLocation RParenLoc,
1525                                           VarDecl *Var,
1526                                           Stmt *Body) {
1527     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1528                                           Var, Body);
1529   }
1530 
1531   /// Build a new Objective-C \@finally statement.
1532   ///
1533   /// By default, performs semantic analysis to build the new statement.
1534   /// Subclasses may override this routine to provide different behavior.
1535   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1536                                             Stmt *Body) {
1537     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1538   }
1539 
1540   /// Build a new Objective-C \@throw statement.
1541   ///
1542   /// By default, performs semantic analysis to build the new statement.
1543   /// Subclasses may override this routine to provide different behavior.
1544   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1545                                           Expr *Operand) {
1546     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1547   }
1548 
1549   /// Build a new OpenMP Canonical loop.
1550   ///
1551   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1552   /// OMPCanonicalLoop.
1553   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1554     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1555   }
1556 
1557   /// Build a new OpenMP executable directive.
1558   ///
1559   /// By default, performs semantic analysis to build the new statement.
1560   /// Subclasses may override this routine to provide different behavior.
1561   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1562                                            DeclarationNameInfo DirName,
1563                                            OpenMPDirectiveKind CancelRegion,
1564                                            ArrayRef<OMPClause *> Clauses,
1565                                            Stmt *AStmt, SourceLocation StartLoc,
1566                                            SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPExecutableDirective(
1568         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'if' clause.
1572   ///
1573   /// By default, performs semantic analysis to build the new OpenMP clause.
1574   /// Subclasses may override this routine to provide different behavior.
1575   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1576                                 Expr *Condition, SourceLocation StartLoc,
1577                                 SourceLocation LParenLoc,
1578                                 SourceLocation NameModifierLoc,
1579                                 SourceLocation ColonLoc,
1580                                 SourceLocation EndLoc) {
1581     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1582                                          LParenLoc, NameModifierLoc, ColonLoc,
1583                                          EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'final' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
1590   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1591                                    SourceLocation LParenLoc,
1592                                    SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1594                                             EndLoc);
1595   }
1596 
1597   /// Build a new OpenMP 'num_threads' clause.
1598   ///
1599   /// By default, performs semantic analysis to build the new OpenMP clause.
1600   /// Subclasses may override this routine to provide different behavior.
1601   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1602                                         SourceLocation StartLoc,
1603                                         SourceLocation LParenLoc,
1604                                         SourceLocation EndLoc) {
1605     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1606                                                  LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'safelen' 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 *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'simdlen' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
1623   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1630                                    SourceLocation StartLoc,
1631                                    SourceLocation LParenLoc,
1632                                    SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'full' clause.
1637   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1638                                   SourceLocation EndLoc) {
1639     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1640   }
1641 
1642   /// Build a new OpenMP 'partial' clause.
1643   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1644                                      SourceLocation LParenLoc,
1645                                      SourceLocation EndLoc) {
1646     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1647                                               EndLoc);
1648   }
1649 
1650   /// Build a new OpenMP 'allocator' clause.
1651   ///
1652   /// By default, performs semantic analysis to build the new OpenMP clause.
1653   /// Subclasses may override this routine to provide different behavior.
1654   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1655                                        SourceLocation LParenLoc,
1656                                        SourceLocation EndLoc) {
1657     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1658   }
1659 
1660   /// Build a new OpenMP 'collapse' clause.
1661   ///
1662   /// By default, performs semantic analysis to build the new OpenMP clause.
1663   /// Subclasses may override this routine to provide different behavior.
1664   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1665                                       SourceLocation LParenLoc,
1666                                       SourceLocation EndLoc) {
1667     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1668                                                EndLoc);
1669   }
1670 
1671   /// Build a new OpenMP 'default' clause.
1672   ///
1673   /// By default, performs semantic analysis to build the new OpenMP clause.
1674   /// Subclasses may override this routine to provide different behavior.
1675   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1676                                      SourceLocation StartLoc,
1677                                      SourceLocation LParenLoc,
1678                                      SourceLocation EndLoc) {
1679     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1680                                               StartLoc, LParenLoc, EndLoc);
1681   }
1682 
1683   /// Build a new OpenMP 'proc_bind' clause.
1684   ///
1685   /// By default, performs semantic analysis to build the new OpenMP clause.
1686   /// Subclasses may override this routine to provide different behavior.
1687   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1688                                       SourceLocation KindKwLoc,
1689                                       SourceLocation StartLoc,
1690                                       SourceLocation LParenLoc,
1691                                       SourceLocation EndLoc) {
1692     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1693                                                StartLoc, LParenLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'schedule' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPScheduleClause(
1701       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1702       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1703       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1704       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1705     return getSema().ActOnOpenMPScheduleClause(
1706         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1707         CommaLoc, EndLoc);
1708   }
1709 
1710   /// Build a new OpenMP 'ordered' clause.
1711   ///
1712   /// By default, performs semantic analysis to build the new OpenMP clause.
1713   /// Subclasses may override this routine to provide different behavior.
1714   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1715                                      SourceLocation EndLoc,
1716                                      SourceLocation LParenLoc, Expr *Num) {
1717     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1718   }
1719 
1720   /// Build a new OpenMP 'private' clause.
1721   ///
1722   /// By default, performs semantic analysis to build the new OpenMP clause.
1723   /// Subclasses may override this routine to provide different behavior.
1724   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1725                                      SourceLocation StartLoc,
1726                                      SourceLocation LParenLoc,
1727                                      SourceLocation EndLoc) {
1728     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1729                                               EndLoc);
1730   }
1731 
1732   /// Build a new OpenMP 'firstprivate' clause.
1733   ///
1734   /// By default, performs semantic analysis to build the new OpenMP clause.
1735   /// Subclasses may override this routine to provide different behavior.
1736   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1737                                           SourceLocation StartLoc,
1738                                           SourceLocation LParenLoc,
1739                                           SourceLocation EndLoc) {
1740     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1741                                                    EndLoc);
1742   }
1743 
1744   /// Build a new OpenMP 'lastprivate' clause.
1745   ///
1746   /// By default, performs semantic analysis to build the new OpenMP clause.
1747   /// Subclasses may override this routine to provide different behavior.
1748   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1749                                          OpenMPLastprivateModifier LPKind,
1750                                          SourceLocation LPKindLoc,
1751                                          SourceLocation ColonLoc,
1752                                          SourceLocation StartLoc,
1753                                          SourceLocation LParenLoc,
1754                                          SourceLocation EndLoc) {
1755     return getSema().ActOnOpenMPLastprivateClause(
1756         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1757   }
1758 
1759   /// Build a new OpenMP 'shared' clause.
1760   ///
1761   /// By default, performs semantic analysis to build the new OpenMP clause.
1762   /// Subclasses may override this routine to provide different behavior.
1763   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1764                                     SourceLocation StartLoc,
1765                                     SourceLocation LParenLoc,
1766                                     SourceLocation EndLoc) {
1767     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1768                                              EndLoc);
1769   }
1770 
1771   /// Build a new OpenMP 'reduction' clause.
1772   ///
1773   /// By default, performs semantic analysis to build the new statement.
1774   /// Subclasses may override this routine to provide different behavior.
1775   OMPClause *RebuildOMPReductionClause(
1776       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1777       SourceLocation StartLoc, SourceLocation LParenLoc,
1778       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1779       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1780       const DeclarationNameInfo &ReductionId,
1781       ArrayRef<Expr *> UnresolvedReductions) {
1782     return getSema().ActOnOpenMPReductionClause(
1783         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1784         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1785   }
1786 
1787   /// Build a new OpenMP 'task_reduction' clause.
1788   ///
1789   /// By default, performs semantic analysis to build the new statement.
1790   /// Subclasses may override this routine to provide different behavior.
1791   OMPClause *RebuildOMPTaskReductionClause(
1792       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1793       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1794       CXXScopeSpec &ReductionIdScopeSpec,
1795       const DeclarationNameInfo &ReductionId,
1796       ArrayRef<Expr *> UnresolvedReductions) {
1797     return getSema().ActOnOpenMPTaskReductionClause(
1798         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1799         ReductionId, UnresolvedReductions);
1800   }
1801 
1802   /// Build a new OpenMP 'in_reduction' clause.
1803   ///
1804   /// By default, performs semantic analysis to build the new statement.
1805   /// Subclasses may override this routine to provide different behavior.
1806   OMPClause *
1807   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1808                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1809                               SourceLocation EndLoc,
1810                               CXXScopeSpec &ReductionIdScopeSpec,
1811                               const DeclarationNameInfo &ReductionId,
1812                               ArrayRef<Expr *> UnresolvedReductions) {
1813     return getSema().ActOnOpenMPInReductionClause(
1814         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1815         ReductionId, UnresolvedReductions);
1816   }
1817 
1818   /// Build a new OpenMP 'linear' clause.
1819   ///
1820   /// By default, performs semantic analysis to build the new OpenMP clause.
1821   /// Subclasses may override this routine to provide different behavior.
1822   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1823                                     SourceLocation StartLoc,
1824                                     SourceLocation LParenLoc,
1825                                     OpenMPLinearClauseKind Modifier,
1826                                     SourceLocation ModifierLoc,
1827                                     SourceLocation ColonLoc,
1828                                     SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1830                                              Modifier, ModifierLoc, ColonLoc,
1831                                              EndLoc);
1832   }
1833 
1834   /// Build a new OpenMP 'aligned' clause.
1835   ///
1836   /// By default, performs semantic analysis to build the new OpenMP clause.
1837   /// Subclasses may override this routine to provide different behavior.
1838   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1839                                      SourceLocation StartLoc,
1840                                      SourceLocation LParenLoc,
1841                                      SourceLocation ColonLoc,
1842                                      SourceLocation EndLoc) {
1843     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1844                                               LParenLoc, ColonLoc, EndLoc);
1845   }
1846 
1847   /// Build a new OpenMP 'copyin' clause.
1848   ///
1849   /// By default, performs semantic analysis to build the new OpenMP clause.
1850   /// Subclasses may override this routine to provide different behavior.
1851   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1852                                     SourceLocation StartLoc,
1853                                     SourceLocation LParenLoc,
1854                                     SourceLocation EndLoc) {
1855     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1856                                              EndLoc);
1857   }
1858 
1859   /// Build a new OpenMP 'copyprivate' clause.
1860   ///
1861   /// By default, performs semantic analysis to build the new OpenMP clause.
1862   /// Subclasses may override this routine to provide different behavior.
1863   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1864                                          SourceLocation StartLoc,
1865                                          SourceLocation LParenLoc,
1866                                          SourceLocation EndLoc) {
1867     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1868                                                   EndLoc);
1869   }
1870 
1871   /// Build a new OpenMP 'flush' pseudo clause.
1872   ///
1873   /// By default, performs semantic analysis to build the new OpenMP clause.
1874   /// Subclasses may override this routine to provide different behavior.
1875   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1876                                    SourceLocation StartLoc,
1877                                    SourceLocation LParenLoc,
1878                                    SourceLocation EndLoc) {
1879     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1880                                             EndLoc);
1881   }
1882 
1883   /// Build a new OpenMP 'depobj' pseudo clause.
1884   ///
1885   /// By default, performs semantic analysis to build the new OpenMP clause.
1886   /// Subclasses may override this routine to provide different behavior.
1887   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1888                                     SourceLocation LParenLoc,
1889                                     SourceLocation EndLoc) {
1890     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1891                                              EndLoc);
1892   }
1893 
1894   /// Build a new OpenMP 'depend' pseudo clause.
1895   ///
1896   /// By default, performs semantic analysis to build the new OpenMP clause.
1897   /// Subclasses may override this routine to provide different behavior.
1898   OMPClause *
1899   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1900                          SourceLocation DepLoc, SourceLocation ColonLoc,
1901                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1902                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1903     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1904                                              ColonLoc, VarList, StartLoc,
1905                                              LParenLoc, EndLoc);
1906   }
1907 
1908   /// Build a new OpenMP 'device' clause.
1909   ///
1910   /// By default, performs semantic analysis to build the new statement.
1911   /// Subclasses may override this routine to provide different behavior.
1912   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1913                                     Expr *Device, SourceLocation StartLoc,
1914                                     SourceLocation LParenLoc,
1915                                     SourceLocation ModifierLoc,
1916                                     SourceLocation EndLoc) {
1917     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1918                                              LParenLoc, ModifierLoc, EndLoc);
1919   }
1920 
1921   /// Build a new OpenMP 'map' clause.
1922   ///
1923   /// By default, performs semantic analysis to build the new OpenMP clause.
1924   /// Subclasses may override this routine to provide different behavior.
1925   OMPClause *RebuildOMPMapClause(
1926       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1927       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1928       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1929       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1930       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1931       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1932     return getSema().ActOnOpenMPMapClause(
1933         MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId,
1934         MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs,
1935         /*NoDiagnose=*/false, UnresolvedMappers);
1936   }
1937 
1938   /// Build a new OpenMP 'allocate' clause.
1939   ///
1940   /// By default, performs semantic analysis to build the new OpenMP clause.
1941   /// Subclasses may override this routine to provide different behavior.
1942   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1943                                       SourceLocation StartLoc,
1944                                       SourceLocation LParenLoc,
1945                                       SourceLocation ColonLoc,
1946                                       SourceLocation EndLoc) {
1947     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1948                                                LParenLoc, ColonLoc, EndLoc);
1949   }
1950 
1951   /// Build a new OpenMP 'num_teams' clause.
1952   ///
1953   /// By default, performs semantic analysis to build the new statement.
1954   /// Subclasses may override this routine to provide different behavior.
1955   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1956                                       SourceLocation LParenLoc,
1957                                       SourceLocation EndLoc) {
1958     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1959                                                EndLoc);
1960   }
1961 
1962   /// Build a new OpenMP 'thread_limit' clause.
1963   ///
1964   /// By default, performs semantic analysis to build the new statement.
1965   /// Subclasses may override this routine to provide different behavior.
1966   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1967                                          SourceLocation StartLoc,
1968                                          SourceLocation LParenLoc,
1969                                          SourceLocation EndLoc) {
1970     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1971                                                   LParenLoc, EndLoc);
1972   }
1973 
1974   /// Build a new OpenMP 'priority' clause.
1975   ///
1976   /// By default, performs semantic analysis to build the new statement.
1977   /// Subclasses may override this routine to provide different behavior.
1978   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1979                                       SourceLocation LParenLoc,
1980                                       SourceLocation EndLoc) {
1981     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1982                                                EndLoc);
1983   }
1984 
1985   /// Build a new OpenMP 'grainsize' clause.
1986   ///
1987   /// By default, performs semantic analysis to build the new statement.
1988   /// Subclasses may override this routine to provide different behavior.
1989   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1990                                        SourceLocation LParenLoc,
1991                                        SourceLocation EndLoc) {
1992     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1993                                                 EndLoc);
1994   }
1995 
1996   /// Build a new OpenMP 'num_tasks' clause.
1997   ///
1998   /// By default, performs semantic analysis to build the new statement.
1999   /// Subclasses may override this routine to provide different behavior.
2000   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
2001                                       SourceLocation LParenLoc,
2002                                       SourceLocation EndLoc) {
2003     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
2004                                                EndLoc);
2005   }
2006 
2007   /// Build a new OpenMP 'hint' clause.
2008   ///
2009   /// By default, performs semantic analysis to build the new statement.
2010   /// Subclasses may override this routine to provide different behavior.
2011   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2012                                   SourceLocation LParenLoc,
2013                                   SourceLocation EndLoc) {
2014     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2015   }
2016 
2017   /// Build a new OpenMP 'detach' clause.
2018   ///
2019   /// By default, performs semantic analysis to build the new statement.
2020   /// Subclasses may override this routine to provide different behavior.
2021   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2022                                     SourceLocation LParenLoc,
2023                                     SourceLocation EndLoc) {
2024     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2025   }
2026 
2027   /// Build a new OpenMP 'dist_schedule' clause.
2028   ///
2029   /// By default, performs semantic analysis to build the new OpenMP clause.
2030   /// Subclasses may override this routine to provide different behavior.
2031   OMPClause *
2032   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2033                                Expr *ChunkSize, SourceLocation StartLoc,
2034                                SourceLocation LParenLoc, SourceLocation KindLoc,
2035                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2036     return getSema().ActOnOpenMPDistScheduleClause(
2037         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2038   }
2039 
2040   /// Build a new OpenMP 'to' clause.
2041   ///
2042   /// By default, performs semantic analysis to build the new statement.
2043   /// Subclasses may override this routine to provide different behavior.
2044   OMPClause *
2045   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2046                      ArrayRef<SourceLocation> MotionModifiersLoc,
2047                      CXXScopeSpec &MapperIdScopeSpec,
2048                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2049                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2050                      ArrayRef<Expr *> UnresolvedMappers) {
2051     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2052                                          MapperIdScopeSpec, MapperId, ColonLoc,
2053                                          VarList, Locs, UnresolvedMappers);
2054   }
2055 
2056   /// Build a new OpenMP 'from' clause.
2057   ///
2058   /// By default, performs semantic analysis to build the new statement.
2059   /// Subclasses may override this routine to provide different behavior.
2060   OMPClause *
2061   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2062                        ArrayRef<SourceLocation> MotionModifiersLoc,
2063                        CXXScopeSpec &MapperIdScopeSpec,
2064                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2065                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2066                        ArrayRef<Expr *> UnresolvedMappers) {
2067     return getSema().ActOnOpenMPFromClause(
2068         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2069         ColonLoc, VarList, Locs, UnresolvedMappers);
2070   }
2071 
2072   /// Build a new OpenMP 'use_device_ptr' clause.
2073   ///
2074   /// By default, performs semantic analysis to build the new OpenMP clause.
2075   /// Subclasses may override this routine to provide different behavior.
2076   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2077                                           const OMPVarListLocTy &Locs) {
2078     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2079   }
2080 
2081   /// Build a new OpenMP 'use_device_addr' clause.
2082   ///
2083   /// By default, performs semantic analysis to build the new OpenMP clause.
2084   /// Subclasses may override this routine to provide different behavior.
2085   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2086                                            const OMPVarListLocTy &Locs) {
2087     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2088   }
2089 
2090   /// Build a new OpenMP 'is_device_ptr' clause.
2091   ///
2092   /// By default, performs semantic analysis to build the new OpenMP clause.
2093   /// Subclasses may override this routine to provide different behavior.
2094   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2095                                          const OMPVarListLocTy &Locs) {
2096     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2097   }
2098 
2099   /// Build a new OpenMP 'defaultmap' clause.
2100   ///
2101   /// By default, performs semantic analysis to build the new OpenMP clause.
2102   /// Subclasses may override this routine to provide different behavior.
2103   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2104                                         OpenMPDefaultmapClauseKind Kind,
2105                                         SourceLocation StartLoc,
2106                                         SourceLocation LParenLoc,
2107                                         SourceLocation MLoc,
2108                                         SourceLocation KindLoc,
2109                                         SourceLocation EndLoc) {
2110     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2111                                                  MLoc, KindLoc, EndLoc);
2112   }
2113 
2114   /// Build a new OpenMP 'nontemporal' clause.
2115   ///
2116   /// By default, performs semantic analysis to build the new OpenMP clause.
2117   /// Subclasses may override this routine to provide different behavior.
2118   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2119                                          SourceLocation StartLoc,
2120                                          SourceLocation LParenLoc,
2121                                          SourceLocation EndLoc) {
2122     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2123                                                   EndLoc);
2124   }
2125 
2126   /// Build a new OpenMP 'inclusive' clause.
2127   ///
2128   /// By default, performs semantic analysis to build the new OpenMP clause.
2129   /// Subclasses may override this routine to provide different behavior.
2130   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2131                                        SourceLocation StartLoc,
2132                                        SourceLocation LParenLoc,
2133                                        SourceLocation EndLoc) {
2134     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2135                                                 EndLoc);
2136   }
2137 
2138   /// Build a new OpenMP 'exclusive' clause.
2139   ///
2140   /// By default, performs semantic analysis to build the new OpenMP clause.
2141   /// Subclasses may override this routine to provide different behavior.
2142   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2143                                        SourceLocation StartLoc,
2144                                        SourceLocation LParenLoc,
2145                                        SourceLocation EndLoc) {
2146     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2147                                                 EndLoc);
2148   }
2149 
2150   /// Build a new OpenMP 'uses_allocators' clause.
2151   ///
2152   /// By default, performs semantic analysis to build the new OpenMP clause.
2153   /// Subclasses may override this routine to provide different behavior.
2154   OMPClause *RebuildOMPUsesAllocatorsClause(
2155       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2156       SourceLocation LParenLoc, SourceLocation EndLoc) {
2157     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2158                                                     Data);
2159   }
2160 
2161   /// Build a new OpenMP 'affinity' clause.
2162   ///
2163   /// By default, performs semantic analysis to build the new OpenMP clause.
2164   /// Subclasses may override this routine to provide different behavior.
2165   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2166                                       SourceLocation LParenLoc,
2167                                       SourceLocation ColonLoc,
2168                                       SourceLocation EndLoc, Expr *Modifier,
2169                                       ArrayRef<Expr *> Locators) {
2170     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2171                                                EndLoc, Modifier, Locators);
2172   }
2173 
2174   /// Build a new OpenMP 'order' clause.
2175   ///
2176   /// By default, performs semantic analysis to build the new OpenMP clause.
2177   /// Subclasses may override this routine to provide different behavior.
2178   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2179                                    SourceLocation KindKwLoc,
2180                                    SourceLocation StartLoc,
2181                                    SourceLocation LParenLoc,
2182                                    SourceLocation EndLoc) {
2183     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2184                                             LParenLoc, EndLoc);
2185   }
2186 
2187   /// Build a new OpenMP 'init' clause.
2188   ///
2189   /// By default, performs semantic analysis to build the new OpenMP clause.
2190   /// Subclasses may override this routine to provide different behavior.
2191   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2192                                   bool IsTarget, bool IsTargetSync,
2193                                   SourceLocation StartLoc,
2194                                   SourceLocation LParenLoc,
2195                                   SourceLocation VarLoc,
2196                                   SourceLocation EndLoc) {
2197     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2198                                            IsTargetSync, StartLoc, LParenLoc,
2199                                            VarLoc, EndLoc);
2200   }
2201 
2202   /// Build a new OpenMP 'use' clause.
2203   ///
2204   /// By default, performs semantic analysis to build the new OpenMP clause.
2205   /// Subclasses may override this routine to provide different behavior.
2206   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2207                                  SourceLocation LParenLoc,
2208                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2209     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2210                                           VarLoc, EndLoc);
2211   }
2212 
2213   /// Build a new OpenMP 'destroy' clause.
2214   ///
2215   /// By default, performs semantic analysis to build the new OpenMP clause.
2216   /// Subclasses may override this routine to provide different behavior.
2217   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2218                                      SourceLocation LParenLoc,
2219                                      SourceLocation VarLoc,
2220                                      SourceLocation EndLoc) {
2221     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2222                                               VarLoc, EndLoc);
2223   }
2224 
2225   /// Build a new OpenMP 'novariants' clause.
2226   ///
2227   /// By default, performs semantic analysis to build the new OpenMP clause.
2228   /// Subclasses may override this routine to provide different behavior.
2229   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2230                                         SourceLocation StartLoc,
2231                                         SourceLocation LParenLoc,
2232                                         SourceLocation EndLoc) {
2233     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2234                                                  EndLoc);
2235   }
2236 
2237   /// Build a new OpenMP 'nocontext' clause.
2238   ///
2239   /// By default, performs semantic analysis to build the new OpenMP clause.
2240   /// Subclasses may override this routine to provide different behavior.
2241   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2242                                        SourceLocation LParenLoc,
2243                                        SourceLocation EndLoc) {
2244     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2245                                                 EndLoc);
2246   }
2247 
2248   /// Build a new OpenMP 'filter' clause.
2249   ///
2250   /// By default, performs semantic analysis to build the new OpenMP clause.
2251   /// Subclasses may override this routine to provide different behavior.
2252   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2253                                     SourceLocation LParenLoc,
2254                                     SourceLocation EndLoc) {
2255     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2256                                              EndLoc);
2257   }
2258 
2259   /// Build a new OpenMP 'bind' clause.
2260   ///
2261   /// By default, performs semantic analysis to build the new OpenMP clause.
2262   /// Subclasses may override this routine to provide different behavior.
2263   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2264                                   SourceLocation KindLoc,
2265                                   SourceLocation StartLoc,
2266                                   SourceLocation LParenLoc,
2267                                   SourceLocation EndLoc) {
2268     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2269                                            EndLoc);
2270   }
2271 
2272   /// Build a new OpenMP 'align' clause.
2273   ///
2274   /// By default, performs semantic analysis to build the new OpenMP clause.
2275   /// Subclasses may override this routine to provide different behavior.
2276   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2277                                    SourceLocation LParenLoc,
2278                                    SourceLocation EndLoc) {
2279     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2280   }
2281 
2282   /// Rebuild the operand to an Objective-C \@synchronized statement.
2283   ///
2284   /// By default, performs semantic analysis to build the new statement.
2285   /// Subclasses may override this routine to provide different behavior.
2286   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2287                                               Expr *object) {
2288     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2289   }
2290 
2291   /// Build a new Objective-C \@synchronized statement.
2292   ///
2293   /// By default, performs semantic analysis to build the new statement.
2294   /// Subclasses may override this routine to provide different behavior.
2295   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2296                                            Expr *Object, Stmt *Body) {
2297     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2298   }
2299 
2300   /// Build a new Objective-C \@autoreleasepool statement.
2301   ///
2302   /// By default, performs semantic analysis to build the new statement.
2303   /// Subclasses may override this routine to provide different behavior.
2304   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2305                                             Stmt *Body) {
2306     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2307   }
2308 
2309   /// Build a new Objective-C fast enumeration statement.
2310   ///
2311   /// By default, performs semantic analysis to build the new statement.
2312   /// Subclasses may override this routine to provide different behavior.
2313   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2314                                           Stmt *Element,
2315                                           Expr *Collection,
2316                                           SourceLocation RParenLoc,
2317                                           Stmt *Body) {
2318     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2319                                                 Element,
2320                                                 Collection,
2321                                                 RParenLoc);
2322     if (ForEachStmt.isInvalid())
2323       return StmtError();
2324 
2325     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2326   }
2327 
2328   /// Build a new C++ exception declaration.
2329   ///
2330   /// By default, performs semantic analysis to build the new decaration.
2331   /// Subclasses may override this routine to provide different behavior.
2332   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2333                                 TypeSourceInfo *Declarator,
2334                                 SourceLocation StartLoc,
2335                                 SourceLocation IdLoc,
2336                                 IdentifierInfo *Id) {
2337     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2338                                                        StartLoc, IdLoc, Id);
2339     if (Var)
2340       getSema().CurContext->addDecl(Var);
2341     return Var;
2342   }
2343 
2344   /// Build a new C++ catch statement.
2345   ///
2346   /// By default, performs semantic analysis to build the new statement.
2347   /// Subclasses may override this routine to provide different behavior.
2348   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2349                                  VarDecl *ExceptionDecl,
2350                                  Stmt *Handler) {
2351     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2352                                                       Handler));
2353   }
2354 
2355   /// Build a new C++ try statement.
2356   ///
2357   /// By default, performs semantic analysis to build the new statement.
2358   /// Subclasses may override this routine to provide different behavior.
2359   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2360                                ArrayRef<Stmt *> Handlers) {
2361     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2362   }
2363 
2364   /// Build a new C++0x range-based for statement.
2365   ///
2366   /// By default, performs semantic analysis to build the new statement.
2367   /// Subclasses may override this routine to provide different behavior.
2368   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2369                                     SourceLocation CoawaitLoc, Stmt *Init,
2370                                     SourceLocation ColonLoc, Stmt *Range,
2371                                     Stmt *Begin, Stmt *End, Expr *Cond,
2372                                     Expr *Inc, Stmt *LoopVar,
2373                                     SourceLocation RParenLoc) {
2374     // If we've just learned that the range is actually an Objective-C
2375     // collection, treat this as an Objective-C fast enumeration loop.
2376     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2377       if (RangeStmt->isSingleDecl()) {
2378         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2379           if (RangeVar->isInvalidDecl())
2380             return StmtError();
2381 
2382           Expr *RangeExpr = RangeVar->getInit();
2383           if (!RangeExpr->isTypeDependent() &&
2384               RangeExpr->getType()->isObjCObjectPointerType()) {
2385             // FIXME: Support init-statements in Objective-C++20 ranged for
2386             // statement.
2387             if (Init) {
2388               return SemaRef.Diag(Init->getBeginLoc(),
2389                                   diag::err_objc_for_range_init_stmt)
2390                          << Init->getSourceRange();
2391             }
2392             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2393                                                         RangeExpr, RParenLoc);
2394           }
2395         }
2396       }
2397     }
2398 
2399     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2400                                           Range, Begin, End, Cond, Inc, LoopVar,
2401                                           RParenLoc, Sema::BFRK_Rebuild);
2402   }
2403 
2404   /// Build a new C++0x range-based for statement.
2405   ///
2406   /// By default, performs semantic analysis to build the new statement.
2407   /// Subclasses may override this routine to provide different behavior.
2408   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2409                                           bool IsIfExists,
2410                                           NestedNameSpecifierLoc QualifierLoc,
2411                                           DeclarationNameInfo NameInfo,
2412                                           Stmt *Nested) {
2413     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2414                                                 QualifierLoc, NameInfo, Nested);
2415   }
2416 
2417   /// Attach body to a C++0x range-based for statement.
2418   ///
2419   /// By default, performs semantic analysis to finish the new statement.
2420   /// Subclasses may override this routine to provide different behavior.
2421   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2422     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2423   }
2424 
2425   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2426                                Stmt *TryBlock, Stmt *Handler) {
2427     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2428   }
2429 
2430   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2431                                   Stmt *Block) {
2432     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2433   }
2434 
2435   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2436     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2437   }
2438 
2439   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2440                                              SourceLocation LParen,
2441                                              SourceLocation RParen,
2442                                              TypeSourceInfo *TSI) {
2443     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2444   }
2445 
2446   /// Build a new predefined expression.
2447   ///
2448   /// By default, performs semantic analysis to build the new expression.
2449   /// Subclasses may override this routine to provide different behavior.
2450   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2451                                    PredefinedExpr::IdentKind IK) {
2452     return getSema().BuildPredefinedExpr(Loc, IK);
2453   }
2454 
2455   /// Build a new expression that references a declaration.
2456   ///
2457   /// By default, performs semantic analysis to build the new expression.
2458   /// Subclasses may override this routine to provide different behavior.
2459   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2460                                         LookupResult &R,
2461                                         bool RequiresADL) {
2462     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2463   }
2464 
2465 
2466   /// Build a new expression that references a declaration.
2467   ///
2468   /// By default, performs semantic analysis to build the new expression.
2469   /// Subclasses may override this routine to provide different behavior.
2470   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2471                                 ValueDecl *VD,
2472                                 const DeclarationNameInfo &NameInfo,
2473                                 NamedDecl *Found,
2474                                 TemplateArgumentListInfo *TemplateArgs) {
2475     CXXScopeSpec SS;
2476     SS.Adopt(QualifierLoc);
2477     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2478                                               TemplateArgs);
2479   }
2480 
2481   /// Build a new expression in parentheses.
2482   ///
2483   /// By default, performs semantic analysis to build the new expression.
2484   /// Subclasses may override this routine to provide different behavior.
2485   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2486                                     SourceLocation RParen) {
2487     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2488   }
2489 
2490   /// Build a new pseudo-destructor expression.
2491   ///
2492   /// By default, performs semantic analysis to build the new expression.
2493   /// Subclasses may override this routine to provide different behavior.
2494   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2495                                             SourceLocation OperatorLoc,
2496                                             bool isArrow,
2497                                             CXXScopeSpec &SS,
2498                                             TypeSourceInfo *ScopeType,
2499                                             SourceLocation CCLoc,
2500                                             SourceLocation TildeLoc,
2501                                         PseudoDestructorTypeStorage Destroyed);
2502 
2503   /// Build a new unary operator expression.
2504   ///
2505   /// By default, performs semantic analysis to build the new expression.
2506   /// Subclasses may override this routine to provide different behavior.
2507   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2508                                         UnaryOperatorKind Opc,
2509                                         Expr *SubExpr) {
2510     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2511   }
2512 
2513   /// Build a new builtin offsetof expression.
2514   ///
2515   /// By default, performs semantic analysis to build the new expression.
2516   /// Subclasses may override this routine to provide different behavior.
2517   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2518                                  TypeSourceInfo *Type,
2519                                  ArrayRef<Sema::OffsetOfComponent> Components,
2520                                  SourceLocation RParenLoc) {
2521     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2522                                           RParenLoc);
2523   }
2524 
2525   /// Build a new sizeof, alignof or vec_step expression with a
2526   /// type argument.
2527   ///
2528   /// By default, performs semantic analysis to build the new expression.
2529   /// Subclasses may override this routine to provide different behavior.
2530   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2531                                          SourceLocation OpLoc,
2532                                          UnaryExprOrTypeTrait ExprKind,
2533                                          SourceRange R) {
2534     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2535   }
2536 
2537   /// Build a new sizeof, alignof or vec step expression with an
2538   /// expression argument.
2539   ///
2540   /// By default, performs semantic analysis to build the new expression.
2541   /// Subclasses may override this routine to provide different behavior.
2542   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2543                                          UnaryExprOrTypeTrait ExprKind,
2544                                          SourceRange R) {
2545     ExprResult Result
2546       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2547     if (Result.isInvalid())
2548       return ExprError();
2549 
2550     return Result;
2551   }
2552 
2553   /// Build a new array subscript expression.
2554   ///
2555   /// By default, performs semantic analysis to build the new expression.
2556   /// Subclasses may override this routine to provide different behavior.
2557   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2558                                              SourceLocation LBracketLoc,
2559                                              Expr *RHS,
2560                                              SourceLocation RBracketLoc) {
2561     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2562                                              LBracketLoc, RHS,
2563                                              RBracketLoc);
2564   }
2565 
2566   /// Build a new matrix subscript expression.
2567   ///
2568   /// By default, performs semantic analysis to build the new expression.
2569   /// Subclasses may override this routine to provide different behavior.
2570   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2571                                         Expr *ColumnIdx,
2572                                         SourceLocation RBracketLoc) {
2573     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2574                                                       RBracketLoc);
2575   }
2576 
2577   /// Build a new array section expression.
2578   ///
2579   /// By default, performs semantic analysis to build the new expression.
2580   /// Subclasses may override this routine to provide different behavior.
2581   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2582                                         Expr *LowerBound,
2583                                         SourceLocation ColonLocFirst,
2584                                         SourceLocation ColonLocSecond,
2585                                         Expr *Length, Expr *Stride,
2586                                         SourceLocation RBracketLoc) {
2587     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2588                                               ColonLocFirst, ColonLocSecond,
2589                                               Length, Stride, RBracketLoc);
2590   }
2591 
2592   /// Build a new array shaping 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 RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2597                                         SourceLocation RParenLoc,
2598                                         ArrayRef<Expr *> Dims,
2599                                         ArrayRef<SourceRange> BracketsRanges) {
2600     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2601                                               BracketsRanges);
2602   }
2603 
2604   /// Build a new iterator expression.
2605   ///
2606   /// By default, performs semantic analysis to build the new expression.
2607   /// Subclasses may override this routine to provide different behavior.
2608   ExprResult RebuildOMPIteratorExpr(
2609       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2610       ArrayRef<Sema::OMPIteratorData> Data) {
2611     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2612                                           LLoc, RLoc, Data);
2613   }
2614 
2615   /// Build a new call expression.
2616   ///
2617   /// By default, performs semantic analysis to build the new expression.
2618   /// Subclasses may override this routine to provide different behavior.
2619   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2620                                    MultiExprArg Args,
2621                                    SourceLocation RParenLoc,
2622                                    Expr *ExecConfig = nullptr) {
2623     return getSema().ActOnCallExpr(
2624         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2625   }
2626 
2627   /// Build a new member access expression.
2628   ///
2629   /// By default, performs semantic analysis to build the new expression.
2630   /// Subclasses may override this routine to provide different behavior.
2631   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2632                                bool isArrow,
2633                                NestedNameSpecifierLoc QualifierLoc,
2634                                SourceLocation TemplateKWLoc,
2635                                const DeclarationNameInfo &MemberNameInfo,
2636                                ValueDecl *Member,
2637                                NamedDecl *FoundDecl,
2638                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2639                                NamedDecl *FirstQualifierInScope) {
2640     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2641                                                                       isArrow);
2642     if (!Member->getDeclName()) {
2643       // We have a reference to an unnamed field.  This is always the
2644       // base of an anonymous struct/union member access, i.e. the
2645       // field is always of record type.
2646       assert(Member->getType()->isRecordType() &&
2647              "unnamed member not of record type?");
2648 
2649       BaseResult =
2650         getSema().PerformObjectMemberConversion(BaseResult.get(),
2651                                                 QualifierLoc.getNestedNameSpecifier(),
2652                                                 FoundDecl, Member);
2653       if (BaseResult.isInvalid())
2654         return ExprError();
2655       Base = BaseResult.get();
2656 
2657       CXXScopeSpec EmptySS;
2658       return getSema().BuildFieldReferenceExpr(
2659           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2660           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2661     }
2662 
2663     CXXScopeSpec SS;
2664     SS.Adopt(QualifierLoc);
2665 
2666     Base = BaseResult.get();
2667     QualType BaseType = Base->getType();
2668 
2669     if (isArrow && !BaseType->isPointerType())
2670       return ExprError();
2671 
2672     // FIXME: this involves duplicating earlier analysis in a lot of
2673     // cases; we should avoid this when possible.
2674     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2675     R.addDecl(FoundDecl);
2676     R.resolveKind();
2677 
2678     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2679                                               SS, TemplateKWLoc,
2680                                               FirstQualifierInScope,
2681                                               R, ExplicitTemplateArgs,
2682                                               /*S*/nullptr);
2683   }
2684 
2685   /// Build a new binary operator expression.
2686   ///
2687   /// By default, performs semantic analysis to build the new expression.
2688   /// Subclasses may override this routine to provide different behavior.
2689   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2690                                          BinaryOperatorKind Opc,
2691                                          Expr *LHS, Expr *RHS) {
2692     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2693   }
2694 
2695   /// Build a new rewritten operator expression.
2696   ///
2697   /// By default, performs semantic analysis to build the new expression.
2698   /// Subclasses may override this routine to provide different behavior.
2699   ExprResult RebuildCXXRewrittenBinaryOperator(
2700       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2701       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2702     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2703                                            RHS, /*RequiresADL*/false);
2704   }
2705 
2706   /// Build a new conditional operator expression.
2707   ///
2708   /// By default, performs semantic analysis to build the new expression.
2709   /// Subclasses may override this routine to provide different behavior.
2710   ExprResult RebuildConditionalOperator(Expr *Cond,
2711                                         SourceLocation QuestionLoc,
2712                                         Expr *LHS,
2713                                         SourceLocation ColonLoc,
2714                                         Expr *RHS) {
2715     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2716                                         LHS, RHS);
2717   }
2718 
2719   /// Build a new C-style cast expression.
2720   ///
2721   /// By default, performs semantic analysis to build the new expression.
2722   /// Subclasses may override this routine to provide different behavior.
2723   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2724                                          TypeSourceInfo *TInfo,
2725                                          SourceLocation RParenLoc,
2726                                          Expr *SubExpr) {
2727     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2728                                          SubExpr);
2729   }
2730 
2731   /// Build a new compound literal expression.
2732   ///
2733   /// By default, performs semantic analysis to build the new expression.
2734   /// Subclasses may override this routine to provide different behavior.
2735   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2736                                               TypeSourceInfo *TInfo,
2737                                               SourceLocation RParenLoc,
2738                                               Expr *Init) {
2739     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2740                                               Init);
2741   }
2742 
2743   /// Build a new extended vector element access expression.
2744   ///
2745   /// By default, performs semantic analysis to build the new expression.
2746   /// Subclasses may override this routine to provide different behavior.
2747   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2748                                                SourceLocation OpLoc,
2749                                                SourceLocation AccessorLoc,
2750                                                IdentifierInfo &Accessor) {
2751 
2752     CXXScopeSpec SS;
2753     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2754     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2755                                               OpLoc, /*IsArrow*/ false,
2756                                               SS, SourceLocation(),
2757                                               /*FirstQualifierInScope*/ nullptr,
2758                                               NameInfo,
2759                                               /* TemplateArgs */ nullptr,
2760                                               /*S*/ nullptr);
2761   }
2762 
2763   /// Build a new initializer list expression.
2764   ///
2765   /// By default, performs semantic analysis to build the new expression.
2766   /// Subclasses may override this routine to provide different behavior.
2767   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2768                              MultiExprArg Inits,
2769                              SourceLocation RBraceLoc) {
2770     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2771   }
2772 
2773   /// Build a new designated initializer expression.
2774   ///
2775   /// By default, performs semantic analysis to build the new expression.
2776   /// Subclasses may override this routine to provide different behavior.
2777   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2778                                              MultiExprArg ArrayExprs,
2779                                              SourceLocation EqualOrColonLoc,
2780                                              bool GNUSyntax,
2781                                              Expr *Init) {
2782     ExprResult Result
2783       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2784                                            Init);
2785     if (Result.isInvalid())
2786       return ExprError();
2787 
2788     return Result;
2789   }
2790 
2791   /// Build a new value-initialized expression.
2792   ///
2793   /// By default, builds the implicit value initialization without performing
2794   /// any semantic analysis. Subclasses may override this routine to provide
2795   /// different behavior.
2796   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2797     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2798   }
2799 
2800   /// Build a new \c va_arg expression.
2801   ///
2802   /// By default, performs semantic analysis to build the new expression.
2803   /// Subclasses may override this routine to provide different behavior.
2804   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2805                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2806                                     SourceLocation RParenLoc) {
2807     return getSema().BuildVAArgExpr(BuiltinLoc,
2808                                     SubExpr, TInfo,
2809                                     RParenLoc);
2810   }
2811 
2812   /// Build a new expression list in parentheses.
2813   ///
2814   /// By default, performs semantic analysis to build the new expression.
2815   /// Subclasses may override this routine to provide different behavior.
2816   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2817                                   MultiExprArg SubExprs,
2818                                   SourceLocation RParenLoc) {
2819     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2820   }
2821 
2822   /// Build a new address-of-label expression.
2823   ///
2824   /// By default, performs semantic analysis, using the name of the label
2825   /// rather than attempting to map the label statement itself.
2826   /// Subclasses may override this routine to provide different behavior.
2827   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2828                                   SourceLocation LabelLoc, LabelDecl *Label) {
2829     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2830   }
2831 
2832   /// Build a new GNU statement expression.
2833   ///
2834   /// By default, performs semantic analysis to build the new expression.
2835   /// Subclasses may override this routine to provide different behavior.
2836   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2837                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2838     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2839                                    TemplateDepth);
2840   }
2841 
2842   /// Build a new __builtin_choose_expr expression.
2843   ///
2844   /// By default, performs semantic analysis to build the new expression.
2845   /// Subclasses may override this routine to provide different behavior.
2846   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2847                                      Expr *Cond, Expr *LHS, Expr *RHS,
2848                                      SourceLocation RParenLoc) {
2849     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2850                                    Cond, LHS, RHS,
2851                                    RParenLoc);
2852   }
2853 
2854   /// Build a new generic selection expression.
2855   ///
2856   /// By default, performs semantic analysis to build the new expression.
2857   /// Subclasses may override this routine to provide different behavior.
2858   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2859                                          SourceLocation DefaultLoc,
2860                                          SourceLocation RParenLoc,
2861                                          Expr *ControllingExpr,
2862                                          ArrayRef<TypeSourceInfo *> Types,
2863                                          ArrayRef<Expr *> Exprs) {
2864     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2865                                                 ControllingExpr, Types, Exprs);
2866   }
2867 
2868   /// Build a new overloaded operator call expression.
2869   ///
2870   /// By default, performs semantic analysis to build the new expression.
2871   /// The semantic analysis provides the behavior of template instantiation,
2872   /// copying with transformations that turn what looks like an overloaded
2873   /// operator call into a use of a builtin operator, performing
2874   /// argument-dependent lookup, etc. Subclasses may override this routine to
2875   /// provide different behavior.
2876   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2877                                               SourceLocation OpLoc,
2878                                               Expr *Callee,
2879                                               Expr *First,
2880                                               Expr *Second);
2881 
2882   /// Build a new C++ "named" cast expression, such as static_cast or
2883   /// reinterpret_cast.
2884   ///
2885   /// By default, this routine dispatches to one of the more-specific routines
2886   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2887   /// Subclasses may override this routine to provide different behavior.
2888   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2889                                            Stmt::StmtClass Class,
2890                                            SourceLocation LAngleLoc,
2891                                            TypeSourceInfo *TInfo,
2892                                            SourceLocation RAngleLoc,
2893                                            SourceLocation LParenLoc,
2894                                            Expr *SubExpr,
2895                                            SourceLocation RParenLoc) {
2896     switch (Class) {
2897     case Stmt::CXXStaticCastExprClass:
2898       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2899                                                    RAngleLoc, LParenLoc,
2900                                                    SubExpr, RParenLoc);
2901 
2902     case Stmt::CXXDynamicCastExprClass:
2903       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2904                                                     RAngleLoc, LParenLoc,
2905                                                     SubExpr, RParenLoc);
2906 
2907     case Stmt::CXXReinterpretCastExprClass:
2908       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2909                                                         RAngleLoc, LParenLoc,
2910                                                         SubExpr,
2911                                                         RParenLoc);
2912 
2913     case Stmt::CXXConstCastExprClass:
2914       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2915                                                    RAngleLoc, LParenLoc,
2916                                                    SubExpr, RParenLoc);
2917 
2918     case Stmt::CXXAddrspaceCastExprClass:
2919       return getDerived().RebuildCXXAddrspaceCastExpr(
2920           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2921 
2922     default:
2923       llvm_unreachable("Invalid C++ named cast");
2924     }
2925   }
2926 
2927   /// Build a new C++ static_cast expression.
2928   ///
2929   /// By default, performs semantic analysis to build the new expression.
2930   /// Subclasses may override this routine to provide different behavior.
2931   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2932                                             SourceLocation LAngleLoc,
2933                                             TypeSourceInfo *TInfo,
2934                                             SourceLocation RAngleLoc,
2935                                             SourceLocation LParenLoc,
2936                                             Expr *SubExpr,
2937                                             SourceLocation RParenLoc) {
2938     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2939                                        TInfo, SubExpr,
2940                                        SourceRange(LAngleLoc, RAngleLoc),
2941                                        SourceRange(LParenLoc, RParenLoc));
2942   }
2943 
2944   /// Build a new C++ dynamic_cast expression.
2945   ///
2946   /// By default, performs semantic analysis to build the new expression.
2947   /// Subclasses may override this routine to provide different behavior.
2948   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2949                                              SourceLocation LAngleLoc,
2950                                              TypeSourceInfo *TInfo,
2951                                              SourceLocation RAngleLoc,
2952                                              SourceLocation LParenLoc,
2953                                              Expr *SubExpr,
2954                                              SourceLocation RParenLoc) {
2955     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2956                                        TInfo, SubExpr,
2957                                        SourceRange(LAngleLoc, RAngleLoc),
2958                                        SourceRange(LParenLoc, RParenLoc));
2959   }
2960 
2961   /// Build a new C++ reinterpret_cast expression.
2962   ///
2963   /// By default, performs semantic analysis to build the new expression.
2964   /// Subclasses may override this routine to provide different behavior.
2965   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2966                                                  SourceLocation LAngleLoc,
2967                                                  TypeSourceInfo *TInfo,
2968                                                  SourceLocation RAngleLoc,
2969                                                  SourceLocation LParenLoc,
2970                                                  Expr *SubExpr,
2971                                                  SourceLocation RParenLoc) {
2972     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2973                                        TInfo, SubExpr,
2974                                        SourceRange(LAngleLoc, RAngleLoc),
2975                                        SourceRange(LParenLoc, RParenLoc));
2976   }
2977 
2978   /// Build a new C++ const_cast expression.
2979   ///
2980   /// By default, performs semantic analysis to build the new expression.
2981   /// Subclasses may override this routine to provide different behavior.
2982   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2983                                            SourceLocation LAngleLoc,
2984                                            TypeSourceInfo *TInfo,
2985                                            SourceLocation RAngleLoc,
2986                                            SourceLocation LParenLoc,
2987                                            Expr *SubExpr,
2988                                            SourceLocation RParenLoc) {
2989     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2990                                        TInfo, SubExpr,
2991                                        SourceRange(LAngleLoc, RAngleLoc),
2992                                        SourceRange(LParenLoc, RParenLoc));
2993   }
2994 
2995   ExprResult
2996   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2997                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2998                               SourceLocation LParenLoc, Expr *SubExpr,
2999                               SourceLocation RParenLoc) {
3000     return getSema().BuildCXXNamedCast(
3001         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3002         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3003   }
3004 
3005   /// Build a new C++ functional-style cast expression.
3006   ///
3007   /// By default, performs semantic analysis to build the new expression.
3008   /// Subclasses may override this routine to provide different behavior.
3009   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3010                                           SourceLocation LParenLoc,
3011                                           Expr *Sub,
3012                                           SourceLocation RParenLoc,
3013                                           bool ListInitialization) {
3014     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3015                                                MultiExprArg(&Sub, 1), RParenLoc,
3016                                                ListInitialization);
3017   }
3018 
3019   /// Build a new C++ __builtin_bit_cast expression.
3020   ///
3021   /// By default, performs semantic analysis to build the new expression.
3022   /// Subclasses may override this routine to provide different behavior.
3023   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3024                                        TypeSourceInfo *TSI, Expr *Sub,
3025                                        SourceLocation RParenLoc) {
3026     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3027   }
3028 
3029   /// Build a new C++ typeid(type) expression.
3030   ///
3031   /// By default, performs semantic analysis to build the new expression.
3032   /// Subclasses may override this routine to provide different behavior.
3033   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3034                                         SourceLocation TypeidLoc,
3035                                         TypeSourceInfo *Operand,
3036                                         SourceLocation RParenLoc) {
3037     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3038                                     RParenLoc);
3039   }
3040 
3041 
3042   /// Build a new C++ typeid(expr) expression.
3043   ///
3044   /// By default, performs semantic analysis to build the new expression.
3045   /// Subclasses may override this routine to provide different behavior.
3046   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3047                                         SourceLocation TypeidLoc,
3048                                         Expr *Operand,
3049                                         SourceLocation RParenLoc) {
3050     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3051                                     RParenLoc);
3052   }
3053 
3054   /// Build a new C++ __uuidof(type) expression.
3055   ///
3056   /// By default, performs semantic analysis to build the new expression.
3057   /// Subclasses may override this routine to provide different behavior.
3058   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3059                                   TypeSourceInfo *Operand,
3060                                   SourceLocation RParenLoc) {
3061     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3062   }
3063 
3064   /// Build a new C++ __uuidof(expr) expression.
3065   ///
3066   /// By default, performs semantic analysis to build the new expression.
3067   /// Subclasses may override this routine to provide different behavior.
3068   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3069                                   Expr *Operand, SourceLocation RParenLoc) {
3070     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3071   }
3072 
3073   /// Build a new C++ "this" expression.
3074   ///
3075   /// By default, builds a new "this" expression without performing any
3076   /// semantic analysis. Subclasses may override this routine to provide
3077   /// different behavior.
3078   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3079                                 QualType ThisType,
3080                                 bool isImplicit) {
3081     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3082   }
3083 
3084   /// Build a new C++ throw 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 RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3089                                  bool IsThrownVariableInScope) {
3090     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3091   }
3092 
3093   /// Build a new C++ default-argument expression.
3094   ///
3095   /// By default, builds a new default-argument expression, which does not
3096   /// require any semantic analysis. Subclasses may override this routine to
3097   /// provide different behavior.
3098   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3099     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3100                                      getSema().CurContext);
3101   }
3102 
3103   /// Build a new C++11 default-initialization expression.
3104   ///
3105   /// By default, builds a new default field initialization expression, which
3106   /// does not require any semantic analysis. Subclasses may override this
3107   /// routine to provide different behavior.
3108   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3109                                        FieldDecl *Field) {
3110     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3111                                       getSema().CurContext);
3112   }
3113 
3114   /// Build a new C++ zero-initialization expression.
3115   ///
3116   /// By default, performs semantic analysis to build the new expression.
3117   /// Subclasses may override this routine to provide different behavior.
3118   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3119                                            SourceLocation LParenLoc,
3120                                            SourceLocation RParenLoc) {
3121     return getSema().BuildCXXTypeConstructExpr(
3122         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3123   }
3124 
3125   /// Build a new C++ "new" expression.
3126   ///
3127   /// By default, performs semantic analysis to build the new expression.
3128   /// Subclasses may override this routine to provide different behavior.
3129   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3130                                bool UseGlobal,
3131                                SourceLocation PlacementLParen,
3132                                MultiExprArg PlacementArgs,
3133                                SourceLocation PlacementRParen,
3134                                SourceRange TypeIdParens,
3135                                QualType AllocatedType,
3136                                TypeSourceInfo *AllocatedTypeInfo,
3137                                Optional<Expr *> ArraySize,
3138                                SourceRange DirectInitRange,
3139                                Expr *Initializer) {
3140     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3141                                  PlacementLParen,
3142                                  PlacementArgs,
3143                                  PlacementRParen,
3144                                  TypeIdParens,
3145                                  AllocatedType,
3146                                  AllocatedTypeInfo,
3147                                  ArraySize,
3148                                  DirectInitRange,
3149                                  Initializer);
3150   }
3151 
3152   /// Build a new C++ "delete" expression.
3153   ///
3154   /// By default, performs semantic analysis to build the new expression.
3155   /// Subclasses may override this routine to provide different behavior.
3156   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3157                                         bool IsGlobalDelete,
3158                                         bool IsArrayForm,
3159                                         Expr *Operand) {
3160     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3161                                     Operand);
3162   }
3163 
3164   /// Build a new type trait expression.
3165   ///
3166   /// By default, performs semantic analysis to build the new expression.
3167   /// Subclasses may override this routine to provide different behavior.
3168   ExprResult RebuildTypeTrait(TypeTrait Trait,
3169                               SourceLocation StartLoc,
3170                               ArrayRef<TypeSourceInfo *> Args,
3171                               SourceLocation RParenLoc) {
3172     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3173   }
3174 
3175   /// Build a new array type trait expression.
3176   ///
3177   /// By default, performs semantic analysis to build the new expression.
3178   /// Subclasses may override this routine to provide different behavior.
3179   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3180                                    SourceLocation StartLoc,
3181                                    TypeSourceInfo *TSInfo,
3182                                    Expr *DimExpr,
3183                                    SourceLocation RParenLoc) {
3184     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3185   }
3186 
3187   /// Build a new expression trait expression.
3188   ///
3189   /// By default, performs semantic analysis to build the new expression.
3190   /// Subclasses may override this routine to provide different behavior.
3191   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3192                                    SourceLocation StartLoc,
3193                                    Expr *Queried,
3194                                    SourceLocation RParenLoc) {
3195     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3196   }
3197 
3198   /// Build a new (previously unresolved) declaration reference
3199   /// expression.
3200   ///
3201   /// By default, performs semantic analysis to build the new expression.
3202   /// Subclasses may override this routine to provide different behavior.
3203   ExprResult RebuildDependentScopeDeclRefExpr(
3204                                           NestedNameSpecifierLoc QualifierLoc,
3205                                           SourceLocation TemplateKWLoc,
3206                                        const DeclarationNameInfo &NameInfo,
3207                               const TemplateArgumentListInfo *TemplateArgs,
3208                                           bool IsAddressOfOperand,
3209                                           TypeSourceInfo **RecoveryTSI) {
3210     CXXScopeSpec SS;
3211     SS.Adopt(QualifierLoc);
3212 
3213     if (TemplateArgs || TemplateKWLoc.isValid())
3214       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3215                                                     TemplateArgs);
3216 
3217     return getSema().BuildQualifiedDeclarationNameExpr(
3218         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3219   }
3220 
3221   /// Build a new template-id expression.
3222   ///
3223   /// By default, performs semantic analysis to build the new expression.
3224   /// Subclasses may override this routine to provide different behavior.
3225   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3226                                    SourceLocation TemplateKWLoc,
3227                                    LookupResult &R,
3228                                    bool RequiresADL,
3229                               const TemplateArgumentListInfo *TemplateArgs) {
3230     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3231                                          TemplateArgs);
3232   }
3233 
3234   /// Build a new object-construction expression.
3235   ///
3236   /// By default, performs semantic analysis to build the new expression.
3237   /// Subclasses may override this routine to provide different behavior.
3238   ExprResult RebuildCXXConstructExpr(QualType T,
3239                                      SourceLocation Loc,
3240                                      CXXConstructorDecl *Constructor,
3241                                      bool IsElidable,
3242                                      MultiExprArg Args,
3243                                      bool HadMultipleCandidates,
3244                                      bool ListInitialization,
3245                                      bool StdInitListInitialization,
3246                                      bool RequiresZeroInit,
3247                              CXXConstructExpr::ConstructionKind ConstructKind,
3248                                      SourceRange ParenRange) {
3249     // Reconstruct the constructor we originally found, which might be
3250     // different if this is a call to an inherited constructor.
3251     CXXConstructorDecl *FoundCtor = Constructor;
3252     if (Constructor->isInheritingConstructor())
3253       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3254 
3255     SmallVector<Expr *, 8> ConvertedArgs;
3256     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3257                                           ConvertedArgs))
3258       return ExprError();
3259 
3260     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3261                                            IsElidable,
3262                                            ConvertedArgs,
3263                                            HadMultipleCandidates,
3264                                            ListInitialization,
3265                                            StdInitListInitialization,
3266                                            RequiresZeroInit, ConstructKind,
3267                                            ParenRange);
3268   }
3269 
3270   /// Build a new implicit construction via inherited constructor
3271   /// expression.
3272   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3273                                              CXXConstructorDecl *Constructor,
3274                                              bool ConstructsVBase,
3275                                              bool InheritedFromVBase) {
3276     return new (getSema().Context) CXXInheritedCtorInitExpr(
3277         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3278   }
3279 
3280   /// Build a new object-construction expression.
3281   ///
3282   /// By default, performs semantic analysis to build the new expression.
3283   /// Subclasses may override this routine to provide different behavior.
3284   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3285                                            SourceLocation LParenOrBraceLoc,
3286                                            MultiExprArg Args,
3287                                            SourceLocation RParenOrBraceLoc,
3288                                            bool ListInitialization) {
3289     return getSema().BuildCXXTypeConstructExpr(
3290         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3291   }
3292 
3293   /// Build a new object-construction expression.
3294   ///
3295   /// By default, performs semantic analysis to build the new expression.
3296   /// Subclasses may override this routine to provide different behavior.
3297   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3298                                                SourceLocation LParenLoc,
3299                                                MultiExprArg Args,
3300                                                SourceLocation RParenLoc,
3301                                                bool ListInitialization) {
3302     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3303                                                RParenLoc, ListInitialization);
3304   }
3305 
3306   /// Build a new member reference expression.
3307   ///
3308   /// By default, performs semantic analysis to build the new expression.
3309   /// Subclasses may override this routine to provide different behavior.
3310   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3311                                                 QualType BaseType,
3312                                                 bool IsArrow,
3313                                                 SourceLocation OperatorLoc,
3314                                           NestedNameSpecifierLoc QualifierLoc,
3315                                                 SourceLocation TemplateKWLoc,
3316                                             NamedDecl *FirstQualifierInScope,
3317                                    const DeclarationNameInfo &MemberNameInfo,
3318                               const TemplateArgumentListInfo *TemplateArgs) {
3319     CXXScopeSpec SS;
3320     SS.Adopt(QualifierLoc);
3321 
3322     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3323                                             OperatorLoc, IsArrow,
3324                                             SS, TemplateKWLoc,
3325                                             FirstQualifierInScope,
3326                                             MemberNameInfo,
3327                                             TemplateArgs, /*S*/nullptr);
3328   }
3329 
3330   /// Build a new member reference expression.
3331   ///
3332   /// By default, performs semantic analysis to build the new expression.
3333   /// Subclasses may override this routine to provide different behavior.
3334   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3335                                          SourceLocation OperatorLoc,
3336                                          bool IsArrow,
3337                                          NestedNameSpecifierLoc QualifierLoc,
3338                                          SourceLocation TemplateKWLoc,
3339                                          NamedDecl *FirstQualifierInScope,
3340                                          LookupResult &R,
3341                                 const TemplateArgumentListInfo *TemplateArgs) {
3342     CXXScopeSpec SS;
3343     SS.Adopt(QualifierLoc);
3344 
3345     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3346                                             OperatorLoc, IsArrow,
3347                                             SS, TemplateKWLoc,
3348                                             FirstQualifierInScope,
3349                                             R, TemplateArgs, /*S*/nullptr);
3350   }
3351 
3352   /// Build a new noexcept expression.
3353   ///
3354   /// By default, performs semantic analysis to build the new expression.
3355   /// Subclasses may override this routine to provide different behavior.
3356   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3357     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3358   }
3359 
3360   /// Build a new expression to compute the length of a parameter pack.
3361   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3362                                    NamedDecl *Pack,
3363                                    SourceLocation PackLoc,
3364                                    SourceLocation RParenLoc,
3365                                    Optional<unsigned> Length,
3366                                    ArrayRef<TemplateArgument> PartialArgs) {
3367     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3368                                   RParenLoc, Length, PartialArgs);
3369   }
3370 
3371   /// Build a new expression representing a call to a source location
3372   ///  builtin.
3373   ///
3374   /// By default, performs semantic analysis to build the new expression.
3375   /// Subclasses may override this routine to provide different behavior.
3376   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3377                                   SourceLocation BuiltinLoc,
3378                                   SourceLocation RPLoc,
3379                                   DeclContext *ParentContext) {
3380     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3381   }
3382 
3383   /// Build a new Objective-C boxed expression.
3384   ///
3385   /// By default, performs semantic analysis to build the new expression.
3386   /// Subclasses may override this routine to provide different behavior.
3387   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3388       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3389       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3390       TemplateArgumentListInfo *TALI) {
3391     CXXScopeSpec SS;
3392     SS.Adopt(NNS);
3393     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3394                                                          ConceptNameInfo,
3395                                                          FoundDecl,
3396                                                          NamedConcept, TALI);
3397     if (Result.isInvalid())
3398       return ExprError();
3399     return Result;
3400   }
3401 
3402   /// \brief Build a new requires expression.
3403   ///
3404   /// By default, performs semantic analysis to build the new expression.
3405   /// Subclasses may override this routine to provide different behavior.
3406   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3407                                  RequiresExprBodyDecl *Body,
3408                                  ArrayRef<ParmVarDecl *> LocalParameters,
3409                                  ArrayRef<concepts::Requirement *> Requirements,
3410                                  SourceLocation ClosingBraceLoc) {
3411     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3412                                 LocalParameters, Requirements, ClosingBraceLoc);
3413   }
3414 
3415   concepts::TypeRequirement *
3416   RebuildTypeRequirement(
3417       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3418     return SemaRef.BuildTypeRequirement(SubstDiag);
3419   }
3420 
3421   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3422     return SemaRef.BuildTypeRequirement(T);
3423   }
3424 
3425   concepts::ExprRequirement *
3426   RebuildExprRequirement(
3427       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3428       SourceLocation NoexceptLoc,
3429       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3430     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3431                                         std::move(Ret));
3432   }
3433 
3434   concepts::ExprRequirement *
3435   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3436                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3437     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3438                                         std::move(Ret));
3439   }
3440 
3441   concepts::NestedRequirement *
3442   RebuildNestedRequirement(
3443       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3444     return SemaRef.BuildNestedRequirement(SubstDiag);
3445   }
3446 
3447   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3448     return SemaRef.BuildNestedRequirement(Constraint);
3449   }
3450 
3451   /// \brief Build a new Objective-C boxed expression.
3452   ///
3453   /// By default, performs semantic analysis to build the new expression.
3454   /// Subclasses may override this routine to provide different behavior.
3455   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3456     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3457   }
3458 
3459   /// Build a new Objective-C array literal.
3460   ///
3461   /// By default, performs semantic analysis to build the new expression.
3462   /// Subclasses may override this routine to provide different behavior.
3463   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3464                                      Expr **Elements, unsigned NumElements) {
3465     return getSema().BuildObjCArrayLiteral(Range,
3466                                            MultiExprArg(Elements, NumElements));
3467   }
3468 
3469   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3470                                          Expr *Base, Expr *Key,
3471                                          ObjCMethodDecl *getterMethod,
3472                                          ObjCMethodDecl *setterMethod) {
3473     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3474                                                    getterMethod, setterMethod);
3475   }
3476 
3477   /// Build a new Objective-C dictionary literal.
3478   ///
3479   /// By default, performs semantic analysis to build the new expression.
3480   /// Subclasses may override this routine to provide different behavior.
3481   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3482                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3483     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3484   }
3485 
3486   /// Build a new Objective-C \@encode expression.
3487   ///
3488   /// By default, performs semantic analysis to build the new expression.
3489   /// Subclasses may override this routine to provide different behavior.
3490   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3491                                          TypeSourceInfo *EncodeTypeInfo,
3492                                          SourceLocation RParenLoc) {
3493     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3494   }
3495 
3496   /// Build a new Objective-C class message.
3497   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3498                                           Selector Sel,
3499                                           ArrayRef<SourceLocation> SelectorLocs,
3500                                           ObjCMethodDecl *Method,
3501                                           SourceLocation LBracLoc,
3502                                           MultiExprArg Args,
3503                                           SourceLocation RBracLoc) {
3504     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3505                                      ReceiverTypeInfo->getType(),
3506                                      /*SuperLoc=*/SourceLocation(),
3507                                      Sel, Method, LBracLoc, SelectorLocs,
3508                                      RBracLoc, Args);
3509   }
3510 
3511   /// Build a new Objective-C instance message.
3512   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3513                                           Selector Sel,
3514                                           ArrayRef<SourceLocation> SelectorLocs,
3515                                           ObjCMethodDecl *Method,
3516                                           SourceLocation LBracLoc,
3517                                           MultiExprArg Args,
3518                                           SourceLocation RBracLoc) {
3519     return SemaRef.BuildInstanceMessage(Receiver,
3520                                         Receiver->getType(),
3521                                         /*SuperLoc=*/SourceLocation(),
3522                                         Sel, Method, LBracLoc, SelectorLocs,
3523                                         RBracLoc, Args);
3524   }
3525 
3526   /// Build a new Objective-C instance/class message to 'super'.
3527   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3528                                     Selector Sel,
3529                                     ArrayRef<SourceLocation> SelectorLocs,
3530                                     QualType SuperType,
3531                                     ObjCMethodDecl *Method,
3532                                     SourceLocation LBracLoc,
3533                                     MultiExprArg Args,
3534                                     SourceLocation RBracLoc) {
3535     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3536                                           SuperType,
3537                                           SuperLoc,
3538                                           Sel, Method, LBracLoc, SelectorLocs,
3539                                           RBracLoc, Args)
3540                                       : SemaRef.BuildClassMessage(nullptr,
3541                                           SuperType,
3542                                           SuperLoc,
3543                                           Sel, Method, LBracLoc, SelectorLocs,
3544                                           RBracLoc, Args);
3545 
3546 
3547   }
3548 
3549   /// Build a new Objective-C ivar reference expression.
3550   ///
3551   /// By default, performs semantic analysis to build the new expression.
3552   /// Subclasses may override this routine to provide different behavior.
3553   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3554                                           SourceLocation IvarLoc,
3555                                           bool IsArrow, bool IsFreeIvar) {
3556     CXXScopeSpec SS;
3557     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3558     ExprResult Result = getSema().BuildMemberReferenceExpr(
3559         BaseArg, BaseArg->getType(),
3560         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3561         /*FirstQualifierInScope=*/nullptr, NameInfo,
3562         /*TemplateArgs=*/nullptr,
3563         /*S=*/nullptr);
3564     if (IsFreeIvar && Result.isUsable())
3565       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3566     return Result;
3567   }
3568 
3569   /// Build a new Objective-C property reference expression.
3570   ///
3571   /// By default, performs semantic analysis to build the new expression.
3572   /// Subclasses may override this routine to provide different behavior.
3573   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3574                                         ObjCPropertyDecl *Property,
3575                                         SourceLocation PropertyLoc) {
3576     CXXScopeSpec SS;
3577     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3578     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3579                                               /*FIXME:*/PropertyLoc,
3580                                               /*IsArrow=*/false,
3581                                               SS, SourceLocation(),
3582                                               /*FirstQualifierInScope=*/nullptr,
3583                                               NameInfo,
3584                                               /*TemplateArgs=*/nullptr,
3585                                               /*S=*/nullptr);
3586   }
3587 
3588   /// Build a new Objective-C property reference expression.
3589   ///
3590   /// By default, performs semantic analysis to build the new expression.
3591   /// Subclasses may override this routine to provide different behavior.
3592   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3593                                         ObjCMethodDecl *Getter,
3594                                         ObjCMethodDecl *Setter,
3595                                         SourceLocation PropertyLoc) {
3596     // Since these expressions can only be value-dependent, we do not
3597     // need to perform semantic analysis again.
3598     return Owned(
3599       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3600                                                   VK_LValue, OK_ObjCProperty,
3601                                                   PropertyLoc, Base));
3602   }
3603 
3604   /// Build a new Objective-C "isa" expression.
3605   ///
3606   /// By default, performs semantic analysis to build the new expression.
3607   /// Subclasses may override this routine to provide different behavior.
3608   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3609                                 SourceLocation OpLoc, bool IsArrow) {
3610     CXXScopeSpec SS;
3611     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3612     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3613                                               OpLoc, IsArrow,
3614                                               SS, SourceLocation(),
3615                                               /*FirstQualifierInScope=*/nullptr,
3616                                               NameInfo,
3617                                               /*TemplateArgs=*/nullptr,
3618                                               /*S=*/nullptr);
3619   }
3620 
3621   /// Build a new shuffle vector expression.
3622   ///
3623   /// By default, performs semantic analysis to build the new expression.
3624   /// Subclasses may override this routine to provide different behavior.
3625   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3626                                       MultiExprArg SubExprs,
3627                                       SourceLocation RParenLoc) {
3628     // Find the declaration for __builtin_shufflevector
3629     const IdentifierInfo &Name
3630       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3631     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3632     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3633     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3634 
3635     // Build a reference to the __builtin_shufflevector builtin
3636     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3637     Expr *Callee = new (SemaRef.Context)
3638         DeclRefExpr(SemaRef.Context, Builtin, false,
3639                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3640     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3641     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3642                                        CK_BuiltinFnToFnPtr).get();
3643 
3644     // Build the CallExpr
3645     ExprResult TheCall = CallExpr::Create(
3646         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3647         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3648         FPOptionsOverride());
3649 
3650     // Type-check the __builtin_shufflevector expression.
3651     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3652   }
3653 
3654   /// Build a new convert vector expression.
3655   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3656                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3657                                       SourceLocation RParenLoc) {
3658     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3659                                          BuiltinLoc, RParenLoc);
3660   }
3661 
3662   /// Build a new template argument pack expansion.
3663   ///
3664   /// By default, performs semantic analysis to build a new pack expansion
3665   /// for a template argument. Subclasses may override this routine to provide
3666   /// different behavior.
3667   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3668                                            SourceLocation EllipsisLoc,
3669                                            Optional<unsigned> NumExpansions) {
3670     switch (Pattern.getArgument().getKind()) {
3671     case TemplateArgument::Expression: {
3672       ExprResult Result
3673         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3674                                        EllipsisLoc, NumExpansions);
3675       if (Result.isInvalid())
3676         return TemplateArgumentLoc();
3677 
3678       return TemplateArgumentLoc(Result.get(), Result.get());
3679     }
3680 
3681     case TemplateArgument::Template:
3682       return TemplateArgumentLoc(
3683           SemaRef.Context,
3684           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3685                            NumExpansions),
3686           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3687           EllipsisLoc);
3688 
3689     case TemplateArgument::Null:
3690     case TemplateArgument::Integral:
3691     case TemplateArgument::Declaration:
3692     case TemplateArgument::Pack:
3693     case TemplateArgument::TemplateExpansion:
3694     case TemplateArgument::NullPtr:
3695       llvm_unreachable("Pack expansion pattern has no parameter packs");
3696 
3697     case TemplateArgument::Type:
3698       if (TypeSourceInfo *Expansion
3699             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3700                                            EllipsisLoc,
3701                                            NumExpansions))
3702         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3703                                    Expansion);
3704       break;
3705     }
3706 
3707     return TemplateArgumentLoc();
3708   }
3709 
3710   /// Build a new expression pack expansion.
3711   ///
3712   /// By default, performs semantic analysis to build a new pack expansion
3713   /// for an expression. Subclasses may override this routine to provide
3714   /// different behavior.
3715   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3716                                   Optional<unsigned> NumExpansions) {
3717     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3718   }
3719 
3720   /// Build a new C++1z fold-expression.
3721   ///
3722   /// By default, performs semantic analysis in order to build a new fold
3723   /// expression.
3724   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3725                                 SourceLocation LParenLoc, Expr *LHS,
3726                                 BinaryOperatorKind Operator,
3727                                 SourceLocation EllipsisLoc, Expr *RHS,
3728                                 SourceLocation RParenLoc,
3729                                 Optional<unsigned> NumExpansions) {
3730     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3731                                       EllipsisLoc, RHS, RParenLoc,
3732                                       NumExpansions);
3733   }
3734 
3735   /// Build an empty C++1z fold-expression with the given operator.
3736   ///
3737   /// By default, produces the fallback value for the fold-expression, or
3738   /// produce an error if there is no fallback value.
3739   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3740                                      BinaryOperatorKind Operator) {
3741     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3742   }
3743 
3744   /// Build a new atomic operation expression.
3745   ///
3746   /// By default, performs semantic analysis to build the new expression.
3747   /// Subclasses may override this routine to provide different behavior.
3748   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3749                                AtomicExpr::AtomicOp Op,
3750                                SourceLocation RParenLoc) {
3751     // Use this for all of the locations, since we don't know the difference
3752     // between the call and the expr at this point.
3753     SourceRange Range{BuiltinLoc, RParenLoc};
3754     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3755                                      Sema::AtomicArgumentOrder::AST);
3756   }
3757 
3758   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3759                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3760     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3761   }
3762 
3763 private:
3764   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3765                                      QualType ObjectType,
3766                                      NamedDecl *FirstQualifierInScope,
3767                                      CXXScopeSpec &SS);
3768 
3769   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3770                                              QualType ObjectType,
3771                                              NamedDecl *FirstQualifierInScope,
3772                                              CXXScopeSpec &SS);
3773 
3774   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3775                                             NamedDecl *FirstQualifierInScope,
3776                                             CXXScopeSpec &SS);
3777 
3778   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3779                                       DependentNameTypeLoc TL,
3780                                       bool DeducibleTSTContext);
3781 };
3782 
3783 template <typename Derived>
3784 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3785   if (!S)
3786     return S;
3787 
3788   switch (S->getStmtClass()) {
3789   case Stmt::NoStmtClass: break;
3790 
3791   // Transform individual statement nodes
3792   // Pass SDK into statements that can produce a value
3793 #define STMT(Node, Parent)                                              \
3794   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3795 #define VALUESTMT(Node, Parent)                                         \
3796   case Stmt::Node##Class:                                               \
3797     return getDerived().Transform##Node(cast<Node>(S), SDK);
3798 #define ABSTRACT_STMT(Node)
3799 #define EXPR(Node, Parent)
3800 #include "clang/AST/StmtNodes.inc"
3801 
3802   // Transform expressions by calling TransformExpr.
3803 #define STMT(Node, Parent)
3804 #define ABSTRACT_STMT(Stmt)
3805 #define EXPR(Node, Parent) case Stmt::Node##Class:
3806 #include "clang/AST/StmtNodes.inc"
3807     {
3808       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3809 
3810       if (SDK == SDK_StmtExprResult)
3811         E = getSema().ActOnStmtExprResult(E);
3812       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3813     }
3814   }
3815 
3816   return S;
3817 }
3818 
3819 template<typename Derived>
3820 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3821   if (!S)
3822     return S;
3823 
3824   switch (S->getClauseKind()) {
3825   default: break;
3826   // Transform individual clause nodes
3827 #define GEN_CLANG_CLAUSE_CLASS
3828 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3829   case Enum:                                                                   \
3830     return getDerived().Transform##Class(cast<Class>(S));
3831 #include "llvm/Frontend/OpenMP/OMP.inc"
3832   }
3833 
3834   return S;
3835 }
3836 
3837 
3838 template<typename Derived>
3839 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3840   if (!E)
3841     return E;
3842 
3843   switch (E->getStmtClass()) {
3844     case Stmt::NoStmtClass: break;
3845 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3846 #define ABSTRACT_STMT(Stmt)
3847 #define EXPR(Node, Parent)                                              \
3848     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3849 #include "clang/AST/StmtNodes.inc"
3850   }
3851 
3852   return E;
3853 }
3854 
3855 template<typename Derived>
3856 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3857                                                         bool NotCopyInit) {
3858   // Initializers are instantiated like expressions, except that various outer
3859   // layers are stripped.
3860   if (!Init)
3861     return Init;
3862 
3863   if (auto *FE = dyn_cast<FullExpr>(Init))
3864     Init = FE->getSubExpr();
3865 
3866   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
3867     OpaqueValueExpr *OVE = AIL->getCommonExpr();
3868     Init = OVE->getSourceExpr();
3869   }
3870 
3871   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3872     Init = MTE->getSubExpr();
3873 
3874   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3875     Init = Binder->getSubExpr();
3876 
3877   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3878     Init = ICE->getSubExprAsWritten();
3879 
3880   if (CXXStdInitializerListExpr *ILE =
3881           dyn_cast<CXXStdInitializerListExpr>(Init))
3882     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3883 
3884   // If this is copy-initialization, we only need to reconstruct
3885   // InitListExprs. Other forms of copy-initialization will be a no-op if
3886   // the initializer is already the right type.
3887   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3888   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3889     return getDerived().TransformExpr(Init);
3890 
3891   // Revert value-initialization back to empty parens.
3892   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3893     SourceRange Parens = VIE->getSourceRange();
3894     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3895                                              Parens.getEnd());
3896   }
3897 
3898   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3899   if (isa<ImplicitValueInitExpr>(Init))
3900     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3901                                              SourceLocation());
3902 
3903   // Revert initialization by constructor back to a parenthesized or braced list
3904   // of expressions. Any other form of initializer can just be reused directly.
3905   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3906     return getDerived().TransformExpr(Init);
3907 
3908   // If the initialization implicitly converted an initializer list to a
3909   // std::initializer_list object, unwrap the std::initializer_list too.
3910   if (Construct && Construct->isStdInitListInitialization())
3911     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3912 
3913   // Enter a list-init context if this was list initialization.
3914   EnterExpressionEvaluationContext Context(
3915       getSema(), EnterExpressionEvaluationContext::InitList,
3916       Construct->isListInitialization());
3917 
3918   SmallVector<Expr*, 8> NewArgs;
3919   bool ArgChanged = false;
3920   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3921                                   /*IsCall*/true, NewArgs, &ArgChanged))
3922     return ExprError();
3923 
3924   // If this was list initialization, revert to syntactic list form.
3925   if (Construct->isListInitialization())
3926     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3927                                         Construct->getEndLoc());
3928 
3929   // Build a ParenListExpr to represent anything else.
3930   SourceRange Parens = Construct->getParenOrBraceRange();
3931   if (Parens.isInvalid()) {
3932     // This was a variable declaration's initialization for which no initializer
3933     // was specified.
3934     assert(NewArgs.empty() &&
3935            "no parens or braces but have direct init with arguments?");
3936     return ExprEmpty();
3937   }
3938   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3939                                            Parens.getEnd());
3940 }
3941 
3942 template<typename Derived>
3943 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3944                                             unsigned NumInputs,
3945                                             bool IsCall,
3946                                       SmallVectorImpl<Expr *> &Outputs,
3947                                             bool *ArgChanged) {
3948   for (unsigned I = 0; I != NumInputs; ++I) {
3949     // If requested, drop call arguments that need to be dropped.
3950     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3951       if (ArgChanged)
3952         *ArgChanged = true;
3953 
3954       break;
3955     }
3956 
3957     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3958       Expr *Pattern = Expansion->getPattern();
3959 
3960       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3961       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3962       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3963 
3964       // Determine whether the set of unexpanded parameter packs can and should
3965       // be expanded.
3966       bool Expand = true;
3967       bool RetainExpansion = false;
3968       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3969       Optional<unsigned> NumExpansions = OrigNumExpansions;
3970       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3971                                                Pattern->getSourceRange(),
3972                                                Unexpanded,
3973                                                Expand, RetainExpansion,
3974                                                NumExpansions))
3975         return true;
3976 
3977       if (!Expand) {
3978         // The transform has determined that we should perform a simple
3979         // transformation on the pack expansion, producing another pack
3980         // expansion.
3981         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3982         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3983         if (OutPattern.isInvalid())
3984           return true;
3985 
3986         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3987                                                 Expansion->getEllipsisLoc(),
3988                                                            NumExpansions);
3989         if (Out.isInvalid())
3990           return true;
3991 
3992         if (ArgChanged)
3993           *ArgChanged = true;
3994         Outputs.push_back(Out.get());
3995         continue;
3996       }
3997 
3998       // Record right away that the argument was changed.  This needs
3999       // to happen even if the array expands to nothing.
4000       if (ArgChanged) *ArgChanged = true;
4001 
4002       // The transform has determined that we should perform an elementwise
4003       // expansion of the pattern. Do so.
4004       for (unsigned I = 0; I != *NumExpansions; ++I) {
4005         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4006         ExprResult Out = getDerived().TransformExpr(Pattern);
4007         if (Out.isInvalid())
4008           return true;
4009 
4010         if (Out.get()->containsUnexpandedParameterPack()) {
4011           Out = getDerived().RebuildPackExpansion(
4012               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4013           if (Out.isInvalid())
4014             return true;
4015         }
4016 
4017         Outputs.push_back(Out.get());
4018       }
4019 
4020       // If we're supposed to retain a pack expansion, do so by temporarily
4021       // forgetting the partially-substituted parameter pack.
4022       if (RetainExpansion) {
4023         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4024 
4025         ExprResult Out = getDerived().TransformExpr(Pattern);
4026         if (Out.isInvalid())
4027           return true;
4028 
4029         Out = getDerived().RebuildPackExpansion(
4030             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4031         if (Out.isInvalid())
4032           return true;
4033 
4034         Outputs.push_back(Out.get());
4035       }
4036 
4037       continue;
4038     }
4039 
4040     ExprResult Result =
4041       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4042              : getDerived().TransformExpr(Inputs[I]);
4043     if (Result.isInvalid())
4044       return true;
4045 
4046     if (Result.get() != Inputs[I] && ArgChanged)
4047       *ArgChanged = true;
4048 
4049     Outputs.push_back(Result.get());
4050   }
4051 
4052   return false;
4053 }
4054 
4055 template <typename Derived>
4056 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4057     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4058   if (Var) {
4059     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4060         getDerived().TransformDefinition(Var->getLocation(), Var));
4061 
4062     if (!ConditionVar)
4063       return Sema::ConditionError();
4064 
4065     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4066   }
4067 
4068   if (Expr) {
4069     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4070 
4071     if (CondExpr.isInvalid())
4072       return Sema::ConditionError();
4073 
4074     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4075   }
4076 
4077   return Sema::ConditionResult();
4078 }
4079 
4080 template <typename Derived>
4081 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4082     NestedNameSpecifierLoc NNS, QualType ObjectType,
4083     NamedDecl *FirstQualifierInScope) {
4084   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4085   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4086        Qualifier = Qualifier.getPrefix())
4087     Qualifiers.push_back(Qualifier);
4088 
4089   CXXScopeSpec SS;
4090   while (!Qualifiers.empty()) {
4091     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4092     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4093 
4094     switch (QNNS->getKind()) {
4095     case NestedNameSpecifier::Identifier: {
4096       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4097                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4098                                       ObjectType);
4099       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4100                                               SS, FirstQualifierInScope, false))
4101         return NestedNameSpecifierLoc();
4102       break;
4103     }
4104 
4105     case NestedNameSpecifier::Namespace: {
4106       NamespaceDecl *NS =
4107           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4108               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4109       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4110       break;
4111     }
4112 
4113     case NestedNameSpecifier::NamespaceAlias: {
4114       NamespaceAliasDecl *Alias =
4115           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4116               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4117       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4118                 Q.getLocalEndLoc());
4119       break;
4120     }
4121 
4122     case NestedNameSpecifier::Global:
4123       // There is no meaningful transformation that one could perform on the
4124       // global scope.
4125       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4126       break;
4127 
4128     case NestedNameSpecifier::Super: {
4129       CXXRecordDecl *RD =
4130           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4131               SourceLocation(), QNNS->getAsRecordDecl()));
4132       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4133       break;
4134     }
4135 
4136     case NestedNameSpecifier::TypeSpecWithTemplate:
4137     case NestedNameSpecifier::TypeSpec: {
4138       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4139                                               FirstQualifierInScope, SS);
4140 
4141       if (!TL)
4142         return NestedNameSpecifierLoc();
4143 
4144       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4145           (SemaRef.getLangOpts().CPlusPlus11 &&
4146            TL.getType()->isEnumeralType())) {
4147         assert(!TL.getType().hasLocalQualifiers() &&
4148                "Can't get cv-qualifiers here");
4149         if (TL.getType()->isEnumeralType())
4150           SemaRef.Diag(TL.getBeginLoc(),
4151                        diag::warn_cxx98_compat_enum_nested_name_spec);
4152         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4153                   Q.getLocalEndLoc());
4154         break;
4155       }
4156       // If the nested-name-specifier is an invalid type def, don't emit an
4157       // error because a previous error should have already been emitted.
4158       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4159       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4160         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4161             << TL.getType() << SS.getRange();
4162       }
4163       return NestedNameSpecifierLoc();
4164     }
4165     }
4166 
4167     // The qualifier-in-scope and object type only apply to the leftmost entity.
4168     FirstQualifierInScope = nullptr;
4169     ObjectType = QualType();
4170   }
4171 
4172   // Don't rebuild the nested-name-specifier if we don't have to.
4173   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4174       !getDerived().AlwaysRebuild())
4175     return NNS;
4176 
4177   // If we can re-use the source-location data from the original
4178   // nested-name-specifier, do so.
4179   if (SS.location_size() == NNS.getDataLength() &&
4180       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4181     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4182 
4183   // Allocate new nested-name-specifier location information.
4184   return SS.getWithLocInContext(SemaRef.Context);
4185 }
4186 
4187 template<typename Derived>
4188 DeclarationNameInfo
4189 TreeTransform<Derived>
4190 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4191   DeclarationName Name = NameInfo.getName();
4192   if (!Name)
4193     return DeclarationNameInfo();
4194 
4195   switch (Name.getNameKind()) {
4196   case DeclarationName::Identifier:
4197   case DeclarationName::ObjCZeroArgSelector:
4198   case DeclarationName::ObjCOneArgSelector:
4199   case DeclarationName::ObjCMultiArgSelector:
4200   case DeclarationName::CXXOperatorName:
4201   case DeclarationName::CXXLiteralOperatorName:
4202   case DeclarationName::CXXUsingDirective:
4203     return NameInfo;
4204 
4205   case DeclarationName::CXXDeductionGuideName: {
4206     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4207     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4208         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4209     if (!NewTemplate)
4210       return DeclarationNameInfo();
4211 
4212     DeclarationNameInfo NewNameInfo(NameInfo);
4213     NewNameInfo.setName(
4214         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4215     return NewNameInfo;
4216   }
4217 
4218   case DeclarationName::CXXConstructorName:
4219   case DeclarationName::CXXDestructorName:
4220   case DeclarationName::CXXConversionFunctionName: {
4221     TypeSourceInfo *NewTInfo;
4222     CanQualType NewCanTy;
4223     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4224       NewTInfo = getDerived().TransformType(OldTInfo);
4225       if (!NewTInfo)
4226         return DeclarationNameInfo();
4227       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4228     }
4229     else {
4230       NewTInfo = nullptr;
4231       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4232       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4233       if (NewT.isNull())
4234         return DeclarationNameInfo();
4235       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4236     }
4237 
4238     DeclarationName NewName
4239       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4240                                                            NewCanTy);
4241     DeclarationNameInfo NewNameInfo(NameInfo);
4242     NewNameInfo.setName(NewName);
4243     NewNameInfo.setNamedTypeInfo(NewTInfo);
4244     return NewNameInfo;
4245   }
4246   }
4247 
4248   llvm_unreachable("Unknown name kind.");
4249 }
4250 
4251 template<typename Derived>
4252 TemplateName
4253 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4254                                               TemplateName Name,
4255                                               SourceLocation NameLoc,
4256                                               QualType ObjectType,
4257                                               NamedDecl *FirstQualifierInScope,
4258                                               bool AllowInjectedClassName) {
4259   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4260     TemplateDecl *Template = QTN->getTemplateDecl();
4261     assert(Template && "qualified template name must refer to a template");
4262 
4263     TemplateDecl *TransTemplate
4264       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4265                                                               Template));
4266     if (!TransTemplate)
4267       return TemplateName();
4268 
4269     if (!getDerived().AlwaysRebuild() &&
4270         SS.getScopeRep() == QTN->getQualifier() &&
4271         TransTemplate == Template)
4272       return Name;
4273 
4274     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4275                                             TransTemplate);
4276   }
4277 
4278   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4279     if (SS.getScopeRep()) {
4280       // These apply to the scope specifier, not the template.
4281       ObjectType = QualType();
4282       FirstQualifierInScope = nullptr;
4283     }
4284 
4285     if (!getDerived().AlwaysRebuild() &&
4286         SS.getScopeRep() == DTN->getQualifier() &&
4287         ObjectType.isNull())
4288       return Name;
4289 
4290     // FIXME: Preserve the location of the "template" keyword.
4291     SourceLocation TemplateKWLoc = NameLoc;
4292 
4293     if (DTN->isIdentifier()) {
4294       return getDerived().RebuildTemplateName(SS,
4295                                               TemplateKWLoc,
4296                                               *DTN->getIdentifier(),
4297                                               NameLoc,
4298                                               ObjectType,
4299                                               FirstQualifierInScope,
4300                                               AllowInjectedClassName);
4301     }
4302 
4303     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4304                                             DTN->getOperator(), NameLoc,
4305                                             ObjectType, AllowInjectedClassName);
4306   }
4307 
4308   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4309     TemplateDecl *TransTemplate
4310       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4311                                                               Template));
4312     if (!TransTemplate)
4313       return TemplateName();
4314 
4315     if (!getDerived().AlwaysRebuild() &&
4316         TransTemplate == Template)
4317       return Name;
4318 
4319     return TemplateName(TransTemplate);
4320   }
4321 
4322   if (SubstTemplateTemplateParmPackStorage *SubstPack
4323       = Name.getAsSubstTemplateTemplateParmPack()) {
4324     TemplateTemplateParmDecl *TransParam
4325     = cast_or_null<TemplateTemplateParmDecl>(
4326             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4327     if (!TransParam)
4328       return TemplateName();
4329 
4330     if (!getDerived().AlwaysRebuild() &&
4331         TransParam == SubstPack->getParameterPack())
4332       return Name;
4333 
4334     return getDerived().RebuildTemplateName(TransParam,
4335                                             SubstPack->getArgumentPack());
4336   }
4337 
4338   // These should be getting filtered out before they reach the AST.
4339   llvm_unreachable("overloaded function decl survived to here");
4340 }
4341 
4342 template<typename Derived>
4343 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4344                                          const TemplateArgument &Arg,
4345                                          TemplateArgumentLoc &Output) {
4346   Output = getSema().getTrivialTemplateArgumentLoc(
4347       Arg, QualType(), getDerived().getBaseLocation());
4348 }
4349 
4350 template <typename Derived>
4351 bool TreeTransform<Derived>::TransformTemplateArgument(
4352     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4353     bool Uneval) {
4354   const TemplateArgument &Arg = Input.getArgument();
4355   switch (Arg.getKind()) {
4356   case TemplateArgument::Null:
4357   case TemplateArgument::Pack:
4358     llvm_unreachable("Unexpected TemplateArgument");
4359 
4360   case TemplateArgument::Integral:
4361   case TemplateArgument::NullPtr:
4362   case TemplateArgument::Declaration: {
4363     // Transform a resolved template argument straight to a resolved template
4364     // argument. We get here when substituting into an already-substituted
4365     // template type argument during concept satisfaction checking.
4366     QualType T = Arg.getNonTypeTemplateArgumentType();
4367     QualType NewT = getDerived().TransformType(T);
4368     if (NewT.isNull())
4369       return true;
4370 
4371     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4372                        ? Arg.getAsDecl()
4373                        : nullptr;
4374     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4375                               getDerived().getBaseLocation(), D))
4376                         : nullptr;
4377     if (D && !NewD)
4378       return true;
4379 
4380     if (NewT == T && D == NewD)
4381       Output = Input;
4382     else if (Arg.getKind() == TemplateArgument::Integral)
4383       Output = TemplateArgumentLoc(
4384           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4385           TemplateArgumentLocInfo());
4386     else if (Arg.getKind() == TemplateArgument::NullPtr)
4387       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4388                                    TemplateArgumentLocInfo());
4389     else
4390       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4391                                    TemplateArgumentLocInfo());
4392 
4393     return false;
4394   }
4395 
4396   case TemplateArgument::Type: {
4397     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4398     if (!DI)
4399       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4400 
4401     DI = getDerived().TransformType(DI);
4402     if (!DI)
4403       return true;
4404 
4405     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4406     return false;
4407   }
4408 
4409   case TemplateArgument::Template: {
4410     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4411     if (QualifierLoc) {
4412       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4413       if (!QualifierLoc)
4414         return true;
4415     }
4416 
4417     CXXScopeSpec SS;
4418     SS.Adopt(QualifierLoc);
4419     TemplateName Template = getDerived().TransformTemplateName(
4420         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4421     if (Template.isNull())
4422       return true;
4423 
4424     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4425                                  QualifierLoc, Input.getTemplateNameLoc());
4426     return false;
4427   }
4428 
4429   case TemplateArgument::TemplateExpansion:
4430     llvm_unreachable("Caller should expand pack expansions");
4431 
4432   case TemplateArgument::Expression: {
4433     // Template argument expressions are constant expressions.
4434     EnterExpressionEvaluationContext Unevaluated(
4435         getSema(),
4436         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4437                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4438         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4439         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4440 
4441     Expr *InputExpr = Input.getSourceExpression();
4442     if (!InputExpr)
4443       InputExpr = Input.getArgument().getAsExpr();
4444 
4445     ExprResult E = getDerived().TransformExpr(InputExpr);
4446     E = SemaRef.ActOnConstantExpression(E);
4447     if (E.isInvalid())
4448       return true;
4449     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4450     return false;
4451   }
4452   }
4453 
4454   // Work around bogus GCC warning
4455   return true;
4456 }
4457 
4458 /// Iterator adaptor that invents template argument location information
4459 /// for each of the template arguments in its underlying iterator.
4460 template<typename Derived, typename InputIterator>
4461 class TemplateArgumentLocInventIterator {
4462   TreeTransform<Derived> &Self;
4463   InputIterator Iter;
4464 
4465 public:
4466   typedef TemplateArgumentLoc value_type;
4467   typedef TemplateArgumentLoc reference;
4468   typedef typename std::iterator_traits<InputIterator>::difference_type
4469     difference_type;
4470   typedef std::input_iterator_tag iterator_category;
4471 
4472   class pointer {
4473     TemplateArgumentLoc Arg;
4474 
4475   public:
4476     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4477 
4478     const TemplateArgumentLoc *operator->() const { return &Arg; }
4479   };
4480 
4481   TemplateArgumentLocInventIterator() { }
4482 
4483   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4484                                              InputIterator Iter)
4485     : Self(Self), Iter(Iter) { }
4486 
4487   TemplateArgumentLocInventIterator &operator++() {
4488     ++Iter;
4489     return *this;
4490   }
4491 
4492   TemplateArgumentLocInventIterator operator++(int) {
4493     TemplateArgumentLocInventIterator Old(*this);
4494     ++(*this);
4495     return Old;
4496   }
4497 
4498   reference operator*() const {
4499     TemplateArgumentLoc Result;
4500     Self.InventTemplateArgumentLoc(*Iter, Result);
4501     return Result;
4502   }
4503 
4504   pointer operator->() const { return pointer(**this); }
4505 
4506   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4507                          const TemplateArgumentLocInventIterator &Y) {
4508     return X.Iter == Y.Iter;
4509   }
4510 
4511   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4512                          const TemplateArgumentLocInventIterator &Y) {
4513     return X.Iter != Y.Iter;
4514   }
4515 };
4516 
4517 template<typename Derived>
4518 template<typename InputIterator>
4519 bool TreeTransform<Derived>::TransformTemplateArguments(
4520     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4521     bool Uneval) {
4522   for (; First != Last; ++First) {
4523     TemplateArgumentLoc Out;
4524     TemplateArgumentLoc In = *First;
4525 
4526     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4527       // Unpack argument packs, which we translate them into separate
4528       // arguments.
4529       // FIXME: We could do much better if we could guarantee that the
4530       // TemplateArgumentLocInfo for the pack expansion would be usable for
4531       // all of the template arguments in the argument pack.
4532       typedef TemplateArgumentLocInventIterator<Derived,
4533                                                 TemplateArgument::pack_iterator>
4534         PackLocIterator;
4535       if (TransformTemplateArguments(PackLocIterator(*this,
4536                                                  In.getArgument().pack_begin()),
4537                                      PackLocIterator(*this,
4538                                                    In.getArgument().pack_end()),
4539                                      Outputs, Uneval))
4540         return true;
4541 
4542       continue;
4543     }
4544 
4545     if (In.getArgument().isPackExpansion()) {
4546       // We have a pack expansion, for which we will be substituting into
4547       // the pattern.
4548       SourceLocation Ellipsis;
4549       Optional<unsigned> OrigNumExpansions;
4550       TemplateArgumentLoc Pattern
4551         = getSema().getTemplateArgumentPackExpansionPattern(
4552               In, Ellipsis, OrigNumExpansions);
4553 
4554       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4555       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4556       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4557 
4558       // Determine whether the set of unexpanded parameter packs can and should
4559       // be expanded.
4560       bool Expand = true;
4561       bool RetainExpansion = false;
4562       Optional<unsigned> NumExpansions = OrigNumExpansions;
4563       if (getDerived().TryExpandParameterPacks(Ellipsis,
4564                                                Pattern.getSourceRange(),
4565                                                Unexpanded,
4566                                                Expand,
4567                                                RetainExpansion,
4568                                                NumExpansions))
4569         return true;
4570 
4571       if (!Expand) {
4572         // The transform has determined that we should perform a simple
4573         // transformation on the pack expansion, producing another pack
4574         // expansion.
4575         TemplateArgumentLoc OutPattern;
4576         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4577         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4578           return true;
4579 
4580         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4581                                                 NumExpansions);
4582         if (Out.getArgument().isNull())
4583           return true;
4584 
4585         Outputs.addArgument(Out);
4586         continue;
4587       }
4588 
4589       // The transform has determined that we should perform an elementwise
4590       // expansion of the pattern. Do so.
4591       for (unsigned I = 0; I != *NumExpansions; ++I) {
4592         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4593 
4594         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4595           return true;
4596 
4597         if (Out.getArgument().containsUnexpandedParameterPack()) {
4598           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4599                                                   OrigNumExpansions);
4600           if (Out.getArgument().isNull())
4601             return true;
4602         }
4603 
4604         Outputs.addArgument(Out);
4605       }
4606 
4607       // If we're supposed to retain a pack expansion, do so by temporarily
4608       // forgetting the partially-substituted parameter pack.
4609       if (RetainExpansion) {
4610         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4611 
4612         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4613           return true;
4614 
4615         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4616                                                 OrigNumExpansions);
4617         if (Out.getArgument().isNull())
4618           return true;
4619 
4620         Outputs.addArgument(Out);
4621       }
4622 
4623       continue;
4624     }
4625 
4626     // The simple case:
4627     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4628       return true;
4629 
4630     Outputs.addArgument(Out);
4631   }
4632 
4633   return false;
4634 
4635 }
4636 
4637 //===----------------------------------------------------------------------===//
4638 // Type transformation
4639 //===----------------------------------------------------------------------===//
4640 
4641 template<typename Derived>
4642 QualType TreeTransform<Derived>::TransformType(QualType T) {
4643   if (getDerived().AlreadyTransformed(T))
4644     return T;
4645 
4646   // Temporary workaround.  All of these transformations should
4647   // eventually turn into transformations on TypeLocs.
4648   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4649                                                 getDerived().getBaseLocation());
4650 
4651   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4652 
4653   if (!NewDI)
4654     return QualType();
4655 
4656   return NewDI->getType();
4657 }
4658 
4659 template<typename Derived>
4660 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4661   // Refine the base location to the type's location.
4662   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4663                        getDerived().getBaseEntity());
4664   if (getDerived().AlreadyTransformed(DI->getType()))
4665     return DI;
4666 
4667   TypeLocBuilder TLB;
4668 
4669   TypeLoc TL = DI->getTypeLoc();
4670   TLB.reserve(TL.getFullDataSize());
4671 
4672   QualType Result = getDerived().TransformType(TLB, TL);
4673   if (Result.isNull())
4674     return nullptr;
4675 
4676   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4677 }
4678 
4679 template<typename Derived>
4680 QualType
4681 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4682   switch (T.getTypeLocClass()) {
4683 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4684 #define TYPELOC(CLASS, PARENT)                                                 \
4685   case TypeLoc::CLASS:                                                         \
4686     return getDerived().Transform##CLASS##Type(TLB,                            \
4687                                                T.castAs<CLASS##TypeLoc>());
4688 #include "clang/AST/TypeLocNodes.def"
4689   }
4690 
4691   llvm_unreachable("unhandled type loc!");
4692 }
4693 
4694 template<typename Derived>
4695 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4696   if (!isa<DependentNameType>(T))
4697     return TransformType(T);
4698 
4699   if (getDerived().AlreadyTransformed(T))
4700     return T;
4701   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4702                                                 getDerived().getBaseLocation());
4703   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4704   return NewDI ? NewDI->getType() : QualType();
4705 }
4706 
4707 template<typename Derived>
4708 TypeSourceInfo *
4709 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4710   if (!isa<DependentNameType>(DI->getType()))
4711     return TransformType(DI);
4712 
4713   // Refine the base location to the type's location.
4714   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4715                        getDerived().getBaseEntity());
4716   if (getDerived().AlreadyTransformed(DI->getType()))
4717     return DI;
4718 
4719   TypeLocBuilder TLB;
4720 
4721   TypeLoc TL = DI->getTypeLoc();
4722   TLB.reserve(TL.getFullDataSize());
4723 
4724   auto QTL = TL.getAs<QualifiedTypeLoc>();
4725   if (QTL)
4726     TL = QTL.getUnqualifiedLoc();
4727 
4728   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4729 
4730   QualType Result = getDerived().TransformDependentNameType(
4731       TLB, DNTL, /*DeducedTSTContext*/true);
4732   if (Result.isNull())
4733     return nullptr;
4734 
4735   if (QTL) {
4736     Result = getDerived().RebuildQualifiedType(Result, QTL);
4737     if (Result.isNull())
4738       return nullptr;
4739     TLB.TypeWasModifiedSafely(Result);
4740   }
4741 
4742   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4743 }
4744 
4745 template<typename Derived>
4746 QualType
4747 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4748                                                QualifiedTypeLoc T) {
4749   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4750   if (Result.isNull())
4751     return QualType();
4752 
4753   Result = getDerived().RebuildQualifiedType(Result, T);
4754 
4755   if (Result.isNull())
4756     return QualType();
4757 
4758   // RebuildQualifiedType might have updated the type, but not in a way
4759   // that invalidates the TypeLoc. (There's no location information for
4760   // qualifiers.)
4761   TLB.TypeWasModifiedSafely(Result);
4762 
4763   return Result;
4764 }
4765 
4766 template <typename Derived>
4767 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4768                                                       QualifiedTypeLoc TL) {
4769 
4770   SourceLocation Loc = TL.getBeginLoc();
4771   Qualifiers Quals = TL.getType().getLocalQualifiers();
4772 
4773   if ((T.getAddressSpace() != LangAS::Default &&
4774        Quals.getAddressSpace() != LangAS::Default) &&
4775       T.getAddressSpace() != Quals.getAddressSpace()) {
4776     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4777         << TL.getType() << T;
4778     return QualType();
4779   }
4780 
4781   // C++ [dcl.fct]p7:
4782   //   [When] adding cv-qualifications on top of the function type [...] the
4783   //   cv-qualifiers are ignored.
4784   if (T->isFunctionType()) {
4785     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4786                                                      Quals.getAddressSpace());
4787     return T;
4788   }
4789 
4790   // C++ [dcl.ref]p1:
4791   //   when the cv-qualifiers are introduced through the use of a typedef-name
4792   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4793   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4794   // applied to a reference type.
4795   if (T->isReferenceType()) {
4796     // The only qualifier that applies to a reference type is restrict.
4797     if (!Quals.hasRestrict())
4798       return T;
4799     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4800   }
4801 
4802   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4803   // resulting type.
4804   if (Quals.hasObjCLifetime()) {
4805     if (!T->isObjCLifetimeType() && !T->isDependentType())
4806       Quals.removeObjCLifetime();
4807     else if (T.getObjCLifetime()) {
4808       // Objective-C ARC:
4809       //   A lifetime qualifier applied to a substituted template parameter
4810       //   overrides the lifetime qualifier from the template argument.
4811       const AutoType *AutoTy;
4812       if (const SubstTemplateTypeParmType *SubstTypeParam
4813                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4814         QualType Replacement = SubstTypeParam->getReplacementType();
4815         Qualifiers Qs = Replacement.getQualifiers();
4816         Qs.removeObjCLifetime();
4817         Replacement = SemaRef.Context.getQualifiedType(
4818             Replacement.getUnqualifiedType(), Qs);
4819         T = SemaRef.Context.getSubstTemplateTypeParmType(
4820             SubstTypeParam->getReplacedParameter(), Replacement);
4821       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4822         // 'auto' types behave the same way as template parameters.
4823         QualType Deduced = AutoTy->getDeducedType();
4824         Qualifiers Qs = Deduced.getQualifiers();
4825         Qs.removeObjCLifetime();
4826         Deduced =
4827             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4828         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4829                                         AutoTy->isDependentType(),
4830                                         /*isPack=*/false,
4831                                         AutoTy->getTypeConstraintConcept(),
4832                                         AutoTy->getTypeConstraintArguments());
4833       } else {
4834         // Otherwise, complain about the addition of a qualifier to an
4835         // already-qualified type.
4836         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4837         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4838         Quals.removeObjCLifetime();
4839       }
4840     }
4841   }
4842 
4843   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4844 }
4845 
4846 template<typename Derived>
4847 TypeLoc
4848 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4849                                                    QualType ObjectType,
4850                                                    NamedDecl *UnqualLookup,
4851                                                    CXXScopeSpec &SS) {
4852   if (getDerived().AlreadyTransformed(TL.getType()))
4853     return TL;
4854 
4855   TypeSourceInfo *TSI =
4856       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4857   if (TSI)
4858     return TSI->getTypeLoc();
4859   return TypeLoc();
4860 }
4861 
4862 template<typename Derived>
4863 TypeSourceInfo *
4864 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4865                                                    QualType ObjectType,
4866                                                    NamedDecl *UnqualLookup,
4867                                                    CXXScopeSpec &SS) {
4868   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4869     return TSInfo;
4870 
4871   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4872                                    UnqualLookup, SS);
4873 }
4874 
4875 template <typename Derived>
4876 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4877     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4878     CXXScopeSpec &SS) {
4879   QualType T = TL.getType();
4880   assert(!getDerived().AlreadyTransformed(T));
4881 
4882   TypeLocBuilder TLB;
4883   QualType Result;
4884 
4885   if (isa<TemplateSpecializationType>(T)) {
4886     TemplateSpecializationTypeLoc SpecTL =
4887         TL.castAs<TemplateSpecializationTypeLoc>();
4888 
4889     TemplateName Template = getDerived().TransformTemplateName(
4890         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4891         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4892     if (Template.isNull())
4893       return nullptr;
4894 
4895     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4896                                                               Template);
4897   } else if (isa<DependentTemplateSpecializationType>(T)) {
4898     DependentTemplateSpecializationTypeLoc SpecTL =
4899         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4900 
4901     TemplateName Template
4902       = getDerived().RebuildTemplateName(SS,
4903                                          SpecTL.getTemplateKeywordLoc(),
4904                                          *SpecTL.getTypePtr()->getIdentifier(),
4905                                          SpecTL.getTemplateNameLoc(),
4906                                          ObjectType, UnqualLookup,
4907                                          /*AllowInjectedClassName*/true);
4908     if (Template.isNull())
4909       return nullptr;
4910 
4911     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4912                                                                        SpecTL,
4913                                                                        Template,
4914                                                                        SS);
4915   } else {
4916     // Nothing special needs to be done for these.
4917     Result = getDerived().TransformType(TLB, TL);
4918   }
4919 
4920   if (Result.isNull())
4921     return nullptr;
4922 
4923   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4924 }
4925 
4926 template <class TyLoc> static inline
4927 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4928   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4929   NewT.setNameLoc(T.getNameLoc());
4930   return T.getType();
4931 }
4932 
4933 template<typename Derived>
4934 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4935                                                       BuiltinTypeLoc T) {
4936   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4937   NewT.setBuiltinLoc(T.getBuiltinLoc());
4938   if (T.needsExtraLocalData())
4939     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4940   return T.getType();
4941 }
4942 
4943 template<typename Derived>
4944 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4945                                                       ComplexTypeLoc T) {
4946   // FIXME: recurse?
4947   return TransformTypeSpecType(TLB, T);
4948 }
4949 
4950 template <typename Derived>
4951 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4952                                                        AdjustedTypeLoc TL) {
4953   // Adjustments applied during transformation are handled elsewhere.
4954   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4955 }
4956 
4957 template<typename Derived>
4958 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4959                                                       DecayedTypeLoc TL) {
4960   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4961   if (OriginalType.isNull())
4962     return QualType();
4963 
4964   QualType Result = TL.getType();
4965   if (getDerived().AlwaysRebuild() ||
4966       OriginalType != TL.getOriginalLoc().getType())
4967     Result = SemaRef.Context.getDecayedType(OriginalType);
4968   TLB.push<DecayedTypeLoc>(Result);
4969   // Nothing to set for DecayedTypeLoc.
4970   return Result;
4971 }
4972 
4973 template<typename Derived>
4974 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4975                                                       PointerTypeLoc TL) {
4976   QualType PointeeType
4977     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4978   if (PointeeType.isNull())
4979     return QualType();
4980 
4981   QualType Result = TL.getType();
4982   if (PointeeType->getAs<ObjCObjectType>()) {
4983     // A dependent pointer type 'T *' has is being transformed such
4984     // that an Objective-C class type is being replaced for 'T'. The
4985     // resulting pointer type is an ObjCObjectPointerType, not a
4986     // PointerType.
4987     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4988 
4989     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4990     NewT.setStarLoc(TL.getStarLoc());
4991     return Result;
4992   }
4993 
4994   if (getDerived().AlwaysRebuild() ||
4995       PointeeType != TL.getPointeeLoc().getType()) {
4996     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4997     if (Result.isNull())
4998       return QualType();
4999   }
5000 
5001   // Objective-C ARC can add lifetime qualifiers to the type that we're
5002   // pointing to.
5003   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5004 
5005   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5006   NewT.setSigilLoc(TL.getSigilLoc());
5007   return Result;
5008 }
5009 
5010 template<typename Derived>
5011 QualType
5012 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5013                                                   BlockPointerTypeLoc TL) {
5014   QualType PointeeType
5015     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5016   if (PointeeType.isNull())
5017     return QualType();
5018 
5019   QualType Result = TL.getType();
5020   if (getDerived().AlwaysRebuild() ||
5021       PointeeType != TL.getPointeeLoc().getType()) {
5022     Result = getDerived().RebuildBlockPointerType(PointeeType,
5023                                                   TL.getSigilLoc());
5024     if (Result.isNull())
5025       return QualType();
5026   }
5027 
5028   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5029   NewT.setSigilLoc(TL.getSigilLoc());
5030   return Result;
5031 }
5032 
5033 /// Transforms a reference type.  Note that somewhat paradoxically we
5034 /// don't care whether the type itself is an l-value type or an r-value
5035 /// type;  we only care if the type was *written* as an l-value type
5036 /// or an r-value type.
5037 template<typename Derived>
5038 QualType
5039 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5040                                                ReferenceTypeLoc TL) {
5041   const ReferenceType *T = TL.getTypePtr();
5042 
5043   // Note that this works with the pointee-as-written.
5044   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5045   if (PointeeType.isNull())
5046     return QualType();
5047 
5048   QualType Result = TL.getType();
5049   if (getDerived().AlwaysRebuild() ||
5050       PointeeType != T->getPointeeTypeAsWritten()) {
5051     Result = getDerived().RebuildReferenceType(PointeeType,
5052                                                T->isSpelledAsLValue(),
5053                                                TL.getSigilLoc());
5054     if (Result.isNull())
5055       return QualType();
5056   }
5057 
5058   // Objective-C ARC can add lifetime qualifiers to the type that we're
5059   // referring to.
5060   TLB.TypeWasModifiedSafely(
5061       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5062 
5063   // r-value references can be rebuilt as l-value references.
5064   ReferenceTypeLoc NewTL;
5065   if (isa<LValueReferenceType>(Result))
5066     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5067   else
5068     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5069   NewTL.setSigilLoc(TL.getSigilLoc());
5070 
5071   return Result;
5072 }
5073 
5074 template<typename Derived>
5075 QualType
5076 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5077                                                  LValueReferenceTypeLoc TL) {
5078   return TransformReferenceType(TLB, TL);
5079 }
5080 
5081 template<typename Derived>
5082 QualType
5083 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5084                                                  RValueReferenceTypeLoc TL) {
5085   return TransformReferenceType(TLB, TL);
5086 }
5087 
5088 template<typename Derived>
5089 QualType
5090 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5091                                                    MemberPointerTypeLoc TL) {
5092   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5093   if (PointeeType.isNull())
5094     return QualType();
5095 
5096   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5097   TypeSourceInfo *NewClsTInfo = nullptr;
5098   if (OldClsTInfo) {
5099     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5100     if (!NewClsTInfo)
5101       return QualType();
5102   }
5103 
5104   const MemberPointerType *T = TL.getTypePtr();
5105   QualType OldClsType = QualType(T->getClass(), 0);
5106   QualType NewClsType;
5107   if (NewClsTInfo)
5108     NewClsType = NewClsTInfo->getType();
5109   else {
5110     NewClsType = getDerived().TransformType(OldClsType);
5111     if (NewClsType.isNull())
5112       return QualType();
5113   }
5114 
5115   QualType Result = TL.getType();
5116   if (getDerived().AlwaysRebuild() ||
5117       PointeeType != T->getPointeeType() ||
5118       NewClsType != OldClsType) {
5119     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5120                                                    TL.getStarLoc());
5121     if (Result.isNull())
5122       return QualType();
5123   }
5124 
5125   // If we had to adjust the pointee type when building a member pointer, make
5126   // sure to push TypeLoc info for it.
5127   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5128   if (MPT && PointeeType != MPT->getPointeeType()) {
5129     assert(isa<AdjustedType>(MPT->getPointeeType()));
5130     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5131   }
5132 
5133   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5134   NewTL.setSigilLoc(TL.getSigilLoc());
5135   NewTL.setClassTInfo(NewClsTInfo);
5136 
5137   return Result;
5138 }
5139 
5140 template<typename Derived>
5141 QualType
5142 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5143                                                    ConstantArrayTypeLoc TL) {
5144   const ConstantArrayType *T = TL.getTypePtr();
5145   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5146   if (ElementType.isNull())
5147     return QualType();
5148 
5149   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5150   Expr *OldSize = TL.getSizeExpr();
5151   if (!OldSize)
5152     OldSize = const_cast<Expr*>(T->getSizeExpr());
5153   Expr *NewSize = nullptr;
5154   if (OldSize) {
5155     EnterExpressionEvaluationContext Unevaluated(
5156         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5157     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5158     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5159   }
5160 
5161   QualType Result = TL.getType();
5162   if (getDerived().AlwaysRebuild() ||
5163       ElementType != T->getElementType() ||
5164       (T->getSizeExpr() && NewSize != OldSize)) {
5165     Result = getDerived().RebuildConstantArrayType(ElementType,
5166                                                    T->getSizeModifier(),
5167                                                    T->getSize(), NewSize,
5168                                              T->getIndexTypeCVRQualifiers(),
5169                                                    TL.getBracketsRange());
5170     if (Result.isNull())
5171       return QualType();
5172   }
5173 
5174   // We might have either a ConstantArrayType or a VariableArrayType now:
5175   // a ConstantArrayType is allowed to have an element type which is a
5176   // VariableArrayType if the type is dependent.  Fortunately, all array
5177   // types have the same location layout.
5178   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5179   NewTL.setLBracketLoc(TL.getLBracketLoc());
5180   NewTL.setRBracketLoc(TL.getRBracketLoc());
5181   NewTL.setSizeExpr(NewSize);
5182 
5183   return Result;
5184 }
5185 
5186 template<typename Derived>
5187 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5188                                               TypeLocBuilder &TLB,
5189                                               IncompleteArrayTypeLoc TL) {
5190   const IncompleteArrayType *T = TL.getTypePtr();
5191   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5192   if (ElementType.isNull())
5193     return QualType();
5194 
5195   QualType Result = TL.getType();
5196   if (getDerived().AlwaysRebuild() ||
5197       ElementType != T->getElementType()) {
5198     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5199                                                      T->getSizeModifier(),
5200                                            T->getIndexTypeCVRQualifiers(),
5201                                                      TL.getBracketsRange());
5202     if (Result.isNull())
5203       return QualType();
5204   }
5205 
5206   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5207   NewTL.setLBracketLoc(TL.getLBracketLoc());
5208   NewTL.setRBracketLoc(TL.getRBracketLoc());
5209   NewTL.setSizeExpr(nullptr);
5210 
5211   return Result;
5212 }
5213 
5214 template<typename Derived>
5215 QualType
5216 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5217                                                    VariableArrayTypeLoc TL) {
5218   const VariableArrayType *T = TL.getTypePtr();
5219   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5220   if (ElementType.isNull())
5221     return QualType();
5222 
5223   ExprResult SizeResult;
5224   {
5225     EnterExpressionEvaluationContext Context(
5226         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5227     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5228   }
5229   if (SizeResult.isInvalid())
5230     return QualType();
5231   SizeResult =
5232       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5233   if (SizeResult.isInvalid())
5234     return QualType();
5235 
5236   Expr *Size = SizeResult.get();
5237 
5238   QualType Result = TL.getType();
5239   if (getDerived().AlwaysRebuild() ||
5240       ElementType != T->getElementType() ||
5241       Size != T->getSizeExpr()) {
5242     Result = getDerived().RebuildVariableArrayType(ElementType,
5243                                                    T->getSizeModifier(),
5244                                                    Size,
5245                                              T->getIndexTypeCVRQualifiers(),
5246                                                    TL.getBracketsRange());
5247     if (Result.isNull())
5248       return QualType();
5249   }
5250 
5251   // We might have constant size array now, but fortunately it has the same
5252   // location layout.
5253   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5254   NewTL.setLBracketLoc(TL.getLBracketLoc());
5255   NewTL.setRBracketLoc(TL.getRBracketLoc());
5256   NewTL.setSizeExpr(Size);
5257 
5258   return Result;
5259 }
5260 
5261 template<typename Derived>
5262 QualType
5263 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5264                                              DependentSizedArrayTypeLoc TL) {
5265   const DependentSizedArrayType *T = TL.getTypePtr();
5266   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5267   if (ElementType.isNull())
5268     return QualType();
5269 
5270   // Array bounds are constant expressions.
5271   EnterExpressionEvaluationContext Unevaluated(
5272       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5273 
5274   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5275   Expr *origSize = TL.getSizeExpr();
5276   if (!origSize) origSize = T->getSizeExpr();
5277 
5278   ExprResult sizeResult
5279     = getDerived().TransformExpr(origSize);
5280   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5281   if (sizeResult.isInvalid())
5282     return QualType();
5283 
5284   Expr *size = sizeResult.get();
5285 
5286   QualType Result = TL.getType();
5287   if (getDerived().AlwaysRebuild() ||
5288       ElementType != T->getElementType() ||
5289       size != origSize) {
5290     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5291                                                          T->getSizeModifier(),
5292                                                          size,
5293                                                 T->getIndexTypeCVRQualifiers(),
5294                                                         TL.getBracketsRange());
5295     if (Result.isNull())
5296       return QualType();
5297   }
5298 
5299   // We might have any sort of array type now, but fortunately they
5300   // all have the same location layout.
5301   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5302   NewTL.setLBracketLoc(TL.getLBracketLoc());
5303   NewTL.setRBracketLoc(TL.getRBracketLoc());
5304   NewTL.setSizeExpr(size);
5305 
5306   return Result;
5307 }
5308 
5309 template <typename Derived>
5310 QualType TreeTransform<Derived>::TransformDependentVectorType(
5311     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5312   const DependentVectorType *T = TL.getTypePtr();
5313   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5314   if (ElementType.isNull())
5315     return QualType();
5316 
5317   EnterExpressionEvaluationContext Unevaluated(
5318       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5319 
5320   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5321   Size = SemaRef.ActOnConstantExpression(Size);
5322   if (Size.isInvalid())
5323     return QualType();
5324 
5325   QualType Result = TL.getType();
5326   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5327       Size.get() != T->getSizeExpr()) {
5328     Result = getDerived().RebuildDependentVectorType(
5329         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5330     if (Result.isNull())
5331       return QualType();
5332   }
5333 
5334   // Result might be dependent or not.
5335   if (isa<DependentVectorType>(Result)) {
5336     DependentVectorTypeLoc NewTL =
5337         TLB.push<DependentVectorTypeLoc>(Result);
5338     NewTL.setNameLoc(TL.getNameLoc());
5339   } else {
5340     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5341     NewTL.setNameLoc(TL.getNameLoc());
5342   }
5343 
5344   return Result;
5345 }
5346 
5347 template<typename Derived>
5348 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5349                                       TypeLocBuilder &TLB,
5350                                       DependentSizedExtVectorTypeLoc TL) {
5351   const DependentSizedExtVectorType *T = TL.getTypePtr();
5352 
5353   // FIXME: ext vector locs should be nested
5354   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5355   if (ElementType.isNull())
5356     return QualType();
5357 
5358   // Vector sizes are constant expressions.
5359   EnterExpressionEvaluationContext Unevaluated(
5360       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5361 
5362   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5363   Size = SemaRef.ActOnConstantExpression(Size);
5364   if (Size.isInvalid())
5365     return QualType();
5366 
5367   QualType Result = TL.getType();
5368   if (getDerived().AlwaysRebuild() ||
5369       ElementType != T->getElementType() ||
5370       Size.get() != T->getSizeExpr()) {
5371     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5372                                                              Size.get(),
5373                                                          T->getAttributeLoc());
5374     if (Result.isNull())
5375       return QualType();
5376   }
5377 
5378   // Result might be dependent or not.
5379   if (isa<DependentSizedExtVectorType>(Result)) {
5380     DependentSizedExtVectorTypeLoc NewTL
5381       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5382     NewTL.setNameLoc(TL.getNameLoc());
5383   } else {
5384     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5385     NewTL.setNameLoc(TL.getNameLoc());
5386   }
5387 
5388   return Result;
5389 }
5390 
5391 template <typename Derived>
5392 QualType
5393 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5394                                                     ConstantMatrixTypeLoc TL) {
5395   const ConstantMatrixType *T = TL.getTypePtr();
5396   QualType ElementType = getDerived().TransformType(T->getElementType());
5397   if (ElementType.isNull())
5398     return QualType();
5399 
5400   QualType Result = TL.getType();
5401   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5402     Result = getDerived().RebuildConstantMatrixType(
5403         ElementType, T->getNumRows(), T->getNumColumns());
5404     if (Result.isNull())
5405       return QualType();
5406   }
5407 
5408   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5409   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5410   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5411   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5412   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5413 
5414   return Result;
5415 }
5416 
5417 template <typename Derived>
5418 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5419     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5420   const DependentSizedMatrixType *T = TL.getTypePtr();
5421 
5422   QualType ElementType = getDerived().TransformType(T->getElementType());
5423   if (ElementType.isNull()) {
5424     return QualType();
5425   }
5426 
5427   // Matrix dimensions are constant expressions.
5428   EnterExpressionEvaluationContext Unevaluated(
5429       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5430 
5431   Expr *origRows = TL.getAttrRowOperand();
5432   if (!origRows)
5433     origRows = T->getRowExpr();
5434   Expr *origColumns = TL.getAttrColumnOperand();
5435   if (!origColumns)
5436     origColumns = T->getColumnExpr();
5437 
5438   ExprResult rowResult = getDerived().TransformExpr(origRows);
5439   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5440   if (rowResult.isInvalid())
5441     return QualType();
5442 
5443   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5444   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5445   if (columnResult.isInvalid())
5446     return QualType();
5447 
5448   Expr *rows = rowResult.get();
5449   Expr *columns = columnResult.get();
5450 
5451   QualType Result = TL.getType();
5452   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5453       rows != origRows || columns != origColumns) {
5454     Result = getDerived().RebuildDependentSizedMatrixType(
5455         ElementType, rows, columns, T->getAttributeLoc());
5456 
5457     if (Result.isNull())
5458       return QualType();
5459   }
5460 
5461   // We might have any sort of matrix type now, but fortunately they
5462   // all have the same location layout.
5463   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5464   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5465   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5466   NewTL.setAttrRowOperand(rows);
5467   NewTL.setAttrColumnOperand(columns);
5468   return Result;
5469 }
5470 
5471 template <typename Derived>
5472 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5473     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5474   const DependentAddressSpaceType *T = TL.getTypePtr();
5475 
5476   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5477 
5478   if (pointeeType.isNull())
5479     return QualType();
5480 
5481   // Address spaces are constant expressions.
5482   EnterExpressionEvaluationContext Unevaluated(
5483       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5484 
5485   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5486   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5487   if (AddrSpace.isInvalid())
5488     return QualType();
5489 
5490   QualType Result = TL.getType();
5491   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5492       AddrSpace.get() != T->getAddrSpaceExpr()) {
5493     Result = getDerived().RebuildDependentAddressSpaceType(
5494         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5495     if (Result.isNull())
5496       return QualType();
5497   }
5498 
5499   // Result might be dependent or not.
5500   if (isa<DependentAddressSpaceType>(Result)) {
5501     DependentAddressSpaceTypeLoc NewTL =
5502         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5503 
5504     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5505     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5506     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5507 
5508   } else {
5509     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5510         Result, getDerived().getBaseLocation());
5511     TransformType(TLB, DI->getTypeLoc());
5512   }
5513 
5514   return Result;
5515 }
5516 
5517 template <typename Derived>
5518 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5519                                                      VectorTypeLoc TL) {
5520   const VectorType *T = TL.getTypePtr();
5521   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5522   if (ElementType.isNull())
5523     return QualType();
5524 
5525   QualType Result = TL.getType();
5526   if (getDerived().AlwaysRebuild() ||
5527       ElementType != T->getElementType()) {
5528     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5529                                             T->getVectorKind());
5530     if (Result.isNull())
5531       return QualType();
5532   }
5533 
5534   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5535   NewTL.setNameLoc(TL.getNameLoc());
5536 
5537   return Result;
5538 }
5539 
5540 template<typename Derived>
5541 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5542                                                         ExtVectorTypeLoc TL) {
5543   const VectorType *T = TL.getTypePtr();
5544   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5545   if (ElementType.isNull())
5546     return QualType();
5547 
5548   QualType Result = TL.getType();
5549   if (getDerived().AlwaysRebuild() ||
5550       ElementType != T->getElementType()) {
5551     Result = getDerived().RebuildExtVectorType(ElementType,
5552                                                T->getNumElements(),
5553                                                /*FIXME*/ SourceLocation());
5554     if (Result.isNull())
5555       return QualType();
5556   }
5557 
5558   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5559   NewTL.setNameLoc(TL.getNameLoc());
5560 
5561   return Result;
5562 }
5563 
5564 template <typename Derived>
5565 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5566     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5567     bool ExpectParameterPack) {
5568   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5569   TypeSourceInfo *NewDI = nullptr;
5570 
5571   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5572     // If we're substituting into a pack expansion type and we know the
5573     // length we want to expand to, just substitute for the pattern.
5574     TypeLoc OldTL = OldDI->getTypeLoc();
5575     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5576 
5577     TypeLocBuilder TLB;
5578     TypeLoc NewTL = OldDI->getTypeLoc();
5579     TLB.reserve(NewTL.getFullDataSize());
5580 
5581     QualType Result = getDerived().TransformType(TLB,
5582                                                OldExpansionTL.getPatternLoc());
5583     if (Result.isNull())
5584       return nullptr;
5585 
5586     Result = RebuildPackExpansionType(Result,
5587                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5588                                       OldExpansionTL.getEllipsisLoc(),
5589                                       NumExpansions);
5590     if (Result.isNull())
5591       return nullptr;
5592 
5593     PackExpansionTypeLoc NewExpansionTL
5594       = TLB.push<PackExpansionTypeLoc>(Result);
5595     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5596     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5597   } else
5598     NewDI = getDerived().TransformType(OldDI);
5599   if (!NewDI)
5600     return nullptr;
5601 
5602   if (NewDI == OldDI && indexAdjustment == 0)
5603     return OldParm;
5604 
5605   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5606                                              OldParm->getDeclContext(),
5607                                              OldParm->getInnerLocStart(),
5608                                              OldParm->getLocation(),
5609                                              OldParm->getIdentifier(),
5610                                              NewDI->getType(),
5611                                              NewDI,
5612                                              OldParm->getStorageClass(),
5613                                              /* DefArg */ nullptr);
5614   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5615                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5616   transformedLocalDecl(OldParm, {newParm});
5617   return newParm;
5618 }
5619 
5620 template <typename Derived>
5621 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5622     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5623     const QualType *ParamTypes,
5624     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5625     SmallVectorImpl<QualType> &OutParamTypes,
5626     SmallVectorImpl<ParmVarDecl *> *PVars,
5627     Sema::ExtParameterInfoBuilder &PInfos) {
5628   int indexAdjustment = 0;
5629 
5630   unsigned NumParams = Params.size();
5631   for (unsigned i = 0; i != NumParams; ++i) {
5632     if (ParmVarDecl *OldParm = Params[i]) {
5633       assert(OldParm->getFunctionScopeIndex() == i);
5634 
5635       Optional<unsigned> NumExpansions;
5636       ParmVarDecl *NewParm = nullptr;
5637       if (OldParm->isParameterPack()) {
5638         // We have a function parameter pack that may need to be expanded.
5639         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5640 
5641         // Find the parameter packs that could be expanded.
5642         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5643         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5644         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5645         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5646 
5647         // Determine whether we should expand the parameter packs.
5648         bool ShouldExpand = false;
5649         bool RetainExpansion = false;
5650         Optional<unsigned> OrigNumExpansions;
5651         if (Unexpanded.size() > 0) {
5652           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5653           NumExpansions = OrigNumExpansions;
5654           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5655                                                    Pattern.getSourceRange(),
5656                                                    Unexpanded,
5657                                                    ShouldExpand,
5658                                                    RetainExpansion,
5659                                                    NumExpansions)) {
5660             return true;
5661           }
5662         } else {
5663 #ifndef NDEBUG
5664           const AutoType *AT =
5665               Pattern.getType().getTypePtr()->getContainedAutoType();
5666           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5667                  "Could not find parameter packs or undeduced auto type!");
5668 #endif
5669         }
5670 
5671         if (ShouldExpand) {
5672           // Expand the function parameter pack into multiple, separate
5673           // parameters.
5674           getDerived().ExpandingFunctionParameterPack(OldParm);
5675           for (unsigned I = 0; I != *NumExpansions; ++I) {
5676             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5677             ParmVarDecl *NewParm
5678               = getDerived().TransformFunctionTypeParam(OldParm,
5679                                                         indexAdjustment++,
5680                                                         OrigNumExpansions,
5681                                                 /*ExpectParameterPack=*/false);
5682             if (!NewParm)
5683               return true;
5684 
5685             if (ParamInfos)
5686               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5687             OutParamTypes.push_back(NewParm->getType());
5688             if (PVars)
5689               PVars->push_back(NewParm);
5690           }
5691 
5692           // If we're supposed to retain a pack expansion, do so by temporarily
5693           // forgetting the partially-substituted parameter pack.
5694           if (RetainExpansion) {
5695             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5696             ParmVarDecl *NewParm
5697               = getDerived().TransformFunctionTypeParam(OldParm,
5698                                                         indexAdjustment++,
5699                                                         OrigNumExpansions,
5700                                                 /*ExpectParameterPack=*/false);
5701             if (!NewParm)
5702               return true;
5703 
5704             if (ParamInfos)
5705               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5706             OutParamTypes.push_back(NewParm->getType());
5707             if (PVars)
5708               PVars->push_back(NewParm);
5709           }
5710 
5711           // The next parameter should have the same adjustment as the
5712           // last thing we pushed, but we post-incremented indexAdjustment
5713           // on every push.  Also, if we push nothing, the adjustment should
5714           // go down by one.
5715           indexAdjustment--;
5716 
5717           // We're done with the pack expansion.
5718           continue;
5719         }
5720 
5721         // We'll substitute the parameter now without expanding the pack
5722         // expansion.
5723         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5724         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5725                                                           indexAdjustment,
5726                                                           NumExpansions,
5727                                                   /*ExpectParameterPack=*/true);
5728         assert(NewParm->isParameterPack() &&
5729                "Parameter pack no longer a parameter pack after "
5730                "transformation.");
5731       } else {
5732         NewParm = getDerived().TransformFunctionTypeParam(
5733             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5734       }
5735 
5736       if (!NewParm)
5737         return true;
5738 
5739       if (ParamInfos)
5740         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5741       OutParamTypes.push_back(NewParm->getType());
5742       if (PVars)
5743         PVars->push_back(NewParm);
5744       continue;
5745     }
5746 
5747     // Deal with the possibility that we don't have a parameter
5748     // declaration for this parameter.
5749     QualType OldType = ParamTypes[i];
5750     bool IsPackExpansion = false;
5751     Optional<unsigned> NumExpansions;
5752     QualType NewType;
5753     if (const PackExpansionType *Expansion
5754                                        = dyn_cast<PackExpansionType>(OldType)) {
5755       // We have a function parameter pack that may need to be expanded.
5756       QualType Pattern = Expansion->getPattern();
5757       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5758       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5759 
5760       // Determine whether we should expand the parameter packs.
5761       bool ShouldExpand = false;
5762       bool RetainExpansion = false;
5763       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5764                                                Unexpanded,
5765                                                ShouldExpand,
5766                                                RetainExpansion,
5767                                                NumExpansions)) {
5768         return true;
5769       }
5770 
5771       if (ShouldExpand) {
5772         // Expand the function parameter pack into multiple, separate
5773         // parameters.
5774         for (unsigned I = 0; I != *NumExpansions; ++I) {
5775           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5776           QualType NewType = getDerived().TransformType(Pattern);
5777           if (NewType.isNull())
5778             return true;
5779 
5780           if (NewType->containsUnexpandedParameterPack()) {
5781             NewType =
5782                 getSema().getASTContext().getPackExpansionType(NewType, None);
5783 
5784             if (NewType.isNull())
5785               return true;
5786           }
5787 
5788           if (ParamInfos)
5789             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5790           OutParamTypes.push_back(NewType);
5791           if (PVars)
5792             PVars->push_back(nullptr);
5793         }
5794 
5795         // We're done with the pack expansion.
5796         continue;
5797       }
5798 
5799       // If we're supposed to retain a pack expansion, do so by temporarily
5800       // forgetting the partially-substituted parameter pack.
5801       if (RetainExpansion) {
5802         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5803         QualType NewType = getDerived().TransformType(Pattern);
5804         if (NewType.isNull())
5805           return true;
5806 
5807         if (ParamInfos)
5808           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5809         OutParamTypes.push_back(NewType);
5810         if (PVars)
5811           PVars->push_back(nullptr);
5812       }
5813 
5814       // We'll substitute the parameter now without expanding the pack
5815       // expansion.
5816       OldType = Expansion->getPattern();
5817       IsPackExpansion = true;
5818       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5819       NewType = getDerived().TransformType(OldType);
5820     } else {
5821       NewType = getDerived().TransformType(OldType);
5822     }
5823 
5824     if (NewType.isNull())
5825       return true;
5826 
5827     if (IsPackExpansion)
5828       NewType = getSema().Context.getPackExpansionType(NewType,
5829                                                        NumExpansions);
5830 
5831     if (ParamInfos)
5832       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5833     OutParamTypes.push_back(NewType);
5834     if (PVars)
5835       PVars->push_back(nullptr);
5836   }
5837 
5838 #ifndef NDEBUG
5839   if (PVars) {
5840     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5841       if (ParmVarDecl *parm = (*PVars)[i])
5842         assert(parm->getFunctionScopeIndex() == i);
5843   }
5844 #endif
5845 
5846   return false;
5847 }
5848 
5849 template<typename Derived>
5850 QualType
5851 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5852                                                    FunctionProtoTypeLoc TL) {
5853   SmallVector<QualType, 4> ExceptionStorage;
5854   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5855   return getDerived().TransformFunctionProtoType(
5856       TLB, TL, nullptr, Qualifiers(),
5857       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5858         return This->getDerived().TransformExceptionSpec(
5859             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
5860       });
5861 }
5862 
5863 template<typename Derived> template<typename Fn>
5864 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5865     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5866     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5867 
5868   // Transform the parameters and return type.
5869   //
5870   // We are required to instantiate the params and return type in source order.
5871   // When the function has a trailing return type, we instantiate the
5872   // parameters before the return type,  since the return type can then refer
5873   // to the parameters themselves (via decltype, sizeof, etc.).
5874   //
5875   SmallVector<QualType, 4> ParamTypes;
5876   SmallVector<ParmVarDecl*, 4> ParamDecls;
5877   Sema::ExtParameterInfoBuilder ExtParamInfos;
5878   const FunctionProtoType *T = TL.getTypePtr();
5879 
5880   QualType ResultType;
5881 
5882   if (T->hasTrailingReturn()) {
5883     if (getDerived().TransformFunctionTypeParams(
5884             TL.getBeginLoc(), TL.getParams(),
5885             TL.getTypePtr()->param_type_begin(),
5886             T->getExtParameterInfosOrNull(),
5887             ParamTypes, &ParamDecls, ExtParamInfos))
5888       return QualType();
5889 
5890     {
5891       // C++11 [expr.prim.general]p3:
5892       //   If a declaration declares a member function or member function
5893       //   template of a class X, the expression this is a prvalue of type
5894       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5895       //   and the end of the function-definition, member-declarator, or
5896       //   declarator.
5897       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5898 
5899       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5900       if (ResultType.isNull())
5901         return QualType();
5902     }
5903   }
5904   else {
5905     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5906     if (ResultType.isNull())
5907       return QualType();
5908 
5909     if (getDerived().TransformFunctionTypeParams(
5910             TL.getBeginLoc(), TL.getParams(),
5911             TL.getTypePtr()->param_type_begin(),
5912             T->getExtParameterInfosOrNull(),
5913             ParamTypes, &ParamDecls, ExtParamInfos))
5914       return QualType();
5915   }
5916 
5917   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5918 
5919   bool EPIChanged = false;
5920   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5921     return QualType();
5922 
5923   // Handle extended parameter information.
5924   if (auto NewExtParamInfos =
5925         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5926     if (!EPI.ExtParameterInfos ||
5927         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5928           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5929       EPIChanged = true;
5930     }
5931     EPI.ExtParameterInfos = NewExtParamInfos;
5932   } else if (EPI.ExtParameterInfos) {
5933     EPIChanged = true;
5934     EPI.ExtParameterInfos = nullptr;
5935   }
5936 
5937   QualType Result = TL.getType();
5938   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5939       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5940     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5941     if (Result.isNull())
5942       return QualType();
5943   }
5944 
5945   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5946   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5947   NewTL.setLParenLoc(TL.getLParenLoc());
5948   NewTL.setRParenLoc(TL.getRParenLoc());
5949   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5950   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5951   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5952     NewTL.setParam(i, ParamDecls[i]);
5953 
5954   return Result;
5955 }
5956 
5957 template<typename Derived>
5958 bool TreeTransform<Derived>::TransformExceptionSpec(
5959     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5960     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5961   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5962 
5963   // Instantiate a dynamic noexcept expression, if any.
5964   if (isComputedNoexcept(ESI.Type)) {
5965     EnterExpressionEvaluationContext Unevaluated(
5966         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5967     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5968     if (NoexceptExpr.isInvalid())
5969       return true;
5970 
5971     ExceptionSpecificationType EST = ESI.Type;
5972     NoexceptExpr =
5973         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
5974     if (NoexceptExpr.isInvalid())
5975       return true;
5976 
5977     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5978       Changed = true;
5979     ESI.NoexceptExpr = NoexceptExpr.get();
5980     ESI.Type = EST;
5981   }
5982 
5983   if (ESI.Type != EST_Dynamic)
5984     return false;
5985 
5986   // Instantiate a dynamic exception specification's type.
5987   for (QualType T : ESI.Exceptions) {
5988     if (const PackExpansionType *PackExpansion =
5989             T->getAs<PackExpansionType>()) {
5990       Changed = true;
5991 
5992       // We have a pack expansion. Instantiate it.
5993       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5994       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5995                                               Unexpanded);
5996       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5997 
5998       // Determine whether the set of unexpanded parameter packs can and
5999       // should
6000       // be expanded.
6001       bool Expand = false;
6002       bool RetainExpansion = false;
6003       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6004       // FIXME: Track the location of the ellipsis (and track source location
6005       // information for the types in the exception specification in general).
6006       if (getDerived().TryExpandParameterPacks(
6007               Loc, SourceRange(), Unexpanded, Expand,
6008               RetainExpansion, NumExpansions))
6009         return true;
6010 
6011       if (!Expand) {
6012         // We can't expand this pack expansion into separate arguments yet;
6013         // just substitute into the pattern and create a new pack expansion
6014         // type.
6015         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6016         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6017         if (U.isNull())
6018           return true;
6019 
6020         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6021         Exceptions.push_back(U);
6022         continue;
6023       }
6024 
6025       // Substitute into the pack expansion pattern for each slice of the
6026       // pack.
6027       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6028         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6029 
6030         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6031         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6032           return true;
6033 
6034         Exceptions.push_back(U);
6035       }
6036     } else {
6037       QualType U = getDerived().TransformType(T);
6038       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6039         return true;
6040       if (T != U)
6041         Changed = true;
6042 
6043       Exceptions.push_back(U);
6044     }
6045   }
6046 
6047   ESI.Exceptions = Exceptions;
6048   if (ESI.Exceptions.empty())
6049     ESI.Type = EST_DynamicNone;
6050   return false;
6051 }
6052 
6053 template<typename Derived>
6054 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6055                                                  TypeLocBuilder &TLB,
6056                                                  FunctionNoProtoTypeLoc TL) {
6057   const FunctionNoProtoType *T = TL.getTypePtr();
6058   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6059   if (ResultType.isNull())
6060     return QualType();
6061 
6062   QualType Result = TL.getType();
6063   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6064     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6065 
6066   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6067   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6068   NewTL.setLParenLoc(TL.getLParenLoc());
6069   NewTL.setRParenLoc(TL.getRParenLoc());
6070   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6071 
6072   return Result;
6073 }
6074 
6075 template<typename Derived> QualType
6076 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6077                                                  UnresolvedUsingTypeLoc TL) {
6078   const UnresolvedUsingType *T = TL.getTypePtr();
6079   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6080   if (!D)
6081     return QualType();
6082 
6083   QualType Result = TL.getType();
6084   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6085     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6086     if (Result.isNull())
6087       return QualType();
6088   }
6089 
6090   // We might get an arbitrary type spec type back.  We should at
6091   // least always get a type spec type, though.
6092   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6093   NewTL.setNameLoc(TL.getNameLoc());
6094 
6095   return Result;
6096 }
6097 
6098 template<typename Derived>
6099 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6100                                                       TypedefTypeLoc TL) {
6101   const TypedefType *T = TL.getTypePtr();
6102   TypedefNameDecl *Typedef
6103     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6104                                                                T->getDecl()));
6105   if (!Typedef)
6106     return QualType();
6107 
6108   QualType Result = TL.getType();
6109   if (getDerived().AlwaysRebuild() ||
6110       Typedef != T->getDecl()) {
6111     Result = getDerived().RebuildTypedefType(Typedef);
6112     if (Result.isNull())
6113       return QualType();
6114   }
6115 
6116   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6117   NewTL.setNameLoc(TL.getNameLoc());
6118 
6119   return Result;
6120 }
6121 
6122 template<typename Derived>
6123 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6124                                                       TypeOfExprTypeLoc TL) {
6125   // typeof expressions are not potentially evaluated contexts
6126   EnterExpressionEvaluationContext Unevaluated(
6127       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6128       Sema::ReuseLambdaContextDecl);
6129 
6130   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6131   if (E.isInvalid())
6132     return QualType();
6133 
6134   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6135   if (E.isInvalid())
6136     return QualType();
6137 
6138   QualType Result = TL.getType();
6139   if (getDerived().AlwaysRebuild() ||
6140       E.get() != TL.getUnderlyingExpr()) {
6141     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6142     if (Result.isNull())
6143       return QualType();
6144   }
6145   else E.get();
6146 
6147   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6148   NewTL.setTypeofLoc(TL.getTypeofLoc());
6149   NewTL.setLParenLoc(TL.getLParenLoc());
6150   NewTL.setRParenLoc(TL.getRParenLoc());
6151 
6152   return Result;
6153 }
6154 
6155 template<typename Derived>
6156 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6157                                                      TypeOfTypeLoc TL) {
6158   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6159   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6160   if (!New_Under_TI)
6161     return QualType();
6162 
6163   QualType Result = TL.getType();
6164   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6165     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6166     if (Result.isNull())
6167       return QualType();
6168   }
6169 
6170   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6171   NewTL.setTypeofLoc(TL.getTypeofLoc());
6172   NewTL.setLParenLoc(TL.getLParenLoc());
6173   NewTL.setRParenLoc(TL.getRParenLoc());
6174   NewTL.setUnderlyingTInfo(New_Under_TI);
6175 
6176   return Result;
6177 }
6178 
6179 template<typename Derived>
6180 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6181                                                        DecltypeTypeLoc TL) {
6182   const DecltypeType *T = TL.getTypePtr();
6183 
6184   // decltype expressions are not potentially evaluated contexts
6185   EnterExpressionEvaluationContext Unevaluated(
6186       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6187       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6188 
6189   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6190   if (E.isInvalid())
6191     return QualType();
6192 
6193   E = getSema().ActOnDecltypeExpression(E.get());
6194   if (E.isInvalid())
6195     return QualType();
6196 
6197   QualType Result = TL.getType();
6198   if (getDerived().AlwaysRebuild() ||
6199       E.get() != T->getUnderlyingExpr()) {
6200     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6201     if (Result.isNull())
6202       return QualType();
6203   }
6204   else E.get();
6205 
6206   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6207   NewTL.setNameLoc(TL.getNameLoc());
6208 
6209   return Result;
6210 }
6211 
6212 template<typename Derived>
6213 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6214                                                             TypeLocBuilder &TLB,
6215                                                      UnaryTransformTypeLoc TL) {
6216   QualType Result = TL.getType();
6217   if (Result->isDependentType()) {
6218     const UnaryTransformType *T = TL.getTypePtr();
6219     QualType NewBase =
6220       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6221     Result = getDerived().RebuildUnaryTransformType(NewBase,
6222                                                     T->getUTTKind(),
6223                                                     TL.getKWLoc());
6224     if (Result.isNull())
6225       return QualType();
6226   }
6227 
6228   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6229   NewTL.setKWLoc(TL.getKWLoc());
6230   NewTL.setParensRange(TL.getParensRange());
6231   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6232   return Result;
6233 }
6234 
6235 template<typename Derived>
6236 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6237     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6238   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6239 
6240   CXXScopeSpec SS;
6241   TemplateName TemplateName = getDerived().TransformTemplateName(
6242       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6243   if (TemplateName.isNull())
6244     return QualType();
6245 
6246   QualType OldDeduced = T->getDeducedType();
6247   QualType NewDeduced;
6248   if (!OldDeduced.isNull()) {
6249     NewDeduced = getDerived().TransformType(OldDeduced);
6250     if (NewDeduced.isNull())
6251       return QualType();
6252   }
6253 
6254   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6255       TemplateName, NewDeduced);
6256   if (Result.isNull())
6257     return QualType();
6258 
6259   DeducedTemplateSpecializationTypeLoc NewTL =
6260       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6261   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6262 
6263   return Result;
6264 }
6265 
6266 template<typename Derived>
6267 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6268                                                      RecordTypeLoc TL) {
6269   const RecordType *T = TL.getTypePtr();
6270   RecordDecl *Record
6271     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6272                                                           T->getDecl()));
6273   if (!Record)
6274     return QualType();
6275 
6276   QualType Result = TL.getType();
6277   if (getDerived().AlwaysRebuild() ||
6278       Record != T->getDecl()) {
6279     Result = getDerived().RebuildRecordType(Record);
6280     if (Result.isNull())
6281       return QualType();
6282   }
6283 
6284   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6285   NewTL.setNameLoc(TL.getNameLoc());
6286 
6287   return Result;
6288 }
6289 
6290 template<typename Derived>
6291 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6292                                                    EnumTypeLoc TL) {
6293   const EnumType *T = TL.getTypePtr();
6294   EnumDecl *Enum
6295     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6296                                                         T->getDecl()));
6297   if (!Enum)
6298     return QualType();
6299 
6300   QualType Result = TL.getType();
6301   if (getDerived().AlwaysRebuild() ||
6302       Enum != T->getDecl()) {
6303     Result = getDerived().RebuildEnumType(Enum);
6304     if (Result.isNull())
6305       return QualType();
6306   }
6307 
6308   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6309   NewTL.setNameLoc(TL.getNameLoc());
6310 
6311   return Result;
6312 }
6313 
6314 template<typename Derived>
6315 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6316                                          TypeLocBuilder &TLB,
6317                                          InjectedClassNameTypeLoc TL) {
6318   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6319                                        TL.getTypePtr()->getDecl());
6320   if (!D) return QualType();
6321 
6322   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6323   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6324   return T;
6325 }
6326 
6327 template<typename Derived>
6328 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6329                                                 TypeLocBuilder &TLB,
6330                                                 TemplateTypeParmTypeLoc TL) {
6331   return TransformTypeSpecType(TLB, TL);
6332 }
6333 
6334 template<typename Derived>
6335 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6336                                          TypeLocBuilder &TLB,
6337                                          SubstTemplateTypeParmTypeLoc TL) {
6338   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6339 
6340   // Substitute into the replacement type, which itself might involve something
6341   // that needs to be transformed. This only tends to occur with default
6342   // template arguments of template template parameters.
6343   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6344   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6345   if (Replacement.isNull())
6346     return QualType();
6347 
6348   // Always canonicalize the replacement type.
6349   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6350   QualType Result
6351     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6352                                                    Replacement);
6353 
6354   // Propagate type-source information.
6355   SubstTemplateTypeParmTypeLoc NewTL
6356     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6357   NewTL.setNameLoc(TL.getNameLoc());
6358   return Result;
6359 
6360 }
6361 
6362 template<typename Derived>
6363 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6364                                           TypeLocBuilder &TLB,
6365                                           SubstTemplateTypeParmPackTypeLoc TL) {
6366   return TransformTypeSpecType(TLB, TL);
6367 }
6368 
6369 template<typename Derived>
6370 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6371                                                         TypeLocBuilder &TLB,
6372                                            TemplateSpecializationTypeLoc TL) {
6373   const TemplateSpecializationType *T = TL.getTypePtr();
6374 
6375   // The nested-name-specifier never matters in a TemplateSpecializationType,
6376   // because we can't have a dependent nested-name-specifier anyway.
6377   CXXScopeSpec SS;
6378   TemplateName Template
6379     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6380                                          TL.getTemplateNameLoc());
6381   if (Template.isNull())
6382     return QualType();
6383 
6384   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6385 }
6386 
6387 template<typename Derived>
6388 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6389                                                      AtomicTypeLoc TL) {
6390   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6391   if (ValueType.isNull())
6392     return QualType();
6393 
6394   QualType Result = TL.getType();
6395   if (getDerived().AlwaysRebuild() ||
6396       ValueType != TL.getValueLoc().getType()) {
6397     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6398     if (Result.isNull())
6399       return QualType();
6400   }
6401 
6402   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6403   NewTL.setKWLoc(TL.getKWLoc());
6404   NewTL.setLParenLoc(TL.getLParenLoc());
6405   NewTL.setRParenLoc(TL.getRParenLoc());
6406 
6407   return Result;
6408 }
6409 
6410 template <typename Derived>
6411 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6412                                                    PipeTypeLoc TL) {
6413   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6414   if (ValueType.isNull())
6415     return QualType();
6416 
6417   QualType Result = TL.getType();
6418   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6419     const PipeType *PT = Result->castAs<PipeType>();
6420     bool isReadPipe = PT->isReadOnly();
6421     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6422     if (Result.isNull())
6423       return QualType();
6424   }
6425 
6426   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6427   NewTL.setKWLoc(TL.getKWLoc());
6428 
6429   return Result;
6430 }
6431 
6432 template <typename Derived>
6433 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6434                                                      ExtIntTypeLoc TL) {
6435   const ExtIntType *EIT = TL.getTypePtr();
6436   QualType Result = TL.getType();
6437 
6438   if (getDerived().AlwaysRebuild()) {
6439     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6440                                             EIT->getNumBits(), TL.getNameLoc());
6441     if (Result.isNull())
6442       return QualType();
6443   }
6444 
6445   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6446   NewTL.setNameLoc(TL.getNameLoc());
6447   return Result;
6448 }
6449 
6450 template <typename Derived>
6451 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6452     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6453   const DependentExtIntType *EIT = TL.getTypePtr();
6454 
6455   EnterExpressionEvaluationContext Unevaluated(
6456       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6457   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6458   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6459 
6460   if (BitsExpr.isInvalid())
6461     return QualType();
6462 
6463   QualType Result = TL.getType();
6464 
6465   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6466     Result = getDerived().RebuildDependentExtIntType(
6467         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6468 
6469     if (Result.isNull())
6470       return QualType();
6471   }
6472 
6473   if (isa<DependentExtIntType>(Result)) {
6474     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6475     NewTL.setNameLoc(TL.getNameLoc());
6476   } else {
6477     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6478     NewTL.setNameLoc(TL.getNameLoc());
6479   }
6480   return Result;
6481 }
6482 
6483   /// Simple iterator that traverses the template arguments in a
6484   /// container that provides a \c getArgLoc() member function.
6485   ///
6486   /// This iterator is intended to be used with the iterator form of
6487   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6488   template<typename ArgLocContainer>
6489   class TemplateArgumentLocContainerIterator {
6490     ArgLocContainer *Container;
6491     unsigned Index;
6492 
6493   public:
6494     typedef TemplateArgumentLoc value_type;
6495     typedef TemplateArgumentLoc reference;
6496     typedef int difference_type;
6497     typedef std::input_iterator_tag iterator_category;
6498 
6499     class pointer {
6500       TemplateArgumentLoc Arg;
6501 
6502     public:
6503       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6504 
6505       const TemplateArgumentLoc *operator->() const {
6506         return &Arg;
6507       }
6508     };
6509 
6510 
6511     TemplateArgumentLocContainerIterator() {}
6512 
6513     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6514                                  unsigned Index)
6515       : Container(&Container), Index(Index) { }
6516 
6517     TemplateArgumentLocContainerIterator &operator++() {
6518       ++Index;
6519       return *this;
6520     }
6521 
6522     TemplateArgumentLocContainerIterator operator++(int) {
6523       TemplateArgumentLocContainerIterator Old(*this);
6524       ++(*this);
6525       return Old;
6526     }
6527 
6528     TemplateArgumentLoc operator*() const {
6529       return Container->getArgLoc(Index);
6530     }
6531 
6532     pointer operator->() const {
6533       return pointer(Container->getArgLoc(Index));
6534     }
6535 
6536     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6537                            const TemplateArgumentLocContainerIterator &Y) {
6538       return X.Container == Y.Container && X.Index == Y.Index;
6539     }
6540 
6541     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6542                            const TemplateArgumentLocContainerIterator &Y) {
6543       return !(X == Y);
6544     }
6545   };
6546 
6547 template<typename Derived>
6548 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6549                                                    AutoTypeLoc TL) {
6550   const AutoType *T = TL.getTypePtr();
6551   QualType OldDeduced = T->getDeducedType();
6552   QualType NewDeduced;
6553   if (!OldDeduced.isNull()) {
6554     NewDeduced = getDerived().TransformType(OldDeduced);
6555     if (NewDeduced.isNull())
6556       return QualType();
6557   }
6558 
6559   ConceptDecl *NewCD = nullptr;
6560   TemplateArgumentListInfo NewTemplateArgs;
6561   NestedNameSpecifierLoc NewNestedNameSpec;
6562   if (T->isConstrained()) {
6563     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6564         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6565 
6566     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6567     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6568     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6569     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6570                                                 ArgIterator(TL,
6571                                                             TL.getNumArgs()),
6572                                                 NewTemplateArgs))
6573       return QualType();
6574 
6575     if (TL.getNestedNameSpecifierLoc()) {
6576       NewNestedNameSpec
6577         = getDerived().TransformNestedNameSpecifierLoc(
6578             TL.getNestedNameSpecifierLoc());
6579       if (!NewNestedNameSpec)
6580         return QualType();
6581     }
6582   }
6583 
6584   QualType Result = TL.getType();
6585   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6586       T->isDependentType() || T->isConstrained()) {
6587     // FIXME: Maybe don't rebuild if all template arguments are the same.
6588     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6589     NewArgList.reserve(NewTemplateArgs.size());
6590     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6591       NewArgList.push_back(ArgLoc.getArgument());
6592     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6593                                           NewArgList);
6594     if (Result.isNull())
6595       return QualType();
6596   }
6597 
6598   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6599   NewTL.setNameLoc(TL.getNameLoc());
6600   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6601   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6602   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6603   NewTL.setFoundDecl(TL.getFoundDecl());
6604   NewTL.setLAngleLoc(TL.getLAngleLoc());
6605   NewTL.setRAngleLoc(TL.getRAngleLoc());
6606   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6607     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6608 
6609   return Result;
6610 }
6611 
6612 template <typename Derived>
6613 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6614                                                         TypeLocBuilder &TLB,
6615                                            TemplateSpecializationTypeLoc TL,
6616                                                       TemplateName Template) {
6617   TemplateArgumentListInfo NewTemplateArgs;
6618   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6619   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6620   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6621     ArgIterator;
6622   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6623                                               ArgIterator(TL, TL.getNumArgs()),
6624                                               NewTemplateArgs))
6625     return QualType();
6626 
6627   // FIXME: maybe don't rebuild if all the template arguments are the same.
6628 
6629   QualType Result =
6630     getDerived().RebuildTemplateSpecializationType(Template,
6631                                                    TL.getTemplateNameLoc(),
6632                                                    NewTemplateArgs);
6633 
6634   if (!Result.isNull()) {
6635     // Specializations of template template parameters are represented as
6636     // TemplateSpecializationTypes, and substitution of type alias templates
6637     // within a dependent context can transform them into
6638     // DependentTemplateSpecializationTypes.
6639     if (isa<DependentTemplateSpecializationType>(Result)) {
6640       DependentTemplateSpecializationTypeLoc NewTL
6641         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6642       NewTL.setElaboratedKeywordLoc(SourceLocation());
6643       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6644       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6645       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6646       NewTL.setLAngleLoc(TL.getLAngleLoc());
6647       NewTL.setRAngleLoc(TL.getRAngleLoc());
6648       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6649         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6650       return Result;
6651     }
6652 
6653     TemplateSpecializationTypeLoc NewTL
6654       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6655     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6656     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6657     NewTL.setLAngleLoc(TL.getLAngleLoc());
6658     NewTL.setRAngleLoc(TL.getRAngleLoc());
6659     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6660       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6661   }
6662 
6663   return Result;
6664 }
6665 
6666 template <typename Derived>
6667 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6668                                      TypeLocBuilder &TLB,
6669                                      DependentTemplateSpecializationTypeLoc TL,
6670                                      TemplateName Template,
6671                                      CXXScopeSpec &SS) {
6672   TemplateArgumentListInfo NewTemplateArgs;
6673   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6674   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6675   typedef TemplateArgumentLocContainerIterator<
6676             DependentTemplateSpecializationTypeLoc> ArgIterator;
6677   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6678                                               ArgIterator(TL, TL.getNumArgs()),
6679                                               NewTemplateArgs))
6680     return QualType();
6681 
6682   // FIXME: maybe don't rebuild if all the template arguments are the same.
6683 
6684   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6685     QualType Result
6686       = getSema().Context.getDependentTemplateSpecializationType(
6687                                                 TL.getTypePtr()->getKeyword(),
6688                                                          DTN->getQualifier(),
6689                                                          DTN->getIdentifier(),
6690                                                                NewTemplateArgs);
6691 
6692     DependentTemplateSpecializationTypeLoc NewTL
6693       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6694     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6695     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6696     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6697     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6698     NewTL.setLAngleLoc(TL.getLAngleLoc());
6699     NewTL.setRAngleLoc(TL.getRAngleLoc());
6700     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6701       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6702     return Result;
6703   }
6704 
6705   QualType Result
6706     = getDerived().RebuildTemplateSpecializationType(Template,
6707                                                      TL.getTemplateNameLoc(),
6708                                                      NewTemplateArgs);
6709 
6710   if (!Result.isNull()) {
6711     /// FIXME: Wrap this in an elaborated-type-specifier?
6712     TemplateSpecializationTypeLoc NewTL
6713       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6714     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6715     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6716     NewTL.setLAngleLoc(TL.getLAngleLoc());
6717     NewTL.setRAngleLoc(TL.getRAngleLoc());
6718     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6719       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6720   }
6721 
6722   return Result;
6723 }
6724 
6725 template<typename Derived>
6726 QualType
6727 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6728                                                 ElaboratedTypeLoc TL) {
6729   const ElaboratedType *T = TL.getTypePtr();
6730 
6731   NestedNameSpecifierLoc QualifierLoc;
6732   // NOTE: the qualifier in an ElaboratedType is optional.
6733   if (TL.getQualifierLoc()) {
6734     QualifierLoc
6735       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6736     if (!QualifierLoc)
6737       return QualType();
6738   }
6739 
6740   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6741   if (NamedT.isNull())
6742     return QualType();
6743 
6744   // C++0x [dcl.type.elab]p2:
6745   //   If the identifier resolves to a typedef-name or the simple-template-id
6746   //   resolves to an alias template specialization, the
6747   //   elaborated-type-specifier is ill-formed.
6748   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6749     if (const TemplateSpecializationType *TST =
6750           NamedT->getAs<TemplateSpecializationType>()) {
6751       TemplateName Template = TST->getTemplateName();
6752       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6753               Template.getAsTemplateDecl())) {
6754         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6755                      diag::err_tag_reference_non_tag)
6756             << TAT << Sema::NTK_TypeAliasTemplate
6757             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6758         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6759       }
6760     }
6761   }
6762 
6763   QualType Result = TL.getType();
6764   if (getDerived().AlwaysRebuild() ||
6765       QualifierLoc != TL.getQualifierLoc() ||
6766       NamedT != T->getNamedType()) {
6767     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6768                                                 T->getKeyword(),
6769                                                 QualifierLoc, NamedT);
6770     if (Result.isNull())
6771       return QualType();
6772   }
6773 
6774   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6775   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6776   NewTL.setQualifierLoc(QualifierLoc);
6777   return Result;
6778 }
6779 
6780 template<typename Derived>
6781 QualType TreeTransform<Derived>::TransformAttributedType(
6782                                                 TypeLocBuilder &TLB,
6783                                                 AttributedTypeLoc TL) {
6784   const AttributedType *oldType = TL.getTypePtr();
6785   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6786   if (modifiedType.isNull())
6787     return QualType();
6788 
6789   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6790   const Attr *oldAttr = TL.getAttr();
6791   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6792   if (oldAttr && !newAttr)
6793     return QualType();
6794 
6795   QualType result = TL.getType();
6796 
6797   // FIXME: dependent operand expressions?
6798   if (getDerived().AlwaysRebuild() ||
6799       modifiedType != oldType->getModifiedType()) {
6800     // TODO: this is really lame; we should really be rebuilding the
6801     // equivalent type from first principles.
6802     QualType equivalentType
6803       = getDerived().TransformType(oldType->getEquivalentType());
6804     if (equivalentType.isNull())
6805       return QualType();
6806 
6807     // Check whether we can add nullability; it is only represented as
6808     // type sugar, and therefore cannot be diagnosed in any other way.
6809     if (auto nullability = oldType->getImmediateNullability()) {
6810       if (!modifiedType->canHaveNullability()) {
6811         SemaRef.Diag(TL.getAttr()->getLocation(),
6812                      diag::err_nullability_nonpointer)
6813             << DiagNullabilityKind(*nullability, false) << modifiedType;
6814         return QualType();
6815       }
6816     }
6817 
6818     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6819                                                modifiedType,
6820                                                equivalentType);
6821   }
6822 
6823   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6824   newTL.setAttr(newAttr);
6825   return result;
6826 }
6827 
6828 template<typename Derived>
6829 QualType
6830 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6831                                            ParenTypeLoc TL) {
6832   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6833   if (Inner.isNull())
6834     return QualType();
6835 
6836   QualType Result = TL.getType();
6837   if (getDerived().AlwaysRebuild() ||
6838       Inner != TL.getInnerLoc().getType()) {
6839     Result = getDerived().RebuildParenType(Inner);
6840     if (Result.isNull())
6841       return QualType();
6842   }
6843 
6844   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6845   NewTL.setLParenLoc(TL.getLParenLoc());
6846   NewTL.setRParenLoc(TL.getRParenLoc());
6847   return Result;
6848 }
6849 
6850 template <typename Derived>
6851 QualType
6852 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6853                                                     MacroQualifiedTypeLoc TL) {
6854   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6855   if (Inner.isNull())
6856     return QualType();
6857 
6858   QualType Result = TL.getType();
6859   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6860     Result =
6861         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6862     if (Result.isNull())
6863       return QualType();
6864   }
6865 
6866   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6867   NewTL.setExpansionLoc(TL.getExpansionLoc());
6868   return Result;
6869 }
6870 
6871 template<typename Derived>
6872 QualType TreeTransform<Derived>::TransformDependentNameType(
6873     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6874   return TransformDependentNameType(TLB, TL, false);
6875 }
6876 
6877 template<typename Derived>
6878 QualType TreeTransform<Derived>::TransformDependentNameType(
6879     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6880   const DependentNameType *T = TL.getTypePtr();
6881 
6882   NestedNameSpecifierLoc QualifierLoc
6883     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6884   if (!QualifierLoc)
6885     return QualType();
6886 
6887   QualType Result
6888     = getDerived().RebuildDependentNameType(T->getKeyword(),
6889                                             TL.getElaboratedKeywordLoc(),
6890                                             QualifierLoc,
6891                                             T->getIdentifier(),
6892                                             TL.getNameLoc(),
6893                                             DeducedTSTContext);
6894   if (Result.isNull())
6895     return QualType();
6896 
6897   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6898     QualType NamedT = ElabT->getNamedType();
6899     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6900 
6901     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6902     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6903     NewTL.setQualifierLoc(QualifierLoc);
6904   } else {
6905     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6906     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6907     NewTL.setQualifierLoc(QualifierLoc);
6908     NewTL.setNameLoc(TL.getNameLoc());
6909   }
6910   return Result;
6911 }
6912 
6913 template<typename Derived>
6914 QualType TreeTransform<Derived>::
6915           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6916                                  DependentTemplateSpecializationTypeLoc TL) {
6917   NestedNameSpecifierLoc QualifierLoc;
6918   if (TL.getQualifierLoc()) {
6919     QualifierLoc
6920       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6921     if (!QualifierLoc)
6922       return QualType();
6923   }
6924 
6925   return getDerived()
6926            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6927 }
6928 
6929 template<typename Derived>
6930 QualType TreeTransform<Derived>::
6931 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6932                                    DependentTemplateSpecializationTypeLoc TL,
6933                                        NestedNameSpecifierLoc QualifierLoc) {
6934   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6935 
6936   TemplateArgumentListInfo NewTemplateArgs;
6937   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6938   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6939 
6940   typedef TemplateArgumentLocContainerIterator<
6941   DependentTemplateSpecializationTypeLoc> ArgIterator;
6942   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6943                                               ArgIterator(TL, TL.getNumArgs()),
6944                                               NewTemplateArgs))
6945     return QualType();
6946 
6947   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6948       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6949       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6950       /*AllowInjectedClassName*/ false);
6951   if (Result.isNull())
6952     return QualType();
6953 
6954   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6955     QualType NamedT = ElabT->getNamedType();
6956 
6957     // Copy information relevant to the template specialization.
6958     TemplateSpecializationTypeLoc NamedTL
6959       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6960     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6961     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6962     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6963     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6964     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6965       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6966 
6967     // Copy information relevant to the elaborated type.
6968     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6969     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6970     NewTL.setQualifierLoc(QualifierLoc);
6971   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6972     DependentTemplateSpecializationTypeLoc SpecTL
6973       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6974     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6975     SpecTL.setQualifierLoc(QualifierLoc);
6976     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6977     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6978     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6979     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6980     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6981       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6982   } else {
6983     TemplateSpecializationTypeLoc SpecTL
6984       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6985     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6986     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6987     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6988     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6989     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6990       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6991   }
6992   return Result;
6993 }
6994 
6995 template<typename Derived>
6996 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6997                                                       PackExpansionTypeLoc TL) {
6998   QualType Pattern
6999     = getDerived().TransformType(TLB, TL.getPatternLoc());
7000   if (Pattern.isNull())
7001     return QualType();
7002 
7003   QualType Result = TL.getType();
7004   if (getDerived().AlwaysRebuild() ||
7005       Pattern != TL.getPatternLoc().getType()) {
7006     Result = getDerived().RebuildPackExpansionType(Pattern,
7007                                            TL.getPatternLoc().getSourceRange(),
7008                                                    TL.getEllipsisLoc(),
7009                                            TL.getTypePtr()->getNumExpansions());
7010     if (Result.isNull())
7011       return QualType();
7012   }
7013 
7014   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7015   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7016   return Result;
7017 }
7018 
7019 template<typename Derived>
7020 QualType
7021 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7022                                                    ObjCInterfaceTypeLoc TL) {
7023   // ObjCInterfaceType is never dependent.
7024   TLB.pushFullCopy(TL);
7025   return TL.getType();
7026 }
7027 
7028 template<typename Derived>
7029 QualType
7030 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7031                                                    ObjCTypeParamTypeLoc TL) {
7032   const ObjCTypeParamType *T = TL.getTypePtr();
7033   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7034       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7035   if (!OTP)
7036     return QualType();
7037 
7038   QualType Result = TL.getType();
7039   if (getDerived().AlwaysRebuild() ||
7040       OTP != T->getDecl()) {
7041     Result = getDerived().RebuildObjCTypeParamType(OTP,
7042                  TL.getProtocolLAngleLoc(),
7043                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7044                                     TL.getNumProtocols()),
7045                  TL.getProtocolLocs(),
7046                  TL.getProtocolRAngleLoc());
7047     if (Result.isNull())
7048       return QualType();
7049   }
7050 
7051   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7052   if (TL.getNumProtocols()) {
7053     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7054     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7055       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7056     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7057   }
7058   return Result;
7059 }
7060 
7061 template<typename Derived>
7062 QualType
7063 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7064                                                 ObjCObjectTypeLoc TL) {
7065   // Transform base type.
7066   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7067   if (BaseType.isNull())
7068     return QualType();
7069 
7070   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7071 
7072   // Transform type arguments.
7073   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7074   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7075     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7076     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7077     QualType TypeArg = TypeArgInfo->getType();
7078     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7079       AnyChanged = true;
7080 
7081       // We have a pack expansion. Instantiate it.
7082       const auto *PackExpansion = PackExpansionLoc.getType()
7083                                     ->castAs<PackExpansionType>();
7084       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7085       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7086                                               Unexpanded);
7087       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7088 
7089       // Determine whether the set of unexpanded parameter packs can
7090       // and should be expanded.
7091       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7092       bool Expand = false;
7093       bool RetainExpansion = false;
7094       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7095       if (getDerived().TryExpandParameterPacks(
7096             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7097             Unexpanded, Expand, RetainExpansion, NumExpansions))
7098         return QualType();
7099 
7100       if (!Expand) {
7101         // We can't expand this pack expansion into separate arguments yet;
7102         // just substitute into the pattern and create a new pack expansion
7103         // type.
7104         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7105 
7106         TypeLocBuilder TypeArgBuilder;
7107         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7108         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7109                                                              PatternLoc);
7110         if (NewPatternType.isNull())
7111           return QualType();
7112 
7113         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7114                                       NewPatternType, NumExpansions);
7115         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7116         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7117         NewTypeArgInfos.push_back(
7118           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7119         continue;
7120       }
7121 
7122       // Substitute into the pack expansion pattern for each slice of the
7123       // pack.
7124       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7125         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7126 
7127         TypeLocBuilder TypeArgBuilder;
7128         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7129 
7130         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7131                                                          PatternLoc);
7132         if (NewTypeArg.isNull())
7133           return QualType();
7134 
7135         NewTypeArgInfos.push_back(
7136           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7137       }
7138 
7139       continue;
7140     }
7141 
7142     TypeLocBuilder TypeArgBuilder;
7143     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7144     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7145     if (NewTypeArg.isNull())
7146       return QualType();
7147 
7148     // If nothing changed, just keep the old TypeSourceInfo.
7149     if (NewTypeArg == TypeArg) {
7150       NewTypeArgInfos.push_back(TypeArgInfo);
7151       continue;
7152     }
7153 
7154     NewTypeArgInfos.push_back(
7155       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7156     AnyChanged = true;
7157   }
7158 
7159   QualType Result = TL.getType();
7160   if (getDerived().AlwaysRebuild() || AnyChanged) {
7161     // Rebuild the type.
7162     Result = getDerived().RebuildObjCObjectType(
7163         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7164         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7165         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7166         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7167 
7168     if (Result.isNull())
7169       return QualType();
7170   }
7171 
7172   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7173   NewT.setHasBaseTypeAsWritten(true);
7174   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7175   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7176     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7177   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7178   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7179   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7180     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7181   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7182   return Result;
7183 }
7184 
7185 template<typename Derived>
7186 QualType
7187 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7188                                                ObjCObjectPointerTypeLoc TL) {
7189   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7190   if (PointeeType.isNull())
7191     return QualType();
7192 
7193   QualType Result = TL.getType();
7194   if (getDerived().AlwaysRebuild() ||
7195       PointeeType != TL.getPointeeLoc().getType()) {
7196     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7197                                                        TL.getStarLoc());
7198     if (Result.isNull())
7199       return QualType();
7200   }
7201 
7202   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7203   NewT.setStarLoc(TL.getStarLoc());
7204   return Result;
7205 }
7206 
7207 //===----------------------------------------------------------------------===//
7208 // Statement transformation
7209 //===----------------------------------------------------------------------===//
7210 template<typename Derived>
7211 StmtResult
7212 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7213   return S;
7214 }
7215 
7216 template<typename Derived>
7217 StmtResult
7218 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7219   return getDerived().TransformCompoundStmt(S, false);
7220 }
7221 
7222 template<typename Derived>
7223 StmtResult
7224 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7225                                               bool IsStmtExpr) {
7226   Sema::CompoundScopeRAII CompoundScope(getSema());
7227 
7228   const Stmt *ExprResult = S->getStmtExprResult();
7229   bool SubStmtInvalid = false;
7230   bool SubStmtChanged = false;
7231   SmallVector<Stmt*, 8> Statements;
7232   for (auto *B : S->body()) {
7233     StmtResult Result = getDerived().TransformStmt(
7234         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7235 
7236     if (Result.isInvalid()) {
7237       // Immediately fail if this was a DeclStmt, since it's very
7238       // likely that this will cause problems for future statements.
7239       if (isa<DeclStmt>(B))
7240         return StmtError();
7241 
7242       // Otherwise, just keep processing substatements and fail later.
7243       SubStmtInvalid = true;
7244       continue;
7245     }
7246 
7247     SubStmtChanged = SubStmtChanged || Result.get() != B;
7248     Statements.push_back(Result.getAs<Stmt>());
7249   }
7250 
7251   if (SubStmtInvalid)
7252     return StmtError();
7253 
7254   if (!getDerived().AlwaysRebuild() &&
7255       !SubStmtChanged)
7256     return S;
7257 
7258   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7259                                           Statements,
7260                                           S->getRBracLoc(),
7261                                           IsStmtExpr);
7262 }
7263 
7264 template<typename Derived>
7265 StmtResult
7266 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7267   ExprResult LHS, RHS;
7268   {
7269     EnterExpressionEvaluationContext Unevaluated(
7270         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7271 
7272     // Transform the left-hand case value.
7273     LHS = getDerived().TransformExpr(S->getLHS());
7274     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7275     if (LHS.isInvalid())
7276       return StmtError();
7277 
7278     // Transform the right-hand case value (for the GNU case-range extension).
7279     RHS = getDerived().TransformExpr(S->getRHS());
7280     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7281     if (RHS.isInvalid())
7282       return StmtError();
7283   }
7284 
7285   // Build the case statement.
7286   // Case statements are always rebuilt so that they will attached to their
7287   // transformed switch statement.
7288   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7289                                                        LHS.get(),
7290                                                        S->getEllipsisLoc(),
7291                                                        RHS.get(),
7292                                                        S->getColonLoc());
7293   if (Case.isInvalid())
7294     return StmtError();
7295 
7296   // Transform the statement following the case
7297   StmtResult SubStmt =
7298       getDerived().TransformStmt(S->getSubStmt());
7299   if (SubStmt.isInvalid())
7300     return StmtError();
7301 
7302   // Attach the body to the case statement
7303   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7304 }
7305 
7306 template <typename Derived>
7307 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7308   // Transform the statement following the default case
7309   StmtResult SubStmt =
7310       getDerived().TransformStmt(S->getSubStmt());
7311   if (SubStmt.isInvalid())
7312     return StmtError();
7313 
7314   // Default statements are always rebuilt
7315   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7316                                          SubStmt.get());
7317 }
7318 
7319 template<typename Derived>
7320 StmtResult
7321 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7322   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7323   if (SubStmt.isInvalid())
7324     return StmtError();
7325 
7326   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7327                                         S->getDecl());
7328   if (!LD)
7329     return StmtError();
7330 
7331   // If we're transforming "in-place" (we're not creating new local
7332   // declarations), assume we're replacing the old label statement
7333   // and clear out the reference to it.
7334   if (LD == S->getDecl())
7335     S->getDecl()->setStmt(nullptr);
7336 
7337   // FIXME: Pass the real colon location in.
7338   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7339                                        cast<LabelDecl>(LD), SourceLocation(),
7340                                        SubStmt.get());
7341 }
7342 
7343 template <typename Derived>
7344 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7345   if (!R)
7346     return R;
7347 
7348   switch (R->getKind()) {
7349 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7350 #define ATTR(X)
7351 #define PRAGMA_SPELLING_ATTR(X)                                                \
7352   case attr::X:                                                                \
7353     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7354 #include "clang/Basic/AttrList.inc"
7355   default:
7356     return R;
7357   }
7358 }
7359 
7360 template <typename Derived>
7361 StmtResult
7362 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7363                                                 StmtDiscardKind SDK) {
7364   bool AttrsChanged = false;
7365   SmallVector<const Attr *, 1> Attrs;
7366 
7367   // Visit attributes and keep track if any are transformed.
7368   for (const auto *I : S->getAttrs()) {
7369     const Attr *R = getDerived().TransformAttr(I);
7370     AttrsChanged |= (I != R);
7371     if (R)
7372       Attrs.push_back(R);
7373   }
7374 
7375   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7376   if (SubStmt.isInvalid())
7377     return StmtError();
7378 
7379   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7380     return S;
7381 
7382   // If transforming the attributes failed for all of the attributes in the
7383   // statement, don't make an AttributedStmt without attributes.
7384   if (Attrs.empty())
7385     return SubStmt;
7386 
7387   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7388                                             SubStmt.get());
7389 }
7390 
7391 template<typename Derived>
7392 StmtResult
7393 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7394   // Transform the initialization statement
7395   StmtResult Init = getDerived().TransformStmt(S->getInit());
7396   if (Init.isInvalid())
7397     return StmtError();
7398 
7399   Sema::ConditionResult Cond;
7400   if (!S->isConsteval()) {
7401     // Transform the condition
7402     Cond = getDerived().TransformCondition(
7403         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7404         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7405                          : Sema::ConditionKind::Boolean);
7406     if (Cond.isInvalid())
7407       return StmtError();
7408   }
7409 
7410   // If this is a constexpr if, determine which arm we should instantiate.
7411   llvm::Optional<bool> ConstexprConditionValue;
7412   if (S->isConstexpr())
7413     ConstexprConditionValue = Cond.getKnownValue();
7414 
7415   // Transform the "then" branch.
7416   StmtResult Then;
7417   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7418     Then = getDerived().TransformStmt(S->getThen());
7419     if (Then.isInvalid())
7420       return StmtError();
7421   } else {
7422     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7423   }
7424 
7425   // Transform the "else" branch.
7426   StmtResult Else;
7427   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7428     Else = getDerived().TransformStmt(S->getElse());
7429     if (Else.isInvalid())
7430       return StmtError();
7431   }
7432 
7433   if (!getDerived().AlwaysRebuild() &&
7434       Init.get() == S->getInit() &&
7435       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7436       Then.get() == S->getThen() &&
7437       Else.get() == S->getElse())
7438     return S;
7439 
7440   return getDerived().RebuildIfStmt(
7441       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7442       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7443 }
7444 
7445 template<typename Derived>
7446 StmtResult
7447 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7448   // Transform the initialization statement
7449   StmtResult Init = getDerived().TransformStmt(S->getInit());
7450   if (Init.isInvalid())
7451     return StmtError();
7452 
7453   // Transform the condition.
7454   Sema::ConditionResult Cond = getDerived().TransformCondition(
7455       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7456       Sema::ConditionKind::Switch);
7457   if (Cond.isInvalid())
7458     return StmtError();
7459 
7460   // Rebuild the switch statement.
7461   StmtResult Switch =
7462       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7463                                           Init.get(), Cond, S->getRParenLoc());
7464   if (Switch.isInvalid())
7465     return StmtError();
7466 
7467   // Transform the body of the switch statement.
7468   StmtResult Body = getDerived().TransformStmt(S->getBody());
7469   if (Body.isInvalid())
7470     return StmtError();
7471 
7472   // Complete the switch statement.
7473   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7474                                             Body.get());
7475 }
7476 
7477 template<typename Derived>
7478 StmtResult
7479 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7480   // Transform the condition
7481   Sema::ConditionResult Cond = getDerived().TransformCondition(
7482       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7483       Sema::ConditionKind::Boolean);
7484   if (Cond.isInvalid())
7485     return StmtError();
7486 
7487   // Transform the body
7488   StmtResult Body = getDerived().TransformStmt(S->getBody());
7489   if (Body.isInvalid())
7490     return StmtError();
7491 
7492   if (!getDerived().AlwaysRebuild() &&
7493       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7494       Body.get() == S->getBody())
7495     return Owned(S);
7496 
7497   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7498                                        Cond, S->getRParenLoc(), Body.get());
7499 }
7500 
7501 template<typename Derived>
7502 StmtResult
7503 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7504   // Transform the body
7505   StmtResult Body = getDerived().TransformStmt(S->getBody());
7506   if (Body.isInvalid())
7507     return StmtError();
7508 
7509   // Transform the condition
7510   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7511   if (Cond.isInvalid())
7512     return StmtError();
7513 
7514   if (!getDerived().AlwaysRebuild() &&
7515       Cond.get() == S->getCond() &&
7516       Body.get() == S->getBody())
7517     return S;
7518 
7519   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7520                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7521                                     S->getRParenLoc());
7522 }
7523 
7524 template<typename Derived>
7525 StmtResult
7526 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7527   if (getSema().getLangOpts().OpenMP)
7528     getSema().startOpenMPLoop();
7529 
7530   // Transform the initialization statement
7531   StmtResult Init = getDerived().TransformStmt(S->getInit());
7532   if (Init.isInvalid())
7533     return StmtError();
7534 
7535   // In OpenMP loop region loop control variable must be captured and be
7536   // private. Perform analysis of first part (if any).
7537   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7538     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7539 
7540   // Transform the condition
7541   Sema::ConditionResult Cond = getDerived().TransformCondition(
7542       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7543       Sema::ConditionKind::Boolean);
7544   if (Cond.isInvalid())
7545     return StmtError();
7546 
7547   // Transform the increment
7548   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7549   if (Inc.isInvalid())
7550     return StmtError();
7551 
7552   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7553   if (S->getInc() && !FullInc.get())
7554     return StmtError();
7555 
7556   // Transform the body
7557   StmtResult Body = getDerived().TransformStmt(S->getBody());
7558   if (Body.isInvalid())
7559     return StmtError();
7560 
7561   if (!getDerived().AlwaysRebuild() &&
7562       Init.get() == S->getInit() &&
7563       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7564       Inc.get() == S->getInc() &&
7565       Body.get() == S->getBody())
7566     return S;
7567 
7568   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7569                                      Init.get(), Cond, FullInc,
7570                                      S->getRParenLoc(), Body.get());
7571 }
7572 
7573 template<typename Derived>
7574 StmtResult
7575 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7576   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7577                                         S->getLabel());
7578   if (!LD)
7579     return StmtError();
7580 
7581   // Goto statements must always be rebuilt, to resolve the label.
7582   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7583                                       cast<LabelDecl>(LD));
7584 }
7585 
7586 template<typename Derived>
7587 StmtResult
7588 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7589   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7590   if (Target.isInvalid())
7591     return StmtError();
7592   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7593 
7594   if (!getDerived().AlwaysRebuild() &&
7595       Target.get() == S->getTarget())
7596     return S;
7597 
7598   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7599                                               Target.get());
7600 }
7601 
7602 template<typename Derived>
7603 StmtResult
7604 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7605   return S;
7606 }
7607 
7608 template<typename Derived>
7609 StmtResult
7610 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7611   return S;
7612 }
7613 
7614 template<typename Derived>
7615 StmtResult
7616 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7617   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7618                                                         /*NotCopyInit*/false);
7619   if (Result.isInvalid())
7620     return StmtError();
7621 
7622   // FIXME: We always rebuild the return statement because there is no way
7623   // to tell whether the return type of the function has changed.
7624   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7625 }
7626 
7627 template<typename Derived>
7628 StmtResult
7629 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7630   bool DeclChanged = false;
7631   SmallVector<Decl *, 4> Decls;
7632   for (auto *D : S->decls()) {
7633     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7634     if (!Transformed)
7635       return StmtError();
7636 
7637     if (Transformed != D)
7638       DeclChanged = true;
7639 
7640     Decls.push_back(Transformed);
7641   }
7642 
7643   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7644     return S;
7645 
7646   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7647 }
7648 
7649 template<typename Derived>
7650 StmtResult
7651 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7652 
7653   SmallVector<Expr*, 8> Constraints;
7654   SmallVector<Expr*, 8> Exprs;
7655   SmallVector<IdentifierInfo *, 4> Names;
7656 
7657   ExprResult AsmString;
7658   SmallVector<Expr*, 8> Clobbers;
7659 
7660   bool ExprsChanged = false;
7661 
7662   // Go through the outputs.
7663   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7664     Names.push_back(S->getOutputIdentifier(I));
7665 
7666     // No need to transform the constraint literal.
7667     Constraints.push_back(S->getOutputConstraintLiteral(I));
7668 
7669     // Transform the output expr.
7670     Expr *OutputExpr = S->getOutputExpr(I);
7671     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7672     if (Result.isInvalid())
7673       return StmtError();
7674 
7675     ExprsChanged |= Result.get() != OutputExpr;
7676 
7677     Exprs.push_back(Result.get());
7678   }
7679 
7680   // Go through the inputs.
7681   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7682     Names.push_back(S->getInputIdentifier(I));
7683 
7684     // No need to transform the constraint literal.
7685     Constraints.push_back(S->getInputConstraintLiteral(I));
7686 
7687     // Transform the input expr.
7688     Expr *InputExpr = S->getInputExpr(I);
7689     ExprResult Result = getDerived().TransformExpr(InputExpr);
7690     if (Result.isInvalid())
7691       return StmtError();
7692 
7693     ExprsChanged |= Result.get() != InputExpr;
7694 
7695     Exprs.push_back(Result.get());
7696   }
7697 
7698   // Go through the Labels.
7699   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7700     Names.push_back(S->getLabelIdentifier(I));
7701 
7702     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7703     if (Result.isInvalid())
7704       return StmtError();
7705     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7706     Exprs.push_back(Result.get());
7707   }
7708   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7709     return S;
7710 
7711   // Go through the clobbers.
7712   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7713     Clobbers.push_back(S->getClobberStringLiteral(I));
7714 
7715   // No need to transform the asm string literal.
7716   AsmString = S->getAsmString();
7717   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7718                                         S->isVolatile(), S->getNumOutputs(),
7719                                         S->getNumInputs(), Names.data(),
7720                                         Constraints, Exprs, AsmString.get(),
7721                                         Clobbers, S->getNumLabels(),
7722                                         S->getRParenLoc());
7723 }
7724 
7725 template<typename Derived>
7726 StmtResult
7727 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7728   ArrayRef<Token> AsmToks =
7729     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7730 
7731   bool HadError = false, HadChange = false;
7732 
7733   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7734   SmallVector<Expr*, 8> TransformedExprs;
7735   TransformedExprs.reserve(SrcExprs.size());
7736   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7737     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7738     if (!Result.isUsable()) {
7739       HadError = true;
7740     } else {
7741       HadChange |= (Result.get() != SrcExprs[i]);
7742       TransformedExprs.push_back(Result.get());
7743     }
7744   }
7745 
7746   if (HadError) return StmtError();
7747   if (!HadChange && !getDerived().AlwaysRebuild())
7748     return Owned(S);
7749 
7750   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7751                                        AsmToks, S->getAsmString(),
7752                                        S->getNumOutputs(), S->getNumInputs(),
7753                                        S->getAllConstraints(), S->getClobbers(),
7754                                        TransformedExprs, S->getEndLoc());
7755 }
7756 
7757 // C++ Coroutines TS
7758 
7759 template<typename Derived>
7760 StmtResult
7761 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7762   auto *ScopeInfo = SemaRef.getCurFunction();
7763   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7764   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7765          ScopeInfo->NeedsCoroutineSuspends &&
7766          ScopeInfo->CoroutineSuspends.first == nullptr &&
7767          ScopeInfo->CoroutineSuspends.second == nullptr &&
7768          "expected clean scope info");
7769 
7770   // Set that we have (possibly-invalid) suspend points before we do anything
7771   // that may fail.
7772   ScopeInfo->setNeedsCoroutineSuspends(false);
7773 
7774   // We re-build the coroutine promise object (and the coroutine parameters its
7775   // type and constructor depend on) based on the types used in our current
7776   // function. We must do so, and set it on the current FunctionScopeInfo,
7777   // before attempting to transform the other parts of the coroutine body
7778   // statement, such as the implicit suspend statements (because those
7779   // statements reference the FunctionScopeInfo::CoroutinePromise).
7780   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7781     return StmtError();
7782   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7783   if (!Promise)
7784     return StmtError();
7785   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7786   ScopeInfo->CoroutinePromise = Promise;
7787 
7788   // Transform the implicit coroutine statements constructed using dependent
7789   // types during the previous parse: initial and final suspensions, the return
7790   // object, and others. We also transform the coroutine function's body.
7791   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7792   if (InitSuspend.isInvalid())
7793     return StmtError();
7794   StmtResult FinalSuspend =
7795       getDerived().TransformStmt(S->getFinalSuspendStmt());
7796   if (FinalSuspend.isInvalid() ||
7797       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7798     return StmtError();
7799   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7800   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7801 
7802   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7803   if (BodyRes.isInvalid())
7804     return StmtError();
7805 
7806   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7807   if (Builder.isInvalid())
7808     return StmtError();
7809 
7810   Expr *ReturnObject = S->getReturnValueInit();
7811   assert(ReturnObject && "the return object is expected to be valid");
7812   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7813                                                      /*NoCopyInit*/ false);
7814   if (Res.isInvalid())
7815     return StmtError();
7816   Builder.ReturnValue = Res.get();
7817 
7818   // If during the previous parse the coroutine still had a dependent promise
7819   // statement, we may need to build some implicit coroutine statements
7820   // (such as exception and fallthrough handlers) for the first time.
7821   if (S->hasDependentPromiseType()) {
7822     // We can only build these statements, however, if the current promise type
7823     // is not dependent.
7824     if (!Promise->getType()->isDependentType()) {
7825       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7826              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7827              "these nodes should not have been built yet");
7828       if (!Builder.buildDependentStatements())
7829         return StmtError();
7830     }
7831   } else {
7832     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7833       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7834       if (Res.isInvalid())
7835         return StmtError();
7836       Builder.OnFallthrough = Res.get();
7837     }
7838 
7839     if (auto *OnException = S->getExceptionHandler()) {
7840       StmtResult Res = getDerived().TransformStmt(OnException);
7841       if (Res.isInvalid())
7842         return StmtError();
7843       Builder.OnException = Res.get();
7844     }
7845 
7846     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7847       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7848       if (Res.isInvalid())
7849         return StmtError();
7850       Builder.ReturnStmtOnAllocFailure = Res.get();
7851     }
7852 
7853     // Transform any additional statements we may have already built
7854     assert(S->getAllocate() && S->getDeallocate() &&
7855            "allocation and deallocation calls must already be built");
7856     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7857     if (AllocRes.isInvalid())
7858       return StmtError();
7859     Builder.Allocate = AllocRes.get();
7860 
7861     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7862     if (DeallocRes.isInvalid())
7863       return StmtError();
7864     Builder.Deallocate = DeallocRes.get();
7865 
7866     assert(S->getResultDecl() && "ResultDecl must already be built");
7867     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7868     if (ResultDecl.isInvalid())
7869       return StmtError();
7870     Builder.ResultDecl = ResultDecl.get();
7871 
7872     if (auto *ReturnStmt = S->getReturnStmt()) {
7873       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7874       if (Res.isInvalid())
7875         return StmtError();
7876       Builder.ReturnStmt = Res.get();
7877     }
7878   }
7879 
7880   return getDerived().RebuildCoroutineBodyStmt(Builder);
7881 }
7882 
7883 template<typename Derived>
7884 StmtResult
7885 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7886   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7887                                                         /*NotCopyInit*/false);
7888   if (Result.isInvalid())
7889     return StmtError();
7890 
7891   // Always rebuild; we don't know if this needs to be injected into a new
7892   // context or if the promise type has changed.
7893   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7894                                           S->isImplicit());
7895 }
7896 
7897 template<typename Derived>
7898 ExprResult
7899 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7900   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7901                                                         /*NotCopyInit*/false);
7902   if (Result.isInvalid())
7903     return ExprError();
7904 
7905   // Always rebuild; we don't know if this needs to be injected into a new
7906   // context or if the promise type has changed.
7907   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7908                                          E->isImplicit());
7909 }
7910 
7911 template <typename Derived>
7912 ExprResult
7913 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7914   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7915                                                         /*NotCopyInit*/ false);
7916   if (OperandResult.isInvalid())
7917     return ExprError();
7918 
7919   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7920           E->getOperatorCoawaitLookup());
7921 
7922   if (LookupResult.isInvalid())
7923     return ExprError();
7924 
7925   // Always rebuild; we don't know if this needs to be injected into a new
7926   // context or if the promise type has changed.
7927   return getDerived().RebuildDependentCoawaitExpr(
7928       E->getKeywordLoc(), OperandResult.get(),
7929       cast<UnresolvedLookupExpr>(LookupResult.get()));
7930 }
7931 
7932 template<typename Derived>
7933 ExprResult
7934 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7935   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7936                                                         /*NotCopyInit*/false);
7937   if (Result.isInvalid())
7938     return ExprError();
7939 
7940   // Always rebuild; we don't know if this needs to be injected into a new
7941   // context or if the promise type has changed.
7942   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7943 }
7944 
7945 // Objective-C Statements.
7946 
7947 template<typename Derived>
7948 StmtResult
7949 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7950   // Transform the body of the @try.
7951   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7952   if (TryBody.isInvalid())
7953     return StmtError();
7954 
7955   // Transform the @catch statements (if present).
7956   bool AnyCatchChanged = false;
7957   SmallVector<Stmt*, 8> CatchStmts;
7958   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7959     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7960     if (Catch.isInvalid())
7961       return StmtError();
7962     if (Catch.get() != S->getCatchStmt(I))
7963       AnyCatchChanged = true;
7964     CatchStmts.push_back(Catch.get());
7965   }
7966 
7967   // Transform the @finally statement (if present).
7968   StmtResult Finally;
7969   if (S->getFinallyStmt()) {
7970     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7971     if (Finally.isInvalid())
7972       return StmtError();
7973   }
7974 
7975   // If nothing changed, just retain this statement.
7976   if (!getDerived().AlwaysRebuild() &&
7977       TryBody.get() == S->getTryBody() &&
7978       !AnyCatchChanged &&
7979       Finally.get() == S->getFinallyStmt())
7980     return S;
7981 
7982   // Build a new statement.
7983   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7984                                            CatchStmts, Finally.get());
7985 }
7986 
7987 template<typename Derived>
7988 StmtResult
7989 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7990   // Transform the @catch parameter, if there is one.
7991   VarDecl *Var = nullptr;
7992   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7993     TypeSourceInfo *TSInfo = nullptr;
7994     if (FromVar->getTypeSourceInfo()) {
7995       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7996       if (!TSInfo)
7997         return StmtError();
7998     }
7999 
8000     QualType T;
8001     if (TSInfo)
8002       T = TSInfo->getType();
8003     else {
8004       T = getDerived().TransformType(FromVar->getType());
8005       if (T.isNull())
8006         return StmtError();
8007     }
8008 
8009     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8010     if (!Var)
8011       return StmtError();
8012   }
8013 
8014   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8015   if (Body.isInvalid())
8016     return StmtError();
8017 
8018   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8019                                              S->getRParenLoc(),
8020                                              Var, Body.get());
8021 }
8022 
8023 template<typename Derived>
8024 StmtResult
8025 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8026   // Transform the body.
8027   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8028   if (Body.isInvalid())
8029     return StmtError();
8030 
8031   // If nothing changed, just retain this statement.
8032   if (!getDerived().AlwaysRebuild() &&
8033       Body.get() == S->getFinallyBody())
8034     return S;
8035 
8036   // Build a new statement.
8037   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8038                                                Body.get());
8039 }
8040 
8041 template<typename Derived>
8042 StmtResult
8043 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8044   ExprResult Operand;
8045   if (S->getThrowExpr()) {
8046     Operand = getDerived().TransformExpr(S->getThrowExpr());
8047     if (Operand.isInvalid())
8048       return StmtError();
8049   }
8050 
8051   if (!getDerived().AlwaysRebuild() &&
8052       Operand.get() == S->getThrowExpr())
8053     return S;
8054 
8055   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8056 }
8057 
8058 template<typename Derived>
8059 StmtResult
8060 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8061                                                   ObjCAtSynchronizedStmt *S) {
8062   // Transform the object we are locking.
8063   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8064   if (Object.isInvalid())
8065     return StmtError();
8066   Object =
8067     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8068                                                   Object.get());
8069   if (Object.isInvalid())
8070     return StmtError();
8071 
8072   // Transform the body.
8073   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8074   if (Body.isInvalid())
8075     return StmtError();
8076 
8077   // If nothing change, just retain the current statement.
8078   if (!getDerived().AlwaysRebuild() &&
8079       Object.get() == S->getSynchExpr() &&
8080       Body.get() == S->getSynchBody())
8081     return S;
8082 
8083   // Build a new statement.
8084   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8085                                                     Object.get(), Body.get());
8086 }
8087 
8088 template<typename Derived>
8089 StmtResult
8090 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8091                                               ObjCAutoreleasePoolStmt *S) {
8092   // Transform the body.
8093   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8094   if (Body.isInvalid())
8095     return StmtError();
8096 
8097   // If nothing changed, just retain this statement.
8098   if (!getDerived().AlwaysRebuild() &&
8099       Body.get() == S->getSubStmt())
8100     return S;
8101 
8102   // Build a new statement.
8103   return getDerived().RebuildObjCAutoreleasePoolStmt(
8104                         S->getAtLoc(), Body.get());
8105 }
8106 
8107 template<typename Derived>
8108 StmtResult
8109 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8110                                                   ObjCForCollectionStmt *S) {
8111   // Transform the element statement.
8112   StmtResult Element =
8113       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8114   if (Element.isInvalid())
8115     return StmtError();
8116 
8117   // Transform the collection expression.
8118   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8119   if (Collection.isInvalid())
8120     return StmtError();
8121 
8122   // Transform the body.
8123   StmtResult Body = getDerived().TransformStmt(S->getBody());
8124   if (Body.isInvalid())
8125     return StmtError();
8126 
8127   // If nothing changed, just retain this statement.
8128   if (!getDerived().AlwaysRebuild() &&
8129       Element.get() == S->getElement() &&
8130       Collection.get() == S->getCollection() &&
8131       Body.get() == S->getBody())
8132     return S;
8133 
8134   // Build a new statement.
8135   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8136                                                    Element.get(),
8137                                                    Collection.get(),
8138                                                    S->getRParenLoc(),
8139                                                    Body.get());
8140 }
8141 
8142 template <typename Derived>
8143 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8144   // Transform the exception declaration, if any.
8145   VarDecl *Var = nullptr;
8146   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8147     TypeSourceInfo *T =
8148         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8149     if (!T)
8150       return StmtError();
8151 
8152     Var = getDerived().RebuildExceptionDecl(
8153         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8154         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8155     if (!Var || Var->isInvalidDecl())
8156       return StmtError();
8157   }
8158 
8159   // Transform the actual exception handler.
8160   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8161   if (Handler.isInvalid())
8162     return StmtError();
8163 
8164   if (!getDerived().AlwaysRebuild() && !Var &&
8165       Handler.get() == S->getHandlerBlock())
8166     return S;
8167 
8168   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8169 }
8170 
8171 template <typename Derived>
8172 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8173   // Transform the try block itself.
8174   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8175   if (TryBlock.isInvalid())
8176     return StmtError();
8177 
8178   // Transform the handlers.
8179   bool HandlerChanged = false;
8180   SmallVector<Stmt *, 8> Handlers;
8181   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8182     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8183     if (Handler.isInvalid())
8184       return StmtError();
8185 
8186     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8187     Handlers.push_back(Handler.getAs<Stmt>());
8188   }
8189 
8190   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8191       !HandlerChanged)
8192     return S;
8193 
8194   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8195                                         Handlers);
8196 }
8197 
8198 template<typename Derived>
8199 StmtResult
8200 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8201   StmtResult Init =
8202       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8203   if (Init.isInvalid())
8204     return StmtError();
8205 
8206   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8207   if (Range.isInvalid())
8208     return StmtError();
8209 
8210   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8211   if (Begin.isInvalid())
8212     return StmtError();
8213   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8214   if (End.isInvalid())
8215     return StmtError();
8216 
8217   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8218   if (Cond.isInvalid())
8219     return StmtError();
8220   if (Cond.get())
8221     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8222   if (Cond.isInvalid())
8223     return StmtError();
8224   if (Cond.get())
8225     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8226 
8227   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8228   if (Inc.isInvalid())
8229     return StmtError();
8230   if (Inc.get())
8231     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8232 
8233   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8234   if (LoopVar.isInvalid())
8235     return StmtError();
8236 
8237   StmtResult NewStmt = S;
8238   if (getDerived().AlwaysRebuild() ||
8239       Init.get() != S->getInit() ||
8240       Range.get() != S->getRangeStmt() ||
8241       Begin.get() != S->getBeginStmt() ||
8242       End.get() != S->getEndStmt() ||
8243       Cond.get() != S->getCond() ||
8244       Inc.get() != S->getInc() ||
8245       LoopVar.get() != S->getLoopVarStmt()) {
8246     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8247                                                   S->getCoawaitLoc(), Init.get(),
8248                                                   S->getColonLoc(), Range.get(),
8249                                                   Begin.get(), End.get(),
8250                                                   Cond.get(),
8251                                                   Inc.get(), LoopVar.get(),
8252                                                   S->getRParenLoc());
8253     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8254       // Might not have attached any initializer to the loop variable.
8255       getSema().ActOnInitializerError(
8256           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8257       return StmtError();
8258     }
8259   }
8260 
8261   StmtResult Body = getDerived().TransformStmt(S->getBody());
8262   if (Body.isInvalid())
8263     return StmtError();
8264 
8265   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8266   // it now so we have a new statement to attach the body to.
8267   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8268     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8269                                                   S->getCoawaitLoc(), Init.get(),
8270                                                   S->getColonLoc(), Range.get(),
8271                                                   Begin.get(), End.get(),
8272                                                   Cond.get(),
8273                                                   Inc.get(), LoopVar.get(),
8274                                                   S->getRParenLoc());
8275     if (NewStmt.isInvalid())
8276       return StmtError();
8277   }
8278 
8279   if (NewStmt.get() == S)
8280     return S;
8281 
8282   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8283 }
8284 
8285 template<typename Derived>
8286 StmtResult
8287 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8288                                                     MSDependentExistsStmt *S) {
8289   // Transform the nested-name-specifier, if any.
8290   NestedNameSpecifierLoc QualifierLoc;
8291   if (S->getQualifierLoc()) {
8292     QualifierLoc
8293       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8294     if (!QualifierLoc)
8295       return StmtError();
8296   }
8297 
8298   // Transform the declaration name.
8299   DeclarationNameInfo NameInfo = S->getNameInfo();
8300   if (NameInfo.getName()) {
8301     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8302     if (!NameInfo.getName())
8303       return StmtError();
8304   }
8305 
8306   // Check whether anything changed.
8307   if (!getDerived().AlwaysRebuild() &&
8308       QualifierLoc == S->getQualifierLoc() &&
8309       NameInfo.getName() == S->getNameInfo().getName())
8310     return S;
8311 
8312   // Determine whether this name exists, if we can.
8313   CXXScopeSpec SS;
8314   SS.Adopt(QualifierLoc);
8315   bool Dependent = false;
8316   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8317   case Sema::IER_Exists:
8318     if (S->isIfExists())
8319       break;
8320 
8321     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8322 
8323   case Sema::IER_DoesNotExist:
8324     if (S->isIfNotExists())
8325       break;
8326 
8327     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8328 
8329   case Sema::IER_Dependent:
8330     Dependent = true;
8331     break;
8332 
8333   case Sema::IER_Error:
8334     return StmtError();
8335   }
8336 
8337   // We need to continue with the instantiation, so do so now.
8338   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8339   if (SubStmt.isInvalid())
8340     return StmtError();
8341 
8342   // If we have resolved the name, just transform to the substatement.
8343   if (!Dependent)
8344     return SubStmt;
8345 
8346   // The name is still dependent, so build a dependent expression again.
8347   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8348                                                    S->isIfExists(),
8349                                                    QualifierLoc,
8350                                                    NameInfo,
8351                                                    SubStmt.get());
8352 }
8353 
8354 template<typename Derived>
8355 ExprResult
8356 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8357   NestedNameSpecifierLoc QualifierLoc;
8358   if (E->getQualifierLoc()) {
8359     QualifierLoc
8360     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8361     if (!QualifierLoc)
8362       return ExprError();
8363   }
8364 
8365   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8366     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8367   if (!PD)
8368     return ExprError();
8369 
8370   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8371   if (Base.isInvalid())
8372     return ExprError();
8373 
8374   return new (SemaRef.getASTContext())
8375       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8376                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8377                         QualifierLoc, E->getMemberLoc());
8378 }
8379 
8380 template <typename Derived>
8381 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8382     MSPropertySubscriptExpr *E) {
8383   auto BaseRes = getDerived().TransformExpr(E->getBase());
8384   if (BaseRes.isInvalid())
8385     return ExprError();
8386   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8387   if (IdxRes.isInvalid())
8388     return ExprError();
8389 
8390   if (!getDerived().AlwaysRebuild() &&
8391       BaseRes.get() == E->getBase() &&
8392       IdxRes.get() == E->getIdx())
8393     return E;
8394 
8395   return getDerived().RebuildArraySubscriptExpr(
8396       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8397 }
8398 
8399 template <typename Derived>
8400 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8401   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8402   if (TryBlock.isInvalid())
8403     return StmtError();
8404 
8405   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8406   if (Handler.isInvalid())
8407     return StmtError();
8408 
8409   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8410       Handler.get() == S->getHandler())
8411     return S;
8412 
8413   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8414                                         TryBlock.get(), Handler.get());
8415 }
8416 
8417 template <typename Derived>
8418 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8419   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8420   if (Block.isInvalid())
8421     return StmtError();
8422 
8423   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8424 }
8425 
8426 template <typename Derived>
8427 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8428   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8429   if (FilterExpr.isInvalid())
8430     return StmtError();
8431 
8432   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8433   if (Block.isInvalid())
8434     return StmtError();
8435 
8436   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8437                                            Block.get());
8438 }
8439 
8440 template <typename Derived>
8441 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8442   if (isa<SEHFinallyStmt>(Handler))
8443     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8444   else
8445     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8446 }
8447 
8448 template<typename Derived>
8449 StmtResult
8450 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8451   return S;
8452 }
8453 
8454 //===----------------------------------------------------------------------===//
8455 // OpenMP directive transformation
8456 //===----------------------------------------------------------------------===//
8457 
8458 template <typename Derived>
8459 StmtResult
8460 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8461   // OMPCanonicalLoops are eliminated during transformation, since they will be
8462   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8463   // after transformation.
8464   return getDerived().TransformStmt(L->getLoopStmt());
8465 }
8466 
8467 template <typename Derived>
8468 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8469     OMPExecutableDirective *D) {
8470 
8471   // Transform the clauses
8472   llvm::SmallVector<OMPClause *, 16> TClauses;
8473   ArrayRef<OMPClause *> Clauses = D->clauses();
8474   TClauses.reserve(Clauses.size());
8475   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8476        I != E; ++I) {
8477     if (*I) {
8478       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8479       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8480       getDerived().getSema().EndOpenMPClause();
8481       if (Clause)
8482         TClauses.push_back(Clause);
8483     } else {
8484       TClauses.push_back(nullptr);
8485     }
8486   }
8487   StmtResult AssociatedStmt;
8488   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8489     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8490                                                   /*CurScope=*/nullptr);
8491     StmtResult Body;
8492     {
8493       Sema::CompoundScopeRAII CompoundScope(getSema());
8494       Stmt *CS;
8495       if (D->getDirectiveKind() == OMPD_atomic ||
8496           D->getDirectiveKind() == OMPD_critical ||
8497           D->getDirectiveKind() == OMPD_section ||
8498           D->getDirectiveKind() == OMPD_master)
8499         CS = D->getAssociatedStmt();
8500       else
8501         CS = D->getRawStmt();
8502       Body = getDerived().TransformStmt(CS);
8503       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8504           getSema().getLangOpts().OpenMPIRBuilder)
8505         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8506     }
8507     AssociatedStmt =
8508         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8509     if (AssociatedStmt.isInvalid()) {
8510       return StmtError();
8511     }
8512   }
8513   if (TClauses.size() != Clauses.size()) {
8514     return StmtError();
8515   }
8516 
8517   // Transform directive name for 'omp critical' directive.
8518   DeclarationNameInfo DirName;
8519   if (D->getDirectiveKind() == OMPD_critical) {
8520     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8521     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8522   }
8523   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8524   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8525     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8526   } else if (D->getDirectiveKind() == OMPD_cancel) {
8527     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8528   }
8529 
8530   return getDerived().RebuildOMPExecutableDirective(
8531       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8532       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8533 }
8534 
8535 template <typename Derived>
8536 StmtResult
8537 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8538   // TODO: Fix This
8539   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8540       << getOpenMPDirectiveName(D->getDirectiveKind());
8541   return StmtError();
8542 }
8543 
8544 template <typename Derived>
8545 StmtResult
8546 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8547   DeclarationNameInfo DirName;
8548   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8549                                              D->getBeginLoc());
8550   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8551   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8552   return Res;
8553 }
8554 
8555 template <typename Derived>
8556 StmtResult
8557 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8558   DeclarationNameInfo DirName;
8559   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8560                                              D->getBeginLoc());
8561   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8562   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8563   return Res;
8564 }
8565 
8566 template <typename Derived>
8567 StmtResult
8568 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8569   DeclarationNameInfo DirName;
8570   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8571                                              nullptr, D->getBeginLoc());
8572   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8573   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8574   return Res;
8575 }
8576 
8577 template <typename Derived>
8578 StmtResult
8579 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8580   DeclarationNameInfo DirName;
8581   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8582                                              nullptr, D->getBeginLoc());
8583   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8584   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8585   return Res;
8586 }
8587 
8588 template <typename Derived>
8589 StmtResult
8590 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8591   DeclarationNameInfo DirName;
8592   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8593                                              D->getBeginLoc());
8594   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8595   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8596   return Res;
8597 }
8598 
8599 template <typename Derived>
8600 StmtResult
8601 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8602   DeclarationNameInfo DirName;
8603   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8604                                              D->getBeginLoc());
8605   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8606   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8607   return Res;
8608 }
8609 
8610 template <typename Derived>
8611 StmtResult
8612 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8613   DeclarationNameInfo DirName;
8614   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8615                                              D->getBeginLoc());
8616   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8617   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8618   return Res;
8619 }
8620 
8621 template <typename Derived>
8622 StmtResult
8623 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8624   DeclarationNameInfo DirName;
8625   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8626                                              D->getBeginLoc());
8627   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8628   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8629   return Res;
8630 }
8631 
8632 template <typename Derived>
8633 StmtResult
8634 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8635   DeclarationNameInfo DirName;
8636   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8637                                              D->getBeginLoc());
8638   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8639   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8640   return Res;
8641 }
8642 
8643 template <typename Derived>
8644 StmtResult
8645 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8646   DeclarationNameInfo DirName;
8647   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8648                                              D->getBeginLoc());
8649   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8650   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8651   return Res;
8652 }
8653 
8654 template <typename Derived>
8655 StmtResult
8656 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8657   getDerived().getSema().StartOpenMPDSABlock(
8658       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8659   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8660   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8661   return Res;
8662 }
8663 
8664 template <typename Derived>
8665 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8666     OMPParallelForDirective *D) {
8667   DeclarationNameInfo DirName;
8668   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8669                                              nullptr, D->getBeginLoc());
8670   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8671   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8672   return Res;
8673 }
8674 
8675 template <typename Derived>
8676 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8677     OMPParallelForSimdDirective *D) {
8678   DeclarationNameInfo DirName;
8679   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8680                                              nullptr, D->getBeginLoc());
8681   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8682   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8683   return Res;
8684 }
8685 
8686 template <typename Derived>
8687 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8688     OMPParallelMasterDirective *D) {
8689   DeclarationNameInfo DirName;
8690   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8691                                              nullptr, D->getBeginLoc());
8692   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8693   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8694   return Res;
8695 }
8696 
8697 template <typename Derived>
8698 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8699     OMPParallelSectionsDirective *D) {
8700   DeclarationNameInfo DirName;
8701   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8702                                              nullptr, D->getBeginLoc());
8703   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8704   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8705   return Res;
8706 }
8707 
8708 template <typename Derived>
8709 StmtResult
8710 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8711   DeclarationNameInfo DirName;
8712   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8713                                              D->getBeginLoc());
8714   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8715   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8716   return Res;
8717 }
8718 
8719 template <typename Derived>
8720 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8721     OMPTaskyieldDirective *D) {
8722   DeclarationNameInfo DirName;
8723   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8724                                              D->getBeginLoc());
8725   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8726   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8727   return Res;
8728 }
8729 
8730 template <typename Derived>
8731 StmtResult
8732 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8733   DeclarationNameInfo DirName;
8734   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8735                                              D->getBeginLoc());
8736   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8737   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8738   return Res;
8739 }
8740 
8741 template <typename Derived>
8742 StmtResult
8743 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8744   DeclarationNameInfo DirName;
8745   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8746                                              D->getBeginLoc());
8747   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8748   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8749   return Res;
8750 }
8751 
8752 template <typename Derived>
8753 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8754     OMPTaskgroupDirective *D) {
8755   DeclarationNameInfo DirName;
8756   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8757                                              D->getBeginLoc());
8758   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8759   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8760   return Res;
8761 }
8762 
8763 template <typename Derived>
8764 StmtResult
8765 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8766   DeclarationNameInfo DirName;
8767   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8768                                              D->getBeginLoc());
8769   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8770   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8771   return Res;
8772 }
8773 
8774 template <typename Derived>
8775 StmtResult
8776 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8777   DeclarationNameInfo DirName;
8778   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8779                                              D->getBeginLoc());
8780   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8781   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8782   return Res;
8783 }
8784 
8785 template <typename Derived>
8786 StmtResult
8787 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8788   DeclarationNameInfo DirName;
8789   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8790                                              D->getBeginLoc());
8791   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8792   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8793   return Res;
8794 }
8795 
8796 template <typename Derived>
8797 StmtResult
8798 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8799   DeclarationNameInfo DirName;
8800   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8801                                              D->getBeginLoc());
8802   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8803   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8804   return Res;
8805 }
8806 
8807 template <typename Derived>
8808 StmtResult
8809 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8810   DeclarationNameInfo DirName;
8811   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8812                                              D->getBeginLoc());
8813   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8814   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8815   return Res;
8816 }
8817 
8818 template <typename Derived>
8819 StmtResult
8820 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8821   DeclarationNameInfo DirName;
8822   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8823                                              D->getBeginLoc());
8824   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8825   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8826   return Res;
8827 }
8828 
8829 template <typename Derived>
8830 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8831     OMPTargetDataDirective *D) {
8832   DeclarationNameInfo DirName;
8833   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8834                                              D->getBeginLoc());
8835   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8836   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8837   return Res;
8838 }
8839 
8840 template <typename Derived>
8841 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8842     OMPTargetEnterDataDirective *D) {
8843   DeclarationNameInfo DirName;
8844   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8845                                              nullptr, D->getBeginLoc());
8846   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8847   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8848   return Res;
8849 }
8850 
8851 template <typename Derived>
8852 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8853     OMPTargetExitDataDirective *D) {
8854   DeclarationNameInfo DirName;
8855   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8856                                              nullptr, D->getBeginLoc());
8857   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8858   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8859   return Res;
8860 }
8861 
8862 template <typename Derived>
8863 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8864     OMPTargetParallelDirective *D) {
8865   DeclarationNameInfo DirName;
8866   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8867                                              nullptr, D->getBeginLoc());
8868   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8869   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8870   return Res;
8871 }
8872 
8873 template <typename Derived>
8874 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8875     OMPTargetParallelForDirective *D) {
8876   DeclarationNameInfo DirName;
8877   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8878                                              nullptr, D->getBeginLoc());
8879   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8880   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8881   return Res;
8882 }
8883 
8884 template <typename Derived>
8885 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8886     OMPTargetUpdateDirective *D) {
8887   DeclarationNameInfo DirName;
8888   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8889                                              nullptr, D->getBeginLoc());
8890   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8891   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8892   return Res;
8893 }
8894 
8895 template <typename Derived>
8896 StmtResult
8897 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8898   DeclarationNameInfo DirName;
8899   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8900                                              D->getBeginLoc());
8901   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8902   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8903   return Res;
8904 }
8905 
8906 template <typename Derived>
8907 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8908     OMPCancellationPointDirective *D) {
8909   DeclarationNameInfo DirName;
8910   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8911                                              nullptr, D->getBeginLoc());
8912   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8913   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8914   return Res;
8915 }
8916 
8917 template <typename Derived>
8918 StmtResult
8919 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8920   DeclarationNameInfo DirName;
8921   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8922                                              D->getBeginLoc());
8923   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8924   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8925   return Res;
8926 }
8927 
8928 template <typename Derived>
8929 StmtResult
8930 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8931   DeclarationNameInfo DirName;
8932   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8933                                              D->getBeginLoc());
8934   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8935   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8936   return Res;
8937 }
8938 
8939 template <typename Derived>
8940 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8941     OMPTaskLoopSimdDirective *D) {
8942   DeclarationNameInfo DirName;
8943   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8944                                              nullptr, D->getBeginLoc());
8945   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8946   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8947   return Res;
8948 }
8949 
8950 template <typename Derived>
8951 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8952     OMPMasterTaskLoopDirective *D) {
8953   DeclarationNameInfo DirName;
8954   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8955                                              nullptr, D->getBeginLoc());
8956   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8957   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8958   return Res;
8959 }
8960 
8961 template <typename Derived>
8962 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8963     OMPMasterTaskLoopSimdDirective *D) {
8964   DeclarationNameInfo DirName;
8965   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8966                                              nullptr, D->getBeginLoc());
8967   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8968   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8969   return Res;
8970 }
8971 
8972 template <typename Derived>
8973 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8974     OMPParallelMasterTaskLoopDirective *D) {
8975   DeclarationNameInfo DirName;
8976   getDerived().getSema().StartOpenMPDSABlock(
8977       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8978   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8979   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8980   return Res;
8981 }
8982 
8983 template <typename Derived>
8984 StmtResult
8985 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8986     OMPParallelMasterTaskLoopSimdDirective *D) {
8987   DeclarationNameInfo DirName;
8988   getDerived().getSema().StartOpenMPDSABlock(
8989       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8990   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8991   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8992   return Res;
8993 }
8994 
8995 template <typename Derived>
8996 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8997     OMPDistributeDirective *D) {
8998   DeclarationNameInfo DirName;
8999   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9000                                              D->getBeginLoc());
9001   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9002   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9003   return Res;
9004 }
9005 
9006 template <typename Derived>
9007 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9008     OMPDistributeParallelForDirective *D) {
9009   DeclarationNameInfo DirName;
9010   getDerived().getSema().StartOpenMPDSABlock(
9011       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9012   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9013   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9014   return Res;
9015 }
9016 
9017 template <typename Derived>
9018 StmtResult
9019 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9020     OMPDistributeParallelForSimdDirective *D) {
9021   DeclarationNameInfo DirName;
9022   getDerived().getSema().StartOpenMPDSABlock(
9023       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9024   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9025   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9026   return Res;
9027 }
9028 
9029 template <typename Derived>
9030 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9031     OMPDistributeSimdDirective *D) {
9032   DeclarationNameInfo DirName;
9033   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9034                                              nullptr, D->getBeginLoc());
9035   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9036   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9037   return Res;
9038 }
9039 
9040 template <typename Derived>
9041 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9042     OMPTargetParallelForSimdDirective *D) {
9043   DeclarationNameInfo DirName;
9044   getDerived().getSema().StartOpenMPDSABlock(
9045       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9046   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9047   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9048   return Res;
9049 }
9050 
9051 template <typename Derived>
9052 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9053     OMPTargetSimdDirective *D) {
9054   DeclarationNameInfo DirName;
9055   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9056                                              D->getBeginLoc());
9057   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9058   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9059   return Res;
9060 }
9061 
9062 template <typename Derived>
9063 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9064     OMPTeamsDistributeDirective *D) {
9065   DeclarationNameInfo DirName;
9066   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9067                                              nullptr, D->getBeginLoc());
9068   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9069   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9070   return Res;
9071 }
9072 
9073 template <typename Derived>
9074 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9075     OMPTeamsDistributeSimdDirective *D) {
9076   DeclarationNameInfo DirName;
9077   getDerived().getSema().StartOpenMPDSABlock(
9078       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9079   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9080   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9081   return Res;
9082 }
9083 
9084 template <typename Derived>
9085 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9086     OMPTeamsDistributeParallelForSimdDirective *D) {
9087   DeclarationNameInfo DirName;
9088   getDerived().getSema().StartOpenMPDSABlock(
9089       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9090       D->getBeginLoc());
9091   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9092   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9093   return Res;
9094 }
9095 
9096 template <typename Derived>
9097 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9098     OMPTeamsDistributeParallelForDirective *D) {
9099   DeclarationNameInfo DirName;
9100   getDerived().getSema().StartOpenMPDSABlock(
9101       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9102   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9103   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9104   return Res;
9105 }
9106 
9107 template <typename Derived>
9108 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9109     OMPTargetTeamsDirective *D) {
9110   DeclarationNameInfo DirName;
9111   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9112                                              nullptr, D->getBeginLoc());
9113   auto Res = getDerived().TransformOMPExecutableDirective(D);
9114   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9115   return Res;
9116 }
9117 
9118 template <typename Derived>
9119 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9120     OMPTargetTeamsDistributeDirective *D) {
9121   DeclarationNameInfo DirName;
9122   getDerived().getSema().StartOpenMPDSABlock(
9123       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9124   auto Res = getDerived().TransformOMPExecutableDirective(D);
9125   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9126   return Res;
9127 }
9128 
9129 template <typename Derived>
9130 StmtResult
9131 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9132     OMPTargetTeamsDistributeParallelForDirective *D) {
9133   DeclarationNameInfo DirName;
9134   getDerived().getSema().StartOpenMPDSABlock(
9135       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9136       D->getBeginLoc());
9137   auto Res = getDerived().TransformOMPExecutableDirective(D);
9138   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9139   return Res;
9140 }
9141 
9142 template <typename Derived>
9143 StmtResult TreeTransform<Derived>::
9144     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9145         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9146   DeclarationNameInfo DirName;
9147   getDerived().getSema().StartOpenMPDSABlock(
9148       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9149       D->getBeginLoc());
9150   auto Res = getDerived().TransformOMPExecutableDirective(D);
9151   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9152   return Res;
9153 }
9154 
9155 template <typename Derived>
9156 StmtResult
9157 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9158     OMPTargetTeamsDistributeSimdDirective *D) {
9159   DeclarationNameInfo DirName;
9160   getDerived().getSema().StartOpenMPDSABlock(
9161       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9162   auto Res = getDerived().TransformOMPExecutableDirective(D);
9163   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9164   return Res;
9165 }
9166 
9167 template <typename Derived>
9168 StmtResult
9169 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9170   DeclarationNameInfo DirName;
9171   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9172                                              D->getBeginLoc());
9173   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9174   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9175   return Res;
9176 }
9177 
9178 template <typename Derived>
9179 StmtResult
9180 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9181   DeclarationNameInfo DirName;
9182   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9183                                              D->getBeginLoc());
9184   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9185   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9186   return Res;
9187 }
9188 
9189 template <typename Derived>
9190 StmtResult
9191 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9192   DeclarationNameInfo DirName;
9193   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9194                                              D->getBeginLoc());
9195   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9196   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9197   return Res;
9198 }
9199 
9200 template <typename Derived>
9201 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9202     OMPGenericLoopDirective *D) {
9203   DeclarationNameInfo DirName;
9204   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9205                                              D->getBeginLoc());
9206   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9207   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9208   return Res;
9209 }
9210 
9211 //===----------------------------------------------------------------------===//
9212 // OpenMP clause transformation
9213 //===----------------------------------------------------------------------===//
9214 template <typename Derived>
9215 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9216   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9217   if (Cond.isInvalid())
9218     return nullptr;
9219   return getDerived().RebuildOMPIfClause(
9220       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9221       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9222 }
9223 
9224 template <typename Derived>
9225 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9226   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9227   if (Cond.isInvalid())
9228     return nullptr;
9229   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9230                                             C->getLParenLoc(), C->getEndLoc());
9231 }
9232 
9233 template <typename Derived>
9234 OMPClause *
9235 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9236   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9237   if (NumThreads.isInvalid())
9238     return nullptr;
9239   return getDerived().RebuildOMPNumThreadsClause(
9240       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9241 }
9242 
9243 template <typename Derived>
9244 OMPClause *
9245 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9246   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9247   if (E.isInvalid())
9248     return nullptr;
9249   return getDerived().RebuildOMPSafelenClause(
9250       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9251 }
9252 
9253 template <typename Derived>
9254 OMPClause *
9255 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9256   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9257   if (E.isInvalid())
9258     return nullptr;
9259   return getDerived().RebuildOMPAllocatorClause(
9260       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9261 }
9262 
9263 template <typename Derived>
9264 OMPClause *
9265 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9266   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9267   if (E.isInvalid())
9268     return nullptr;
9269   return getDerived().RebuildOMPSimdlenClause(
9270       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9271 }
9272 
9273 template <typename Derived>
9274 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9275   SmallVector<Expr *, 4> TransformedSizes;
9276   TransformedSizes.reserve(C->getNumSizes());
9277   bool Changed = false;
9278   for (Expr *E : C->getSizesRefs()) {
9279     if (!E) {
9280       TransformedSizes.push_back(nullptr);
9281       continue;
9282     }
9283 
9284     ExprResult T = getDerived().TransformExpr(E);
9285     if (T.isInvalid())
9286       return nullptr;
9287     if (E != T.get())
9288       Changed = true;
9289     TransformedSizes.push_back(T.get());
9290   }
9291 
9292   if (!Changed && !getDerived().AlwaysRebuild())
9293     return C;
9294   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9295                                C->getLParenLoc(), C->getEndLoc());
9296 }
9297 
9298 template <typename Derived>
9299 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9300   if (!getDerived().AlwaysRebuild())
9301     return C;
9302   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9303 }
9304 
9305 template <typename Derived>
9306 OMPClause *
9307 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9308   ExprResult T = getDerived().TransformExpr(C->getFactor());
9309   if (T.isInvalid())
9310     return nullptr;
9311   Expr *Factor = T.get();
9312   bool Changed = Factor != C->getFactor();
9313 
9314   if (!Changed && !getDerived().AlwaysRebuild())
9315     return C;
9316   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9317                                  C->getEndLoc());
9318 }
9319 
9320 template <typename Derived>
9321 OMPClause *
9322 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9323   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9324   if (E.isInvalid())
9325     return nullptr;
9326   return getDerived().RebuildOMPCollapseClause(
9327       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9328 }
9329 
9330 template <typename Derived>
9331 OMPClause *
9332 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9333   return getDerived().RebuildOMPDefaultClause(
9334       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9335       C->getLParenLoc(), C->getEndLoc());
9336 }
9337 
9338 template <typename Derived>
9339 OMPClause *
9340 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9341   return getDerived().RebuildOMPProcBindClause(
9342       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9343       C->getLParenLoc(), C->getEndLoc());
9344 }
9345 
9346 template <typename Derived>
9347 OMPClause *
9348 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9349   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9350   if (E.isInvalid())
9351     return nullptr;
9352   return getDerived().RebuildOMPScheduleClause(
9353       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9354       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9355       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9356       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9357 }
9358 
9359 template <typename Derived>
9360 OMPClause *
9361 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9362   ExprResult E;
9363   if (auto *Num = C->getNumForLoops()) {
9364     E = getDerived().TransformExpr(Num);
9365     if (E.isInvalid())
9366       return nullptr;
9367   }
9368   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9369                                               C->getLParenLoc(), E.get());
9370 }
9371 
9372 template <typename Derived>
9373 OMPClause *
9374 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9375   ExprResult E;
9376   if (Expr *Evt = C->getEventHandler()) {
9377     E = getDerived().TransformExpr(Evt);
9378     if (E.isInvalid())
9379       return nullptr;
9380   }
9381   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9382                                              C->getLParenLoc(), C->getEndLoc());
9383 }
9384 
9385 template <typename Derived>
9386 OMPClause *
9387 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9388   // No need to rebuild this clause, no template-dependent parameters.
9389   return C;
9390 }
9391 
9392 template <typename Derived>
9393 OMPClause *
9394 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9395   // No need to rebuild this clause, no template-dependent parameters.
9396   return C;
9397 }
9398 
9399 template <typename Derived>
9400 OMPClause *
9401 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9402   // No need to rebuild this clause, no template-dependent parameters.
9403   return C;
9404 }
9405 
9406 template <typename Derived>
9407 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9408   // No need to rebuild this clause, no template-dependent parameters.
9409   return C;
9410 }
9411 
9412 template <typename Derived>
9413 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9414   // No need to rebuild this clause, no template-dependent parameters.
9415   return C;
9416 }
9417 
9418 template <typename Derived>
9419 OMPClause *
9420 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9421   // No need to rebuild this clause, no template-dependent parameters.
9422   return C;
9423 }
9424 
9425 template <typename Derived>
9426 OMPClause *
9427 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9428   // No need to rebuild this clause, no template-dependent parameters.
9429   return C;
9430 }
9431 
9432 template <typename Derived>
9433 OMPClause *
9434 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9435   // No need to rebuild this clause, no template-dependent parameters.
9436   return C;
9437 }
9438 
9439 template <typename Derived>
9440 OMPClause *
9441 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9442   // No need to rebuild this clause, no template-dependent parameters.
9443   return C;
9444 }
9445 
9446 template <typename Derived>
9447 OMPClause *
9448 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9449   // No need to rebuild this clause, no template-dependent parameters.
9450   return C;
9451 }
9452 
9453 template <typename Derived>
9454 OMPClause *
9455 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9456   // No need to rebuild this clause, no template-dependent parameters.
9457   return C;
9458 }
9459 
9460 template <typename Derived>
9461 OMPClause *
9462 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9463   // No need to rebuild this clause, no template-dependent parameters.
9464   return C;
9465 }
9466 
9467 template <typename Derived>
9468 OMPClause *
9469 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9470   // No need to rebuild this clause, no template-dependent parameters.
9471   return C;
9472 }
9473 
9474 template <typename Derived>
9475 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9476   // No need to rebuild this clause, no template-dependent parameters.
9477   return C;
9478 }
9479 
9480 template <typename Derived>
9481 OMPClause *
9482 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9483   // No need to rebuild this clause, no template-dependent parameters.
9484   return C;
9485 }
9486 
9487 template <typename Derived>
9488 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9489   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9490   if (IVR.isInvalid())
9491     return nullptr;
9492 
9493   llvm::SmallVector<Expr *, 8> PrefExprs;
9494   PrefExprs.reserve(C->varlist_size() - 1);
9495   for (Expr *E : llvm::drop_begin(C->varlists())) {
9496     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9497     if (ER.isInvalid())
9498       return nullptr;
9499     PrefExprs.push_back(ER.get());
9500   }
9501   return getDerived().RebuildOMPInitClause(
9502       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9503       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9504 }
9505 
9506 template <typename Derived>
9507 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9508   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9509   if (ER.isInvalid())
9510     return nullptr;
9511   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9512                                           C->getLParenLoc(), C->getVarLoc(),
9513                                           C->getEndLoc());
9514 }
9515 
9516 template <typename Derived>
9517 OMPClause *
9518 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9519   ExprResult ER;
9520   if (Expr *IV = C->getInteropVar()) {
9521     ER = getDerived().TransformExpr(IV);
9522     if (ER.isInvalid())
9523       return nullptr;
9524   }
9525   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9526                                               C->getLParenLoc(), C->getVarLoc(),
9527                                               C->getEndLoc());
9528 }
9529 
9530 template <typename Derived>
9531 OMPClause *
9532 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9533   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9534   if (Cond.isInvalid())
9535     return nullptr;
9536   return getDerived().RebuildOMPNovariantsClause(
9537       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9538 }
9539 
9540 template <typename Derived>
9541 OMPClause *
9542 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9543   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9544   if (Cond.isInvalid())
9545     return nullptr;
9546   return getDerived().RebuildOMPNocontextClause(
9547       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9548 }
9549 
9550 template <typename Derived>
9551 OMPClause *
9552 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9553   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9554   if (ThreadID.isInvalid())
9555     return nullptr;
9556   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9557                                              C->getLParenLoc(), C->getEndLoc());
9558 }
9559 
9560 template <typename Derived>
9561 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9562   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9563   if (E.isInvalid())
9564     return nullptr;
9565   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9566                                             C->getLParenLoc(), C->getEndLoc());
9567 }
9568 
9569 template <typename Derived>
9570 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9571     OMPUnifiedAddressClause *C) {
9572   llvm_unreachable("unified_address clause cannot appear in dependent context");
9573 }
9574 
9575 template <typename Derived>
9576 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9577     OMPUnifiedSharedMemoryClause *C) {
9578   llvm_unreachable(
9579       "unified_shared_memory clause cannot appear in dependent context");
9580 }
9581 
9582 template <typename Derived>
9583 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9584     OMPReverseOffloadClause *C) {
9585   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9586 }
9587 
9588 template <typename Derived>
9589 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9590     OMPDynamicAllocatorsClause *C) {
9591   llvm_unreachable(
9592       "dynamic_allocators clause cannot appear in dependent context");
9593 }
9594 
9595 template <typename Derived>
9596 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9597     OMPAtomicDefaultMemOrderClause *C) {
9598   llvm_unreachable(
9599       "atomic_default_mem_order clause cannot appear in dependent context");
9600 }
9601 
9602 template <typename Derived>
9603 OMPClause *
9604 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9605   llvm::SmallVector<Expr *, 16> Vars;
9606   Vars.reserve(C->varlist_size());
9607   for (auto *VE : C->varlists()) {
9608     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9609     if (EVar.isInvalid())
9610       return nullptr;
9611     Vars.push_back(EVar.get());
9612   }
9613   return getDerived().RebuildOMPPrivateClause(
9614       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9615 }
9616 
9617 template <typename Derived>
9618 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9619     OMPFirstprivateClause *C) {
9620   llvm::SmallVector<Expr *, 16> Vars;
9621   Vars.reserve(C->varlist_size());
9622   for (auto *VE : C->varlists()) {
9623     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9624     if (EVar.isInvalid())
9625       return nullptr;
9626     Vars.push_back(EVar.get());
9627   }
9628   return getDerived().RebuildOMPFirstprivateClause(
9629       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9630 }
9631 
9632 template <typename Derived>
9633 OMPClause *
9634 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9635   llvm::SmallVector<Expr *, 16> Vars;
9636   Vars.reserve(C->varlist_size());
9637   for (auto *VE : C->varlists()) {
9638     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9639     if (EVar.isInvalid())
9640       return nullptr;
9641     Vars.push_back(EVar.get());
9642   }
9643   return getDerived().RebuildOMPLastprivateClause(
9644       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9645       C->getLParenLoc(), C->getEndLoc());
9646 }
9647 
9648 template <typename Derived>
9649 OMPClause *
9650 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9651   llvm::SmallVector<Expr *, 16> Vars;
9652   Vars.reserve(C->varlist_size());
9653   for (auto *VE : C->varlists()) {
9654     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9655     if (EVar.isInvalid())
9656       return nullptr;
9657     Vars.push_back(EVar.get());
9658   }
9659   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9660                                              C->getLParenLoc(), C->getEndLoc());
9661 }
9662 
9663 template <typename Derived>
9664 OMPClause *
9665 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9666   llvm::SmallVector<Expr *, 16> Vars;
9667   Vars.reserve(C->varlist_size());
9668   for (auto *VE : C->varlists()) {
9669     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9670     if (EVar.isInvalid())
9671       return nullptr;
9672     Vars.push_back(EVar.get());
9673   }
9674   CXXScopeSpec ReductionIdScopeSpec;
9675   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9676 
9677   DeclarationNameInfo NameInfo = C->getNameInfo();
9678   if (NameInfo.getName()) {
9679     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9680     if (!NameInfo.getName())
9681       return nullptr;
9682   }
9683   // Build a list of all UDR decls with the same names ranged by the Scopes.
9684   // The Scope boundary is a duplication of the previous decl.
9685   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9686   for (auto *E : C->reduction_ops()) {
9687     // Transform all the decls.
9688     if (E) {
9689       auto *ULE = cast<UnresolvedLookupExpr>(E);
9690       UnresolvedSet<8> Decls;
9691       for (auto *D : ULE->decls()) {
9692         NamedDecl *InstD =
9693             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9694         Decls.addDecl(InstD, InstD->getAccess());
9695       }
9696       UnresolvedReductions.push_back(
9697        UnresolvedLookupExpr::Create(
9698           SemaRef.Context, /*NamingClass=*/nullptr,
9699           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9700           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9701           Decls.begin(), Decls.end()));
9702     } else
9703       UnresolvedReductions.push_back(nullptr);
9704   }
9705   return getDerived().RebuildOMPReductionClause(
9706       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9707       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9708       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9709 }
9710 
9711 template <typename Derived>
9712 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9713     OMPTaskReductionClause *C) {
9714   llvm::SmallVector<Expr *, 16> Vars;
9715   Vars.reserve(C->varlist_size());
9716   for (auto *VE : C->varlists()) {
9717     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9718     if (EVar.isInvalid())
9719       return nullptr;
9720     Vars.push_back(EVar.get());
9721   }
9722   CXXScopeSpec ReductionIdScopeSpec;
9723   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9724 
9725   DeclarationNameInfo NameInfo = C->getNameInfo();
9726   if (NameInfo.getName()) {
9727     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9728     if (!NameInfo.getName())
9729       return nullptr;
9730   }
9731   // Build a list of all UDR decls with the same names ranged by the Scopes.
9732   // The Scope boundary is a duplication of the previous decl.
9733   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9734   for (auto *E : C->reduction_ops()) {
9735     // Transform all the decls.
9736     if (E) {
9737       auto *ULE = cast<UnresolvedLookupExpr>(E);
9738       UnresolvedSet<8> Decls;
9739       for (auto *D : ULE->decls()) {
9740         NamedDecl *InstD =
9741             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9742         Decls.addDecl(InstD, InstD->getAccess());
9743       }
9744       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9745           SemaRef.Context, /*NamingClass=*/nullptr,
9746           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9747           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9748     } else
9749       UnresolvedReductions.push_back(nullptr);
9750   }
9751   return getDerived().RebuildOMPTaskReductionClause(
9752       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9753       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9754 }
9755 
9756 template <typename Derived>
9757 OMPClause *
9758 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9759   llvm::SmallVector<Expr *, 16> Vars;
9760   Vars.reserve(C->varlist_size());
9761   for (auto *VE : C->varlists()) {
9762     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9763     if (EVar.isInvalid())
9764       return nullptr;
9765     Vars.push_back(EVar.get());
9766   }
9767   CXXScopeSpec ReductionIdScopeSpec;
9768   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9769 
9770   DeclarationNameInfo NameInfo = C->getNameInfo();
9771   if (NameInfo.getName()) {
9772     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9773     if (!NameInfo.getName())
9774       return nullptr;
9775   }
9776   // Build a list of all UDR decls with the same names ranged by the Scopes.
9777   // The Scope boundary is a duplication of the previous decl.
9778   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9779   for (auto *E : C->reduction_ops()) {
9780     // Transform all the decls.
9781     if (E) {
9782       auto *ULE = cast<UnresolvedLookupExpr>(E);
9783       UnresolvedSet<8> Decls;
9784       for (auto *D : ULE->decls()) {
9785         NamedDecl *InstD =
9786             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9787         Decls.addDecl(InstD, InstD->getAccess());
9788       }
9789       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9790           SemaRef.Context, /*NamingClass=*/nullptr,
9791           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9792           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9793     } else
9794       UnresolvedReductions.push_back(nullptr);
9795   }
9796   return getDerived().RebuildOMPInReductionClause(
9797       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9798       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9799 }
9800 
9801 template <typename Derived>
9802 OMPClause *
9803 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9804   llvm::SmallVector<Expr *, 16> Vars;
9805   Vars.reserve(C->varlist_size());
9806   for (auto *VE : C->varlists()) {
9807     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9808     if (EVar.isInvalid())
9809       return nullptr;
9810     Vars.push_back(EVar.get());
9811   }
9812   ExprResult Step = getDerived().TransformExpr(C->getStep());
9813   if (Step.isInvalid())
9814     return nullptr;
9815   return getDerived().RebuildOMPLinearClause(
9816       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9817       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9818 }
9819 
9820 template <typename Derived>
9821 OMPClause *
9822 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9823   llvm::SmallVector<Expr *, 16> Vars;
9824   Vars.reserve(C->varlist_size());
9825   for (auto *VE : C->varlists()) {
9826     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9827     if (EVar.isInvalid())
9828       return nullptr;
9829     Vars.push_back(EVar.get());
9830   }
9831   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9832   if (Alignment.isInvalid())
9833     return nullptr;
9834   return getDerived().RebuildOMPAlignedClause(
9835       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9836       C->getColonLoc(), C->getEndLoc());
9837 }
9838 
9839 template <typename Derived>
9840 OMPClause *
9841 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9842   llvm::SmallVector<Expr *, 16> Vars;
9843   Vars.reserve(C->varlist_size());
9844   for (auto *VE : C->varlists()) {
9845     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9846     if (EVar.isInvalid())
9847       return nullptr;
9848     Vars.push_back(EVar.get());
9849   }
9850   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9851                                              C->getLParenLoc(), C->getEndLoc());
9852 }
9853 
9854 template <typename Derived>
9855 OMPClause *
9856 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9857   llvm::SmallVector<Expr *, 16> Vars;
9858   Vars.reserve(C->varlist_size());
9859   for (auto *VE : C->varlists()) {
9860     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9861     if (EVar.isInvalid())
9862       return nullptr;
9863     Vars.push_back(EVar.get());
9864   }
9865   return getDerived().RebuildOMPCopyprivateClause(
9866       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9867 }
9868 
9869 template <typename Derived>
9870 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9871   llvm::SmallVector<Expr *, 16> Vars;
9872   Vars.reserve(C->varlist_size());
9873   for (auto *VE : C->varlists()) {
9874     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9875     if (EVar.isInvalid())
9876       return nullptr;
9877     Vars.push_back(EVar.get());
9878   }
9879   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9880                                             C->getLParenLoc(), C->getEndLoc());
9881 }
9882 
9883 template <typename Derived>
9884 OMPClause *
9885 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9886   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9887   if (E.isInvalid())
9888     return nullptr;
9889   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9890                                              C->getLParenLoc(), C->getEndLoc());
9891 }
9892 
9893 template <typename Derived>
9894 OMPClause *
9895 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9896   llvm::SmallVector<Expr *, 16> Vars;
9897   Expr *DepModifier = C->getModifier();
9898   if (DepModifier) {
9899     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9900     if (DepModRes.isInvalid())
9901       return nullptr;
9902     DepModifier = DepModRes.get();
9903   }
9904   Vars.reserve(C->varlist_size());
9905   for (auto *VE : C->varlists()) {
9906     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9907     if (EVar.isInvalid())
9908       return nullptr;
9909     Vars.push_back(EVar.get());
9910   }
9911   return getDerived().RebuildOMPDependClause(
9912       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9913       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9914       C->getEndLoc());
9915 }
9916 
9917 template <typename Derived>
9918 OMPClause *
9919 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9920   ExprResult E = getDerived().TransformExpr(C->getDevice());
9921   if (E.isInvalid())
9922     return nullptr;
9923   return getDerived().RebuildOMPDeviceClause(
9924       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9925       C->getModifierLoc(), C->getEndLoc());
9926 }
9927 
9928 template <typename Derived, class T>
9929 bool transformOMPMappableExprListClause(
9930     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9931     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9932     DeclarationNameInfo &MapperIdInfo,
9933     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9934   // Transform expressions in the list.
9935   Vars.reserve(C->varlist_size());
9936   for (auto *VE : C->varlists()) {
9937     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9938     if (EVar.isInvalid())
9939       return true;
9940     Vars.push_back(EVar.get());
9941   }
9942   // Transform mapper scope specifier and identifier.
9943   NestedNameSpecifierLoc QualifierLoc;
9944   if (C->getMapperQualifierLoc()) {
9945     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9946         C->getMapperQualifierLoc());
9947     if (!QualifierLoc)
9948       return true;
9949   }
9950   MapperIdScopeSpec.Adopt(QualifierLoc);
9951   MapperIdInfo = C->getMapperIdInfo();
9952   if (MapperIdInfo.getName()) {
9953     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9954     if (!MapperIdInfo.getName())
9955       return true;
9956   }
9957   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9958   // the previous user-defined mapper lookup in dependent environment.
9959   for (auto *E : C->mapperlists()) {
9960     // Transform all the decls.
9961     if (E) {
9962       auto *ULE = cast<UnresolvedLookupExpr>(E);
9963       UnresolvedSet<8> Decls;
9964       for (auto *D : ULE->decls()) {
9965         NamedDecl *InstD =
9966             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9967         Decls.addDecl(InstD, InstD->getAccess());
9968       }
9969       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9970           TT.getSema().Context, /*NamingClass=*/nullptr,
9971           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9972           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9973           Decls.end()));
9974     } else {
9975       UnresolvedMappers.push_back(nullptr);
9976     }
9977   }
9978   return false;
9979 }
9980 
9981 template <typename Derived>
9982 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9983   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9984   llvm::SmallVector<Expr *, 16> Vars;
9985   CXXScopeSpec MapperIdScopeSpec;
9986   DeclarationNameInfo MapperIdInfo;
9987   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9988   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9989           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9990     return nullptr;
9991   return getDerived().RebuildOMPMapClause(
9992       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9993       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9994       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9995 }
9996 
9997 template <typename Derived>
9998 OMPClause *
9999 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10000   Expr *Allocator = C->getAllocator();
10001   if (Allocator) {
10002     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10003     if (AllocatorRes.isInvalid())
10004       return nullptr;
10005     Allocator = AllocatorRes.get();
10006   }
10007   llvm::SmallVector<Expr *, 16> Vars;
10008   Vars.reserve(C->varlist_size());
10009   for (auto *VE : C->varlists()) {
10010     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10011     if (EVar.isInvalid())
10012       return nullptr;
10013     Vars.push_back(EVar.get());
10014   }
10015   return getDerived().RebuildOMPAllocateClause(
10016       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10017       C->getEndLoc());
10018 }
10019 
10020 template <typename Derived>
10021 OMPClause *
10022 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10023   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10024   if (E.isInvalid())
10025     return nullptr;
10026   return getDerived().RebuildOMPNumTeamsClause(
10027       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10028 }
10029 
10030 template <typename Derived>
10031 OMPClause *
10032 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10033   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10034   if (E.isInvalid())
10035     return nullptr;
10036   return getDerived().RebuildOMPThreadLimitClause(
10037       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10038 }
10039 
10040 template <typename Derived>
10041 OMPClause *
10042 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10043   ExprResult E = getDerived().TransformExpr(C->getPriority());
10044   if (E.isInvalid())
10045     return nullptr;
10046   return getDerived().RebuildOMPPriorityClause(
10047       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10048 }
10049 
10050 template <typename Derived>
10051 OMPClause *
10052 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10053   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10054   if (E.isInvalid())
10055     return nullptr;
10056   return getDerived().RebuildOMPGrainsizeClause(
10057       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10058 }
10059 
10060 template <typename Derived>
10061 OMPClause *
10062 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10063   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10064   if (E.isInvalid())
10065     return nullptr;
10066   return getDerived().RebuildOMPNumTasksClause(
10067       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10068 }
10069 
10070 template <typename Derived>
10071 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10072   ExprResult E = getDerived().TransformExpr(C->getHint());
10073   if (E.isInvalid())
10074     return nullptr;
10075   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10076                                            C->getLParenLoc(), C->getEndLoc());
10077 }
10078 
10079 template <typename Derived>
10080 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10081     OMPDistScheduleClause *C) {
10082   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10083   if (E.isInvalid())
10084     return nullptr;
10085   return getDerived().RebuildOMPDistScheduleClause(
10086       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10087       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10088 }
10089 
10090 template <typename Derived>
10091 OMPClause *
10092 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10093   // Rebuild Defaultmap Clause since we need to invoke the checking of
10094   // defaultmap(none:variable-category) after template initialization.
10095   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10096                                                  C->getDefaultmapKind(),
10097                                                  C->getBeginLoc(),
10098                                                  C->getLParenLoc(),
10099                                                  C->getDefaultmapModifierLoc(),
10100                                                  C->getDefaultmapKindLoc(),
10101                                                  C->getEndLoc());
10102 }
10103 
10104 template <typename Derived>
10105 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10106   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10107   llvm::SmallVector<Expr *, 16> Vars;
10108   CXXScopeSpec MapperIdScopeSpec;
10109   DeclarationNameInfo MapperIdInfo;
10110   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10111   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10112           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10113     return nullptr;
10114   return getDerived().RebuildOMPToClause(
10115       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10116       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10117 }
10118 
10119 template <typename Derived>
10120 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10121   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10122   llvm::SmallVector<Expr *, 16> Vars;
10123   CXXScopeSpec MapperIdScopeSpec;
10124   DeclarationNameInfo MapperIdInfo;
10125   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10126   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10127           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10128     return nullptr;
10129   return getDerived().RebuildOMPFromClause(
10130       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10131       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10132 }
10133 
10134 template <typename Derived>
10135 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10136     OMPUseDevicePtrClause *C) {
10137   llvm::SmallVector<Expr *, 16> Vars;
10138   Vars.reserve(C->varlist_size());
10139   for (auto *VE : C->varlists()) {
10140     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10141     if (EVar.isInvalid())
10142       return nullptr;
10143     Vars.push_back(EVar.get());
10144   }
10145   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10146   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10147 }
10148 
10149 template <typename Derived>
10150 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10151     OMPUseDeviceAddrClause *C) {
10152   llvm::SmallVector<Expr *, 16> Vars;
10153   Vars.reserve(C->varlist_size());
10154   for (auto *VE : C->varlists()) {
10155     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10156     if (EVar.isInvalid())
10157       return nullptr;
10158     Vars.push_back(EVar.get());
10159   }
10160   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10161   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10162 }
10163 
10164 template <typename Derived>
10165 OMPClause *
10166 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10167   llvm::SmallVector<Expr *, 16> Vars;
10168   Vars.reserve(C->varlist_size());
10169   for (auto *VE : C->varlists()) {
10170     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10171     if (EVar.isInvalid())
10172       return nullptr;
10173     Vars.push_back(EVar.get());
10174   }
10175   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10176   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10177 }
10178 
10179 template <typename Derived>
10180 OMPClause *
10181 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10182   llvm::SmallVector<Expr *, 16> Vars;
10183   Vars.reserve(C->varlist_size());
10184   for (auto *VE : C->varlists()) {
10185     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10186     if (EVar.isInvalid())
10187       return nullptr;
10188     Vars.push_back(EVar.get());
10189   }
10190   return getDerived().RebuildOMPNontemporalClause(
10191       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10192 }
10193 
10194 template <typename Derived>
10195 OMPClause *
10196 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10197   llvm::SmallVector<Expr *, 16> Vars;
10198   Vars.reserve(C->varlist_size());
10199   for (auto *VE : C->varlists()) {
10200     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10201     if (EVar.isInvalid())
10202       return nullptr;
10203     Vars.push_back(EVar.get());
10204   }
10205   return getDerived().RebuildOMPInclusiveClause(
10206       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10207 }
10208 
10209 template <typename Derived>
10210 OMPClause *
10211 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10212   llvm::SmallVector<Expr *, 16> Vars;
10213   Vars.reserve(C->varlist_size());
10214   for (auto *VE : C->varlists()) {
10215     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10216     if (EVar.isInvalid())
10217       return nullptr;
10218     Vars.push_back(EVar.get());
10219   }
10220   return getDerived().RebuildOMPExclusiveClause(
10221       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10222 }
10223 
10224 template <typename Derived>
10225 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10226     OMPUsesAllocatorsClause *C) {
10227   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10228   Data.reserve(C->getNumberOfAllocators());
10229   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10230     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10231     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10232     if (Allocator.isInvalid())
10233       continue;
10234     ExprResult AllocatorTraits;
10235     if (Expr *AT = D.AllocatorTraits) {
10236       AllocatorTraits = getDerived().TransformExpr(AT);
10237       if (AllocatorTraits.isInvalid())
10238         continue;
10239     }
10240     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10241     NewD.Allocator = Allocator.get();
10242     NewD.AllocatorTraits = AllocatorTraits.get();
10243     NewD.LParenLoc = D.LParenLoc;
10244     NewD.RParenLoc = D.RParenLoc;
10245   }
10246   return getDerived().RebuildOMPUsesAllocatorsClause(
10247       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10248 }
10249 
10250 template <typename Derived>
10251 OMPClause *
10252 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10253   SmallVector<Expr *, 4> Locators;
10254   Locators.reserve(C->varlist_size());
10255   ExprResult ModifierRes;
10256   if (Expr *Modifier = C->getModifier()) {
10257     ModifierRes = getDerived().TransformExpr(Modifier);
10258     if (ModifierRes.isInvalid())
10259       return nullptr;
10260   }
10261   for (Expr *E : C->varlists()) {
10262     ExprResult Locator = getDerived().TransformExpr(E);
10263     if (Locator.isInvalid())
10264       continue;
10265     Locators.push_back(Locator.get());
10266   }
10267   return getDerived().RebuildOMPAffinityClause(
10268       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10269       ModifierRes.get(), Locators);
10270 }
10271 
10272 template <typename Derived>
10273 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10274   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10275                                             C->getBeginLoc(), C->getLParenLoc(),
10276                                             C->getEndLoc());
10277 }
10278 
10279 template <typename Derived>
10280 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10281   return getDerived().RebuildOMPBindClause(
10282       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10283       C->getLParenLoc(), C->getEndLoc());
10284 }
10285 
10286 //===----------------------------------------------------------------------===//
10287 // Expression transformation
10288 //===----------------------------------------------------------------------===//
10289 template<typename Derived>
10290 ExprResult
10291 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10292   return TransformExpr(E->getSubExpr());
10293 }
10294 
10295 template <typename Derived>
10296 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10297     SYCLUniqueStableNameExpr *E) {
10298   if (!E->isTypeDependent())
10299     return E;
10300 
10301   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10302 
10303   if (!NewT)
10304     return ExprError();
10305 
10306   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10307     return E;
10308 
10309   return getDerived().RebuildSYCLUniqueStableNameExpr(
10310       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10311 }
10312 
10313 template<typename Derived>
10314 ExprResult
10315 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10316   if (!E->isTypeDependent())
10317     return E;
10318 
10319   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10320                                             E->getIdentKind());
10321 }
10322 
10323 template<typename Derived>
10324 ExprResult
10325 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10326   NestedNameSpecifierLoc QualifierLoc;
10327   if (E->getQualifierLoc()) {
10328     QualifierLoc
10329       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10330     if (!QualifierLoc)
10331       return ExprError();
10332   }
10333 
10334   ValueDecl *ND
10335     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10336                                                          E->getDecl()));
10337   if (!ND)
10338     return ExprError();
10339 
10340   NamedDecl *Found = ND;
10341   if (E->getFoundDecl() != E->getDecl()) {
10342     Found = cast_or_null<NamedDecl>(
10343         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10344     if (!Found)
10345       return ExprError();
10346   }
10347 
10348   DeclarationNameInfo NameInfo = E->getNameInfo();
10349   if (NameInfo.getName()) {
10350     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10351     if (!NameInfo.getName())
10352       return ExprError();
10353   }
10354 
10355   if (!getDerived().AlwaysRebuild() &&
10356       QualifierLoc == E->getQualifierLoc() &&
10357       ND == E->getDecl() &&
10358       Found == E->getFoundDecl() &&
10359       NameInfo.getName() == E->getDecl()->getDeclName() &&
10360       !E->hasExplicitTemplateArgs()) {
10361 
10362     // Mark it referenced in the new context regardless.
10363     // FIXME: this is a bit instantiation-specific.
10364     SemaRef.MarkDeclRefReferenced(E);
10365 
10366     return E;
10367   }
10368 
10369   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10370   if (E->hasExplicitTemplateArgs()) {
10371     TemplateArgs = &TransArgs;
10372     TransArgs.setLAngleLoc(E->getLAngleLoc());
10373     TransArgs.setRAngleLoc(E->getRAngleLoc());
10374     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10375                                                 E->getNumTemplateArgs(),
10376                                                 TransArgs))
10377       return ExprError();
10378   }
10379 
10380   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10381                                          Found, TemplateArgs);
10382 }
10383 
10384 template<typename Derived>
10385 ExprResult
10386 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10387   return E;
10388 }
10389 
10390 template <typename Derived>
10391 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10392     FixedPointLiteral *E) {
10393   return E;
10394 }
10395 
10396 template<typename Derived>
10397 ExprResult
10398 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10399   return E;
10400 }
10401 
10402 template<typename Derived>
10403 ExprResult
10404 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10405   return E;
10406 }
10407 
10408 template<typename Derived>
10409 ExprResult
10410 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10411   return E;
10412 }
10413 
10414 template<typename Derived>
10415 ExprResult
10416 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10417   return E;
10418 }
10419 
10420 template<typename Derived>
10421 ExprResult
10422 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10423   if (FunctionDecl *FD = E->getDirectCallee())
10424     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10425   return SemaRef.MaybeBindToTemporary(E);
10426 }
10427 
10428 template<typename Derived>
10429 ExprResult
10430 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10431   ExprResult ControllingExpr =
10432     getDerived().TransformExpr(E->getControllingExpr());
10433   if (ControllingExpr.isInvalid())
10434     return ExprError();
10435 
10436   SmallVector<Expr *, 4> AssocExprs;
10437   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10438   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10439     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10440     if (TSI) {
10441       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10442       if (!AssocType)
10443         return ExprError();
10444       AssocTypes.push_back(AssocType);
10445     } else {
10446       AssocTypes.push_back(nullptr);
10447     }
10448 
10449     ExprResult AssocExpr =
10450         getDerived().TransformExpr(Assoc.getAssociationExpr());
10451     if (AssocExpr.isInvalid())
10452       return ExprError();
10453     AssocExprs.push_back(AssocExpr.get());
10454   }
10455 
10456   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10457                                                   E->getDefaultLoc(),
10458                                                   E->getRParenLoc(),
10459                                                   ControllingExpr.get(),
10460                                                   AssocTypes,
10461                                                   AssocExprs);
10462 }
10463 
10464 template<typename Derived>
10465 ExprResult
10466 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10467   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10468   if (SubExpr.isInvalid())
10469     return ExprError();
10470 
10471   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10472     return E;
10473 
10474   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10475                                        E->getRParen());
10476 }
10477 
10478 /// The operand of a unary address-of operator has special rules: it's
10479 /// allowed to refer to a non-static member of a class even if there's no 'this'
10480 /// object available.
10481 template<typename Derived>
10482 ExprResult
10483 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10484   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10485     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10486   else
10487     return getDerived().TransformExpr(E);
10488 }
10489 
10490 template<typename Derived>
10491 ExprResult
10492 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10493   ExprResult SubExpr;
10494   if (E->getOpcode() == UO_AddrOf)
10495     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10496   else
10497     SubExpr = TransformExpr(E->getSubExpr());
10498   if (SubExpr.isInvalid())
10499     return ExprError();
10500 
10501   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10502     return E;
10503 
10504   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10505                                            E->getOpcode(),
10506                                            SubExpr.get());
10507 }
10508 
10509 template<typename Derived>
10510 ExprResult
10511 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10512   // Transform the type.
10513   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10514   if (!Type)
10515     return ExprError();
10516 
10517   // Transform all of the components into components similar to what the
10518   // parser uses.
10519   // FIXME: It would be slightly more efficient in the non-dependent case to
10520   // just map FieldDecls, rather than requiring the rebuilder to look for
10521   // the fields again. However, __builtin_offsetof is rare enough in
10522   // template code that we don't care.
10523   bool ExprChanged = false;
10524   typedef Sema::OffsetOfComponent Component;
10525   SmallVector<Component, 4> Components;
10526   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10527     const OffsetOfNode &ON = E->getComponent(I);
10528     Component Comp;
10529     Comp.isBrackets = true;
10530     Comp.LocStart = ON.getSourceRange().getBegin();
10531     Comp.LocEnd = ON.getSourceRange().getEnd();
10532     switch (ON.getKind()) {
10533     case OffsetOfNode::Array: {
10534       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10535       ExprResult Index = getDerived().TransformExpr(FromIndex);
10536       if (Index.isInvalid())
10537         return ExprError();
10538 
10539       ExprChanged = ExprChanged || Index.get() != FromIndex;
10540       Comp.isBrackets = true;
10541       Comp.U.E = Index.get();
10542       break;
10543     }
10544 
10545     case OffsetOfNode::Field:
10546     case OffsetOfNode::Identifier:
10547       Comp.isBrackets = false;
10548       Comp.U.IdentInfo = ON.getFieldName();
10549       if (!Comp.U.IdentInfo)
10550         continue;
10551 
10552       break;
10553 
10554     case OffsetOfNode::Base:
10555       // Will be recomputed during the rebuild.
10556       continue;
10557     }
10558 
10559     Components.push_back(Comp);
10560   }
10561 
10562   // If nothing changed, retain the existing expression.
10563   if (!getDerived().AlwaysRebuild() &&
10564       Type == E->getTypeSourceInfo() &&
10565       !ExprChanged)
10566     return E;
10567 
10568   // Build a new offsetof expression.
10569   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10570                                           Components, E->getRParenLoc());
10571 }
10572 
10573 template<typename Derived>
10574 ExprResult
10575 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10576   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10577          "opaque value expression requires transformation");
10578   return E;
10579 }
10580 
10581 template<typename Derived>
10582 ExprResult
10583 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10584   return E;
10585 }
10586 
10587 template <typename Derived>
10588 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10589   llvm::SmallVector<Expr *, 8> Children;
10590   bool Changed = false;
10591   for (Expr *C : E->subExpressions()) {
10592     ExprResult NewC = getDerived().TransformExpr(C);
10593     if (NewC.isInvalid())
10594       return ExprError();
10595     Children.push_back(NewC.get());
10596 
10597     Changed |= NewC.get() != C;
10598   }
10599   if (!getDerived().AlwaysRebuild() && !Changed)
10600     return E;
10601   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10602                                           Children, E->getType());
10603 }
10604 
10605 template<typename Derived>
10606 ExprResult
10607 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10608   // Rebuild the syntactic form.  The original syntactic form has
10609   // opaque-value expressions in it, so strip those away and rebuild
10610   // the result.  This is a really awful way of doing this, but the
10611   // better solution (rebuilding the semantic expressions and
10612   // rebinding OVEs as necessary) doesn't work; we'd need
10613   // TreeTransform to not strip away implicit conversions.
10614   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10615   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10616   if (result.isInvalid()) return ExprError();
10617 
10618   // If that gives us a pseudo-object result back, the pseudo-object
10619   // expression must have been an lvalue-to-rvalue conversion which we
10620   // should reapply.
10621   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10622     result = SemaRef.checkPseudoObjectRValue(result.get());
10623 
10624   return result;
10625 }
10626 
10627 template<typename Derived>
10628 ExprResult
10629 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10630                                                 UnaryExprOrTypeTraitExpr *E) {
10631   if (E->isArgumentType()) {
10632     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10633 
10634     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10635     if (!NewT)
10636       return ExprError();
10637 
10638     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10639       return E;
10640 
10641     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10642                                                     E->getKind(),
10643                                                     E->getSourceRange());
10644   }
10645 
10646   // C++0x [expr.sizeof]p1:
10647   //   The operand is either an expression, which is an unevaluated operand
10648   //   [...]
10649   EnterExpressionEvaluationContext Unevaluated(
10650       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10651       Sema::ReuseLambdaContextDecl);
10652 
10653   // Try to recover if we have something like sizeof(T::X) where X is a type.
10654   // Notably, there must be *exactly* one set of parens if X is a type.
10655   TypeSourceInfo *RecoveryTSI = nullptr;
10656   ExprResult SubExpr;
10657   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10658   if (auto *DRE =
10659           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10660     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10661         PE, DRE, false, &RecoveryTSI);
10662   else
10663     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10664 
10665   if (RecoveryTSI) {
10666     return getDerived().RebuildUnaryExprOrTypeTrait(
10667         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10668   } else if (SubExpr.isInvalid())
10669     return ExprError();
10670 
10671   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10672     return E;
10673 
10674   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10675                                                   E->getOperatorLoc(),
10676                                                   E->getKind(),
10677                                                   E->getSourceRange());
10678 }
10679 
10680 template<typename Derived>
10681 ExprResult
10682 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10683   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10684   if (LHS.isInvalid())
10685     return ExprError();
10686 
10687   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10688   if (RHS.isInvalid())
10689     return ExprError();
10690 
10691 
10692   if (!getDerived().AlwaysRebuild() &&
10693       LHS.get() == E->getLHS() &&
10694       RHS.get() == E->getRHS())
10695     return E;
10696 
10697   return getDerived().RebuildArraySubscriptExpr(
10698       LHS.get(),
10699       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10700 }
10701 
10702 template <typename Derived>
10703 ExprResult
10704 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10705   ExprResult Base = getDerived().TransformExpr(E->getBase());
10706   if (Base.isInvalid())
10707     return ExprError();
10708 
10709   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10710   if (RowIdx.isInvalid())
10711     return ExprError();
10712 
10713   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10714   if (ColumnIdx.isInvalid())
10715     return ExprError();
10716 
10717   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10718       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10719     return E;
10720 
10721   return getDerived().RebuildMatrixSubscriptExpr(
10722       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10723 }
10724 
10725 template <typename Derived>
10726 ExprResult
10727 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10728   ExprResult Base = getDerived().TransformExpr(E->getBase());
10729   if (Base.isInvalid())
10730     return ExprError();
10731 
10732   ExprResult LowerBound;
10733   if (E->getLowerBound()) {
10734     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10735     if (LowerBound.isInvalid())
10736       return ExprError();
10737   }
10738 
10739   ExprResult Length;
10740   if (E->getLength()) {
10741     Length = getDerived().TransformExpr(E->getLength());
10742     if (Length.isInvalid())
10743       return ExprError();
10744   }
10745 
10746   ExprResult Stride;
10747   if (Expr *Str = E->getStride()) {
10748     Stride = getDerived().TransformExpr(Str);
10749     if (Stride.isInvalid())
10750       return ExprError();
10751   }
10752 
10753   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10754       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10755     return E;
10756 
10757   return getDerived().RebuildOMPArraySectionExpr(
10758       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10759       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10760       E->getRBracketLoc());
10761 }
10762 
10763 template <typename Derived>
10764 ExprResult
10765 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10766   ExprResult Base = getDerived().TransformExpr(E->getBase());
10767   if (Base.isInvalid())
10768     return ExprError();
10769 
10770   SmallVector<Expr *, 4> Dims;
10771   bool ErrorFound = false;
10772   for (Expr *Dim : E->getDimensions()) {
10773     ExprResult DimRes = getDerived().TransformExpr(Dim);
10774     if (DimRes.isInvalid()) {
10775       ErrorFound = true;
10776       continue;
10777     }
10778     Dims.push_back(DimRes.get());
10779   }
10780 
10781   if (ErrorFound)
10782     return ExprError();
10783   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10784                                                  E->getRParenLoc(), Dims,
10785                                                  E->getBracketsRanges());
10786 }
10787 
10788 template <typename Derived>
10789 ExprResult
10790 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10791   unsigned NumIterators = E->numOfIterators();
10792   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10793 
10794   bool ErrorFound = false;
10795   bool NeedToRebuild = getDerived().AlwaysRebuild();
10796   for (unsigned I = 0; I < NumIterators; ++I) {
10797     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10798     Data[I].DeclIdent = D->getIdentifier();
10799     Data[I].DeclIdentLoc = D->getLocation();
10800     if (D->getLocation() == D->getBeginLoc()) {
10801       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10802              "Implicit type must be int.");
10803     } else {
10804       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10805       QualType DeclTy = getDerived().TransformType(D->getType());
10806       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10807     }
10808     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10809     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10810     ExprResult End = getDerived().TransformExpr(Range.End);
10811     ExprResult Step = getDerived().TransformExpr(Range.Step);
10812     ErrorFound = ErrorFound ||
10813                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10814                                                !Data[I].Type.get().isNull())) ||
10815                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10816     if (ErrorFound)
10817       continue;
10818     Data[I].Range.Begin = Begin.get();
10819     Data[I].Range.End = End.get();
10820     Data[I].Range.Step = Step.get();
10821     Data[I].AssignLoc = E->getAssignLoc(I);
10822     Data[I].ColonLoc = E->getColonLoc(I);
10823     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10824     NeedToRebuild =
10825         NeedToRebuild ||
10826         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10827                                        D->getType().getTypePtrOrNull()) ||
10828         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10829         Range.Step != Data[I].Range.Step;
10830   }
10831   if (ErrorFound)
10832     return ExprError();
10833   if (!NeedToRebuild)
10834     return E;
10835 
10836   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10837       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10838   if (!Res.isUsable())
10839     return Res;
10840   auto *IE = cast<OMPIteratorExpr>(Res.get());
10841   for (unsigned I = 0; I < NumIterators; ++I)
10842     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10843                                       IE->getIteratorDecl(I));
10844   return Res;
10845 }
10846 
10847 template<typename Derived>
10848 ExprResult
10849 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10850   // Transform the callee.
10851   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10852   if (Callee.isInvalid())
10853     return ExprError();
10854 
10855   // Transform arguments.
10856   bool ArgChanged = false;
10857   SmallVector<Expr*, 8> Args;
10858   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10859                                   &ArgChanged))
10860     return ExprError();
10861 
10862   if (!getDerived().AlwaysRebuild() &&
10863       Callee.get() == E->getCallee() &&
10864       !ArgChanged)
10865     return SemaRef.MaybeBindToTemporary(E);
10866 
10867   // FIXME: Wrong source location information for the '('.
10868   SourceLocation FakeLParenLoc
10869     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10870 
10871   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10872   if (E->hasStoredFPFeatures()) {
10873     FPOptionsOverride NewOverrides = E->getFPFeatures();
10874     getSema().CurFPFeatures =
10875         NewOverrides.applyOverrides(getSema().getLangOpts());
10876     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10877   }
10878 
10879   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10880                                       Args,
10881                                       E->getRParenLoc());
10882 }
10883 
10884 template<typename Derived>
10885 ExprResult
10886 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10887   ExprResult Base = getDerived().TransformExpr(E->getBase());
10888   if (Base.isInvalid())
10889     return ExprError();
10890 
10891   NestedNameSpecifierLoc QualifierLoc;
10892   if (E->hasQualifier()) {
10893     QualifierLoc
10894       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10895 
10896     if (!QualifierLoc)
10897       return ExprError();
10898   }
10899   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10900 
10901   ValueDecl *Member
10902     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10903                                                          E->getMemberDecl()));
10904   if (!Member)
10905     return ExprError();
10906 
10907   NamedDecl *FoundDecl = E->getFoundDecl();
10908   if (FoundDecl == E->getMemberDecl()) {
10909     FoundDecl = Member;
10910   } else {
10911     FoundDecl = cast_or_null<NamedDecl>(
10912                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10913     if (!FoundDecl)
10914       return ExprError();
10915   }
10916 
10917   if (!getDerived().AlwaysRebuild() &&
10918       Base.get() == E->getBase() &&
10919       QualifierLoc == E->getQualifierLoc() &&
10920       Member == E->getMemberDecl() &&
10921       FoundDecl == E->getFoundDecl() &&
10922       !E->hasExplicitTemplateArgs()) {
10923 
10924     // Mark it referenced in the new context regardless.
10925     // FIXME: this is a bit instantiation-specific.
10926     SemaRef.MarkMemberReferenced(E);
10927 
10928     return E;
10929   }
10930 
10931   TemplateArgumentListInfo TransArgs;
10932   if (E->hasExplicitTemplateArgs()) {
10933     TransArgs.setLAngleLoc(E->getLAngleLoc());
10934     TransArgs.setRAngleLoc(E->getRAngleLoc());
10935     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10936                                                 E->getNumTemplateArgs(),
10937                                                 TransArgs))
10938       return ExprError();
10939   }
10940 
10941   // FIXME: Bogus source location for the operator
10942   SourceLocation FakeOperatorLoc =
10943       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10944 
10945   // FIXME: to do this check properly, we will need to preserve the
10946   // first-qualifier-in-scope here, just in case we had a dependent
10947   // base (and therefore couldn't do the check) and a
10948   // nested-name-qualifier (and therefore could do the lookup).
10949   NamedDecl *FirstQualifierInScope = nullptr;
10950   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10951   if (MemberNameInfo.getName()) {
10952     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10953     if (!MemberNameInfo.getName())
10954       return ExprError();
10955   }
10956 
10957   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10958                                         E->isArrow(),
10959                                         QualifierLoc,
10960                                         TemplateKWLoc,
10961                                         MemberNameInfo,
10962                                         Member,
10963                                         FoundDecl,
10964                                         (E->hasExplicitTemplateArgs()
10965                                            ? &TransArgs : nullptr),
10966                                         FirstQualifierInScope);
10967 }
10968 
10969 template<typename Derived>
10970 ExprResult
10971 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10972   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10973   if (LHS.isInvalid())
10974     return ExprError();
10975 
10976   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10977   if (RHS.isInvalid())
10978     return ExprError();
10979 
10980   if (!getDerived().AlwaysRebuild() &&
10981       LHS.get() == E->getLHS() &&
10982       RHS.get() == E->getRHS())
10983     return E;
10984 
10985   if (E->isCompoundAssignmentOp())
10986     // FPFeatures has already been established from trailing storage
10987     return getDerived().RebuildBinaryOperator(
10988         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10989   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10990   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10991   getSema().CurFPFeatures =
10992       NewOverrides.applyOverrides(getSema().getLangOpts());
10993   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10994   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10995                                             LHS.get(), RHS.get());
10996 }
10997 
10998 template <typename Derived>
10999 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11000     CXXRewrittenBinaryOperator *E) {
11001   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11002 
11003   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11004   if (LHS.isInvalid())
11005     return ExprError();
11006 
11007   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11008   if (RHS.isInvalid())
11009     return ExprError();
11010 
11011   // Extract the already-resolved callee declarations so that we can restrict
11012   // ourselves to using them as the unqualified lookup results when rebuilding.
11013   UnresolvedSet<2> UnqualLookups;
11014   bool ChangedAnyLookups = false;
11015   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11016                             const_cast<Expr *>(Decomp.InnerBinOp)};
11017   for (Expr *PossibleBinOp : PossibleBinOps) {
11018     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11019     if (!Op)
11020       continue;
11021     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11022     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11023       continue;
11024 
11025     // Transform the callee in case we built a call to a local extern
11026     // declaration.
11027     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11028         E->getOperatorLoc(), Callee->getFoundDecl()));
11029     if (!Found)
11030       return ExprError();
11031     if (Found != Callee->getFoundDecl())
11032       ChangedAnyLookups = true;
11033     UnqualLookups.addDecl(Found);
11034   }
11035 
11036   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11037       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11038     // Mark all functions used in the rewrite as referenced. Note that when
11039     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11040     // function calls, and/or there might be a user-defined conversion sequence
11041     // applied to the operands of the <.
11042     // FIXME: this is a bit instantiation-specific.
11043     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11044     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11045     return E;
11046   }
11047 
11048   return getDerived().RebuildCXXRewrittenBinaryOperator(
11049       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11050 }
11051 
11052 template<typename Derived>
11053 ExprResult
11054 TreeTransform<Derived>::TransformCompoundAssignOperator(
11055                                                       CompoundAssignOperator *E) {
11056   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11057   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11058   getSema().CurFPFeatures =
11059       NewOverrides.applyOverrides(getSema().getLangOpts());
11060   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11061   return getDerived().TransformBinaryOperator(E);
11062 }
11063 
11064 template<typename Derived>
11065 ExprResult TreeTransform<Derived>::
11066 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11067   // Just rebuild the common and RHS expressions and see whether we
11068   // get any changes.
11069 
11070   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11071   if (commonExpr.isInvalid())
11072     return ExprError();
11073 
11074   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11075   if (rhs.isInvalid())
11076     return ExprError();
11077 
11078   if (!getDerived().AlwaysRebuild() &&
11079       commonExpr.get() == e->getCommon() &&
11080       rhs.get() == e->getFalseExpr())
11081     return e;
11082 
11083   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11084                                                  e->getQuestionLoc(),
11085                                                  nullptr,
11086                                                  e->getColonLoc(),
11087                                                  rhs.get());
11088 }
11089 
11090 template<typename Derived>
11091 ExprResult
11092 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11093   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11094   if (Cond.isInvalid())
11095     return ExprError();
11096 
11097   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11098   if (LHS.isInvalid())
11099     return ExprError();
11100 
11101   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11102   if (RHS.isInvalid())
11103     return ExprError();
11104 
11105   if (!getDerived().AlwaysRebuild() &&
11106       Cond.get() == E->getCond() &&
11107       LHS.get() == E->getLHS() &&
11108       RHS.get() == E->getRHS())
11109     return E;
11110 
11111   return getDerived().RebuildConditionalOperator(Cond.get(),
11112                                                  E->getQuestionLoc(),
11113                                                  LHS.get(),
11114                                                  E->getColonLoc(),
11115                                                  RHS.get());
11116 }
11117 
11118 template<typename Derived>
11119 ExprResult
11120 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11121   // Implicit casts are eliminated during transformation, since they
11122   // will be recomputed by semantic analysis after transformation.
11123   return getDerived().TransformExpr(E->getSubExprAsWritten());
11124 }
11125 
11126 template<typename Derived>
11127 ExprResult
11128 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11129   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11130   if (!Type)
11131     return ExprError();
11132 
11133   ExprResult SubExpr
11134     = getDerived().TransformExpr(E->getSubExprAsWritten());
11135   if (SubExpr.isInvalid())
11136     return ExprError();
11137 
11138   if (!getDerived().AlwaysRebuild() &&
11139       Type == E->getTypeInfoAsWritten() &&
11140       SubExpr.get() == E->getSubExpr())
11141     return E;
11142 
11143   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11144                                             Type,
11145                                             E->getRParenLoc(),
11146                                             SubExpr.get());
11147 }
11148 
11149 template<typename Derived>
11150 ExprResult
11151 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11152   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11153   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11154   if (!NewT)
11155     return ExprError();
11156 
11157   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11158   if (Init.isInvalid())
11159     return ExprError();
11160 
11161   if (!getDerived().AlwaysRebuild() &&
11162       OldT == NewT &&
11163       Init.get() == E->getInitializer())
11164     return SemaRef.MaybeBindToTemporary(E);
11165 
11166   // Note: the expression type doesn't necessarily match the
11167   // type-as-written, but that's okay, because it should always be
11168   // derivable from the initializer.
11169 
11170   return getDerived().RebuildCompoundLiteralExpr(
11171       E->getLParenLoc(), NewT,
11172       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11173 }
11174 
11175 template<typename Derived>
11176 ExprResult
11177 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11178   ExprResult Base = getDerived().TransformExpr(E->getBase());
11179   if (Base.isInvalid())
11180     return ExprError();
11181 
11182   if (!getDerived().AlwaysRebuild() &&
11183       Base.get() == E->getBase())
11184     return E;
11185 
11186   // FIXME: Bad source location
11187   SourceLocation FakeOperatorLoc =
11188       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11189   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11190                                                   E->getAccessorLoc(),
11191                                                   E->getAccessor());
11192 }
11193 
11194 template<typename Derived>
11195 ExprResult
11196 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11197   if (InitListExpr *Syntactic = E->getSyntacticForm())
11198     E = Syntactic;
11199 
11200   bool InitChanged = false;
11201 
11202   EnterExpressionEvaluationContext Context(
11203       getSema(), EnterExpressionEvaluationContext::InitList);
11204 
11205   SmallVector<Expr*, 4> Inits;
11206   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11207                                   Inits, &InitChanged))
11208     return ExprError();
11209 
11210   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11211     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11212     // in some cases. We can't reuse it in general, because the syntactic and
11213     // semantic forms are linked, and we can't know that semantic form will
11214     // match even if the syntactic form does.
11215   }
11216 
11217   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11218                                       E->getRBraceLoc());
11219 }
11220 
11221 template<typename Derived>
11222 ExprResult
11223 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11224   Designation Desig;
11225 
11226   // transform the initializer value
11227   ExprResult Init = getDerived().TransformExpr(E->getInit());
11228   if (Init.isInvalid())
11229     return ExprError();
11230 
11231   // transform the designators.
11232   SmallVector<Expr*, 4> ArrayExprs;
11233   bool ExprChanged = false;
11234   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11235     if (D.isFieldDesignator()) {
11236       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11237                                                D.getDotLoc(),
11238                                                D.getFieldLoc()));
11239       if (D.getField()) {
11240         FieldDecl *Field = cast_or_null<FieldDecl>(
11241             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11242         if (Field != D.getField())
11243           // Rebuild the expression when the transformed FieldDecl is
11244           // different to the already assigned FieldDecl.
11245           ExprChanged = true;
11246       } else {
11247         // Ensure that the designator expression is rebuilt when there isn't
11248         // a resolved FieldDecl in the designator as we don't want to assign
11249         // a FieldDecl to a pattern designator that will be instantiated again.
11250         ExprChanged = true;
11251       }
11252       continue;
11253     }
11254 
11255     if (D.isArrayDesignator()) {
11256       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11257       if (Index.isInvalid())
11258         return ExprError();
11259 
11260       Desig.AddDesignator(
11261           Designator::getArray(Index.get(), D.getLBracketLoc()));
11262 
11263       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11264       ArrayExprs.push_back(Index.get());
11265       continue;
11266     }
11267 
11268     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11269     ExprResult Start
11270       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11271     if (Start.isInvalid())
11272       return ExprError();
11273 
11274     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11275     if (End.isInvalid())
11276       return ExprError();
11277 
11278     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11279                                                   End.get(),
11280                                                   D.getLBracketLoc(),
11281                                                   D.getEllipsisLoc()));
11282 
11283     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11284                   End.get() != E->getArrayRangeEnd(D);
11285 
11286     ArrayExprs.push_back(Start.get());
11287     ArrayExprs.push_back(End.get());
11288   }
11289 
11290   if (!getDerived().AlwaysRebuild() &&
11291       Init.get() == E->getInit() &&
11292       !ExprChanged)
11293     return E;
11294 
11295   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11296                                                 E->getEqualOrColonLoc(),
11297                                                 E->usesGNUSyntax(), Init.get());
11298 }
11299 
11300 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11301 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11302 template<typename Derived>
11303 ExprResult
11304 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11305     DesignatedInitUpdateExpr *E) {
11306   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11307                    "initializer");
11308   return ExprError();
11309 }
11310 
11311 template<typename Derived>
11312 ExprResult
11313 TreeTransform<Derived>::TransformNoInitExpr(
11314     NoInitExpr *E) {
11315   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11316   return ExprError();
11317 }
11318 
11319 template<typename Derived>
11320 ExprResult
11321 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11322   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11323   return ExprError();
11324 }
11325 
11326 template<typename Derived>
11327 ExprResult
11328 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11329   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11330   return ExprError();
11331 }
11332 
11333 template<typename Derived>
11334 ExprResult
11335 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11336                                                      ImplicitValueInitExpr *E) {
11337   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11338 
11339   // FIXME: Will we ever have proper type location here? Will we actually
11340   // need to transform the type?
11341   QualType T = getDerived().TransformType(E->getType());
11342   if (T.isNull())
11343     return ExprError();
11344 
11345   if (!getDerived().AlwaysRebuild() &&
11346       T == E->getType())
11347     return E;
11348 
11349   return getDerived().RebuildImplicitValueInitExpr(T);
11350 }
11351 
11352 template<typename Derived>
11353 ExprResult
11354 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11355   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11356   if (!TInfo)
11357     return ExprError();
11358 
11359   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11360   if (SubExpr.isInvalid())
11361     return ExprError();
11362 
11363   if (!getDerived().AlwaysRebuild() &&
11364       TInfo == E->getWrittenTypeInfo() &&
11365       SubExpr.get() == E->getSubExpr())
11366     return E;
11367 
11368   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11369                                        TInfo, E->getRParenLoc());
11370 }
11371 
11372 template<typename Derived>
11373 ExprResult
11374 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11375   bool ArgumentChanged = false;
11376   SmallVector<Expr*, 4> Inits;
11377   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11378                      &ArgumentChanged))
11379     return ExprError();
11380 
11381   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11382                                            Inits,
11383                                            E->getRParenLoc());
11384 }
11385 
11386 /// Transform an address-of-label expression.
11387 ///
11388 /// By default, the transformation of an address-of-label expression always
11389 /// rebuilds the expression, so that the label identifier can be resolved to
11390 /// the corresponding label statement by semantic analysis.
11391 template<typename Derived>
11392 ExprResult
11393 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11394   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11395                                         E->getLabel());
11396   if (!LD)
11397     return ExprError();
11398 
11399   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11400                                            cast<LabelDecl>(LD));
11401 }
11402 
11403 template<typename Derived>
11404 ExprResult
11405 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11406   SemaRef.ActOnStartStmtExpr();
11407   StmtResult SubStmt
11408     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11409   if (SubStmt.isInvalid()) {
11410     SemaRef.ActOnStmtExprError();
11411     return ExprError();
11412   }
11413 
11414   unsigned OldDepth = E->getTemplateDepth();
11415   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11416 
11417   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11418       SubStmt.get() == E->getSubStmt()) {
11419     // Calling this an 'error' is unintuitive, but it does the right thing.
11420     SemaRef.ActOnStmtExprError();
11421     return SemaRef.MaybeBindToTemporary(E);
11422   }
11423 
11424   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11425                                       E->getRParenLoc(), NewDepth);
11426 }
11427 
11428 template<typename Derived>
11429 ExprResult
11430 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11431   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11432   if (Cond.isInvalid())
11433     return ExprError();
11434 
11435   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11436   if (LHS.isInvalid())
11437     return ExprError();
11438 
11439   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11440   if (RHS.isInvalid())
11441     return ExprError();
11442 
11443   if (!getDerived().AlwaysRebuild() &&
11444       Cond.get() == E->getCond() &&
11445       LHS.get() == E->getLHS() &&
11446       RHS.get() == E->getRHS())
11447     return E;
11448 
11449   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11450                                         Cond.get(), LHS.get(), RHS.get(),
11451                                         E->getRParenLoc());
11452 }
11453 
11454 template<typename Derived>
11455 ExprResult
11456 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11457   return E;
11458 }
11459 
11460 template<typename Derived>
11461 ExprResult
11462 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11463   switch (E->getOperator()) {
11464   case OO_New:
11465   case OO_Delete:
11466   case OO_Array_New:
11467   case OO_Array_Delete:
11468     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11469 
11470   case OO_Call: {
11471     // This is a call to an object's operator().
11472     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11473 
11474     // Transform the object itself.
11475     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11476     if (Object.isInvalid())
11477       return ExprError();
11478 
11479     // FIXME: Poor location information
11480     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11481         static_cast<Expr *>(Object.get())->getEndLoc());
11482 
11483     // Transform the call arguments.
11484     SmallVector<Expr*, 8> Args;
11485     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11486                                     Args))
11487       return ExprError();
11488 
11489     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11490                                         E->getEndLoc());
11491   }
11492 
11493 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11494   case OO_##Name:
11495 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11496 #include "clang/Basic/OperatorKinds.def"
11497   case OO_Subscript:
11498     // Handled below.
11499     break;
11500 
11501   case OO_Conditional:
11502     llvm_unreachable("conditional operator is not actually overloadable");
11503 
11504   case OO_None:
11505   case NUM_OVERLOADED_OPERATORS:
11506     llvm_unreachable("not an overloaded operator?");
11507   }
11508 
11509   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11510   if (Callee.isInvalid())
11511     return ExprError();
11512 
11513   ExprResult First;
11514   if (E->getOperator() == OO_Amp)
11515     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11516   else
11517     First = getDerived().TransformExpr(E->getArg(0));
11518   if (First.isInvalid())
11519     return ExprError();
11520 
11521   ExprResult Second;
11522   if (E->getNumArgs() == 2) {
11523     Second = getDerived().TransformExpr(E->getArg(1));
11524     if (Second.isInvalid())
11525       return ExprError();
11526   }
11527 
11528   if (!getDerived().AlwaysRebuild() &&
11529       Callee.get() == E->getCallee() &&
11530       First.get() == E->getArg(0) &&
11531       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11532     return SemaRef.MaybeBindToTemporary(E);
11533 
11534   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11535   FPOptionsOverride NewOverrides(E->getFPFeatures());
11536   getSema().CurFPFeatures =
11537       NewOverrides.applyOverrides(getSema().getLangOpts());
11538   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11539 
11540   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11541                                                  E->getOperatorLoc(),
11542                                                  Callee.get(),
11543                                                  First.get(),
11544                                                  Second.get());
11545 }
11546 
11547 template<typename Derived>
11548 ExprResult
11549 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11550   return getDerived().TransformCallExpr(E);
11551 }
11552 
11553 template <typename Derived>
11554 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11555   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11556                          getSema().CurContext != E->getParentContext();
11557 
11558   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11559     return E;
11560 
11561   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11562                                            E->getEndLoc(),
11563                                            getSema().CurContext);
11564 }
11565 
11566 template<typename Derived>
11567 ExprResult
11568 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11569   // Transform the callee.
11570   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11571   if (Callee.isInvalid())
11572     return ExprError();
11573 
11574   // Transform exec config.
11575   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11576   if (EC.isInvalid())
11577     return ExprError();
11578 
11579   // Transform arguments.
11580   bool ArgChanged = false;
11581   SmallVector<Expr*, 8> Args;
11582   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11583                                   &ArgChanged))
11584     return ExprError();
11585 
11586   if (!getDerived().AlwaysRebuild() &&
11587       Callee.get() == E->getCallee() &&
11588       !ArgChanged)
11589     return SemaRef.MaybeBindToTemporary(E);
11590 
11591   // FIXME: Wrong source location information for the '('.
11592   SourceLocation FakeLParenLoc
11593     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11594   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11595                                       Args,
11596                                       E->getRParenLoc(), EC.get());
11597 }
11598 
11599 template<typename Derived>
11600 ExprResult
11601 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11602   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11603   if (!Type)
11604     return ExprError();
11605 
11606   ExprResult SubExpr
11607     = getDerived().TransformExpr(E->getSubExprAsWritten());
11608   if (SubExpr.isInvalid())
11609     return ExprError();
11610 
11611   if (!getDerived().AlwaysRebuild() &&
11612       Type == E->getTypeInfoAsWritten() &&
11613       SubExpr.get() == E->getSubExpr())
11614     return E;
11615   return getDerived().RebuildCXXNamedCastExpr(
11616       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11617       Type, E->getAngleBrackets().getEnd(),
11618       // FIXME. this should be '(' location
11619       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11620 }
11621 
11622 template<typename Derived>
11623 ExprResult
11624 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11625   TypeSourceInfo *TSI =
11626       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11627   if (!TSI)
11628     return ExprError();
11629 
11630   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11631   if (Sub.isInvalid())
11632     return ExprError();
11633 
11634   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11635                                                 Sub.get(), BCE->getEndLoc());
11636 }
11637 
11638 template<typename Derived>
11639 ExprResult
11640 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11641   return getDerived().TransformCXXNamedCastExpr(E);
11642 }
11643 
11644 template<typename Derived>
11645 ExprResult
11646 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11647   return getDerived().TransformCXXNamedCastExpr(E);
11648 }
11649 
11650 template<typename Derived>
11651 ExprResult
11652 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11653                                                       CXXReinterpretCastExpr *E) {
11654   return getDerived().TransformCXXNamedCastExpr(E);
11655 }
11656 
11657 template<typename Derived>
11658 ExprResult
11659 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11660   return getDerived().TransformCXXNamedCastExpr(E);
11661 }
11662 
11663 template<typename Derived>
11664 ExprResult
11665 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11666   return getDerived().TransformCXXNamedCastExpr(E);
11667 }
11668 
11669 template<typename Derived>
11670 ExprResult
11671 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11672                                                      CXXFunctionalCastExpr *E) {
11673   TypeSourceInfo *Type =
11674       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11675   if (!Type)
11676     return ExprError();
11677 
11678   ExprResult SubExpr
11679     = getDerived().TransformExpr(E->getSubExprAsWritten());
11680   if (SubExpr.isInvalid())
11681     return ExprError();
11682 
11683   if (!getDerived().AlwaysRebuild() &&
11684       Type == E->getTypeInfoAsWritten() &&
11685       SubExpr.get() == E->getSubExpr())
11686     return E;
11687 
11688   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11689                                                    E->getLParenLoc(),
11690                                                    SubExpr.get(),
11691                                                    E->getRParenLoc(),
11692                                                    E->isListInitialization());
11693 }
11694 
11695 template<typename Derived>
11696 ExprResult
11697 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11698   if (E->isTypeOperand()) {
11699     TypeSourceInfo *TInfo
11700       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11701     if (!TInfo)
11702       return ExprError();
11703 
11704     if (!getDerived().AlwaysRebuild() &&
11705         TInfo == E->getTypeOperandSourceInfo())
11706       return E;
11707 
11708     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11709                                              TInfo, E->getEndLoc());
11710   }
11711 
11712   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11713   // type.  We must not unilaterally enter unevaluated context here, as then
11714   // semantic processing can re-transform an already transformed operand.
11715   Expr *Op = E->getExprOperand();
11716   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11717   if (E->isGLValue())
11718     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11719       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11720         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11721 
11722   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11723                                                Sema::ReuseLambdaContextDecl);
11724 
11725   ExprResult SubExpr = getDerived().TransformExpr(Op);
11726   if (SubExpr.isInvalid())
11727     return ExprError();
11728 
11729   if (!getDerived().AlwaysRebuild() &&
11730       SubExpr.get() == E->getExprOperand())
11731     return E;
11732 
11733   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11734                                            SubExpr.get(), E->getEndLoc());
11735 }
11736 
11737 template<typename Derived>
11738 ExprResult
11739 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11740   if (E->isTypeOperand()) {
11741     TypeSourceInfo *TInfo
11742       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11743     if (!TInfo)
11744       return ExprError();
11745 
11746     if (!getDerived().AlwaysRebuild() &&
11747         TInfo == E->getTypeOperandSourceInfo())
11748       return E;
11749 
11750     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11751                                              TInfo, E->getEndLoc());
11752   }
11753 
11754   EnterExpressionEvaluationContext Unevaluated(
11755       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11756 
11757   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11758   if (SubExpr.isInvalid())
11759     return ExprError();
11760 
11761   if (!getDerived().AlwaysRebuild() &&
11762       SubExpr.get() == E->getExprOperand())
11763     return E;
11764 
11765   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11766                                            SubExpr.get(), E->getEndLoc());
11767 }
11768 
11769 template<typename Derived>
11770 ExprResult
11771 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11772   return E;
11773 }
11774 
11775 template<typename Derived>
11776 ExprResult
11777 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11778                                                      CXXNullPtrLiteralExpr *E) {
11779   return E;
11780 }
11781 
11782 template<typename Derived>
11783 ExprResult
11784 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11785   QualType T = getSema().getCurrentThisType();
11786 
11787   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11788     // Mark it referenced in the new context regardless.
11789     // FIXME: this is a bit instantiation-specific.
11790     getSema().MarkThisReferenced(E);
11791     return E;
11792   }
11793 
11794   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11795 }
11796 
11797 template<typename Derived>
11798 ExprResult
11799 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11800   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11801   if (SubExpr.isInvalid())
11802     return ExprError();
11803 
11804   if (!getDerived().AlwaysRebuild() &&
11805       SubExpr.get() == E->getSubExpr())
11806     return E;
11807 
11808   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11809                                           E->isThrownVariableInScope());
11810 }
11811 
11812 template<typename Derived>
11813 ExprResult
11814 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11815   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11816       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11817   if (!Param)
11818     return ExprError();
11819 
11820   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11821       E->getUsedContext() == SemaRef.CurContext)
11822     return E;
11823 
11824   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11825 }
11826 
11827 template<typename Derived>
11828 ExprResult
11829 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11830   FieldDecl *Field = cast_or_null<FieldDecl>(
11831       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11832   if (!Field)
11833     return ExprError();
11834 
11835   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11836       E->getUsedContext() == SemaRef.CurContext)
11837     return E;
11838 
11839   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11840 }
11841 
11842 template<typename Derived>
11843 ExprResult
11844 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11845                                                     CXXScalarValueInitExpr *E) {
11846   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11847   if (!T)
11848     return ExprError();
11849 
11850   if (!getDerived().AlwaysRebuild() &&
11851       T == E->getTypeSourceInfo())
11852     return E;
11853 
11854   return getDerived().RebuildCXXScalarValueInitExpr(T,
11855                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11856                                                     E->getRParenLoc());
11857 }
11858 
11859 template<typename Derived>
11860 ExprResult
11861 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11862   // Transform the type that we're allocating
11863   TypeSourceInfo *AllocTypeInfo =
11864       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11865   if (!AllocTypeInfo)
11866     return ExprError();
11867 
11868   // Transform the size of the array we're allocating (if any).
11869   Optional<Expr *> ArraySize;
11870   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11871     ExprResult NewArraySize;
11872     if (*OldArraySize) {
11873       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11874       if (NewArraySize.isInvalid())
11875         return ExprError();
11876     }
11877     ArraySize = NewArraySize.get();
11878   }
11879 
11880   // Transform the placement arguments (if any).
11881   bool ArgumentChanged = false;
11882   SmallVector<Expr*, 8> PlacementArgs;
11883   if (getDerived().TransformExprs(E->getPlacementArgs(),
11884                                   E->getNumPlacementArgs(), true,
11885                                   PlacementArgs, &ArgumentChanged))
11886     return ExprError();
11887 
11888   // Transform the initializer (if any).
11889   Expr *OldInit = E->getInitializer();
11890   ExprResult NewInit;
11891   if (OldInit)
11892     NewInit = getDerived().TransformInitializer(OldInit, true);
11893   if (NewInit.isInvalid())
11894     return ExprError();
11895 
11896   // Transform new operator and delete operator.
11897   FunctionDecl *OperatorNew = nullptr;
11898   if (E->getOperatorNew()) {
11899     OperatorNew = cast_or_null<FunctionDecl>(
11900         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11901     if (!OperatorNew)
11902       return ExprError();
11903   }
11904 
11905   FunctionDecl *OperatorDelete = nullptr;
11906   if (E->getOperatorDelete()) {
11907     OperatorDelete = cast_or_null<FunctionDecl>(
11908         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11909     if (!OperatorDelete)
11910       return ExprError();
11911   }
11912 
11913   if (!getDerived().AlwaysRebuild() &&
11914       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11915       ArraySize == E->getArraySize() &&
11916       NewInit.get() == OldInit &&
11917       OperatorNew == E->getOperatorNew() &&
11918       OperatorDelete == E->getOperatorDelete() &&
11919       !ArgumentChanged) {
11920     // Mark any declarations we need as referenced.
11921     // FIXME: instantiation-specific.
11922     if (OperatorNew)
11923       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11924     if (OperatorDelete)
11925       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11926 
11927     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11928       QualType ElementType
11929         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11930       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11931         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11932         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11933           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11934         }
11935       }
11936     }
11937 
11938     return E;
11939   }
11940 
11941   QualType AllocType = AllocTypeInfo->getType();
11942   if (!ArraySize) {
11943     // If no array size was specified, but the new expression was
11944     // instantiated with an array type (e.g., "new T" where T is
11945     // instantiated with "int[4]"), extract the outer bound from the
11946     // array type as our array size. We do this with constant and
11947     // dependently-sized array types.
11948     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11949     if (!ArrayT) {
11950       // Do nothing
11951     } else if (const ConstantArrayType *ConsArrayT
11952                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11953       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11954                                          SemaRef.Context.getSizeType(),
11955                                          /*FIXME:*/ E->getBeginLoc());
11956       AllocType = ConsArrayT->getElementType();
11957     } else if (const DependentSizedArrayType *DepArrayT
11958                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11959       if (DepArrayT->getSizeExpr()) {
11960         ArraySize = DepArrayT->getSizeExpr();
11961         AllocType = DepArrayT->getElementType();
11962       }
11963     }
11964   }
11965 
11966   return getDerived().RebuildCXXNewExpr(
11967       E->getBeginLoc(), E->isGlobalNew(),
11968       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11969       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11970       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11971 }
11972 
11973 template<typename Derived>
11974 ExprResult
11975 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11976   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11977   if (Operand.isInvalid())
11978     return ExprError();
11979 
11980   // Transform the delete operator, if known.
11981   FunctionDecl *OperatorDelete = nullptr;
11982   if (E->getOperatorDelete()) {
11983     OperatorDelete = cast_or_null<FunctionDecl>(
11984         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11985     if (!OperatorDelete)
11986       return ExprError();
11987   }
11988 
11989   if (!getDerived().AlwaysRebuild() &&
11990       Operand.get() == E->getArgument() &&
11991       OperatorDelete == E->getOperatorDelete()) {
11992     // Mark any declarations we need as referenced.
11993     // FIXME: instantiation-specific.
11994     if (OperatorDelete)
11995       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11996 
11997     if (!E->getArgument()->isTypeDependent()) {
11998       QualType Destroyed = SemaRef.Context.getBaseElementType(
11999                                                          E->getDestroyedType());
12000       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12001         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12002         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12003                                        SemaRef.LookupDestructor(Record));
12004       }
12005     }
12006 
12007     return E;
12008   }
12009 
12010   return getDerived().RebuildCXXDeleteExpr(
12011       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12012 }
12013 
12014 template<typename Derived>
12015 ExprResult
12016 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12017                                                      CXXPseudoDestructorExpr *E) {
12018   ExprResult Base = getDerived().TransformExpr(E->getBase());
12019   if (Base.isInvalid())
12020     return ExprError();
12021 
12022   ParsedType ObjectTypePtr;
12023   bool MayBePseudoDestructor = false;
12024   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12025                                               E->getOperatorLoc(),
12026                                         E->isArrow()? tok::arrow : tok::period,
12027                                               ObjectTypePtr,
12028                                               MayBePseudoDestructor);
12029   if (Base.isInvalid())
12030     return ExprError();
12031 
12032   QualType ObjectType = ObjectTypePtr.get();
12033   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12034   if (QualifierLoc) {
12035     QualifierLoc
12036       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12037     if (!QualifierLoc)
12038       return ExprError();
12039   }
12040   CXXScopeSpec SS;
12041   SS.Adopt(QualifierLoc);
12042 
12043   PseudoDestructorTypeStorage Destroyed;
12044   if (E->getDestroyedTypeInfo()) {
12045     TypeSourceInfo *DestroyedTypeInfo
12046       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12047                                                 ObjectType, nullptr, SS);
12048     if (!DestroyedTypeInfo)
12049       return ExprError();
12050     Destroyed = DestroyedTypeInfo;
12051   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12052     // We aren't likely to be able to resolve the identifier down to a type
12053     // now anyway, so just retain the identifier.
12054     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12055                                             E->getDestroyedTypeLoc());
12056   } else {
12057     // Look for a destructor known with the given name.
12058     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12059                                               *E->getDestroyedTypeIdentifier(),
12060                                                 E->getDestroyedTypeLoc(),
12061                                                 /*Scope=*/nullptr,
12062                                                 SS, ObjectTypePtr,
12063                                                 false);
12064     if (!T)
12065       return ExprError();
12066 
12067     Destroyed
12068       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12069                                                  E->getDestroyedTypeLoc());
12070   }
12071 
12072   TypeSourceInfo *ScopeTypeInfo = nullptr;
12073   if (E->getScopeTypeInfo()) {
12074     CXXScopeSpec EmptySS;
12075     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12076                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12077     if (!ScopeTypeInfo)
12078       return ExprError();
12079   }
12080 
12081   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12082                                                      E->getOperatorLoc(),
12083                                                      E->isArrow(),
12084                                                      SS,
12085                                                      ScopeTypeInfo,
12086                                                      E->getColonColonLoc(),
12087                                                      E->getTildeLoc(),
12088                                                      Destroyed);
12089 }
12090 
12091 template <typename Derived>
12092 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12093                                                         bool RequiresADL,
12094                                                         LookupResult &R) {
12095   // Transform all the decls.
12096   bool AllEmptyPacks = true;
12097   for (auto *OldD : Old->decls()) {
12098     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12099     if (!InstD) {
12100       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12101       // This can happen because of dependent hiding.
12102       if (isa<UsingShadowDecl>(OldD))
12103         continue;
12104       else {
12105         R.clear();
12106         return true;
12107       }
12108     }
12109 
12110     // Expand using pack declarations.
12111     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12112     ArrayRef<NamedDecl*> Decls = SingleDecl;
12113     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12114       Decls = UPD->expansions();
12115 
12116     // Expand using declarations.
12117     for (auto *D : Decls) {
12118       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12119         for (auto *SD : UD->shadows())
12120           R.addDecl(SD);
12121       } else {
12122         R.addDecl(D);
12123       }
12124     }
12125 
12126     AllEmptyPacks &= Decls.empty();
12127   };
12128 
12129   // C++ [temp.res]/8.4.2:
12130   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12131   //   a name in the template definition found a using-declaration, but the
12132   //   lookup in the corresponding scope in the instantiation odoes not find
12133   //   any declarations because the using-declaration was a pack expansion and
12134   //   the corresponding pack is empty
12135   if (AllEmptyPacks && !RequiresADL) {
12136     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12137         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12138     return true;
12139   }
12140 
12141   // Resolve a kind, but don't do any further analysis.  If it's
12142   // ambiguous, the callee needs to deal with it.
12143   R.resolveKind();
12144   return false;
12145 }
12146 
12147 template<typename Derived>
12148 ExprResult
12149 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12150                                                   UnresolvedLookupExpr *Old) {
12151   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12152                  Sema::LookupOrdinaryName);
12153 
12154   // Transform the declaration set.
12155   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12156     return ExprError();
12157 
12158   // Rebuild the nested-name qualifier, if present.
12159   CXXScopeSpec SS;
12160   if (Old->getQualifierLoc()) {
12161     NestedNameSpecifierLoc QualifierLoc
12162       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12163     if (!QualifierLoc)
12164       return ExprError();
12165 
12166     SS.Adopt(QualifierLoc);
12167   }
12168 
12169   if (Old->getNamingClass()) {
12170     CXXRecordDecl *NamingClass
12171       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12172                                                             Old->getNameLoc(),
12173                                                         Old->getNamingClass()));
12174     if (!NamingClass) {
12175       R.clear();
12176       return ExprError();
12177     }
12178 
12179     R.setNamingClass(NamingClass);
12180   }
12181 
12182   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12183 
12184   // If we have neither explicit template arguments, nor the template keyword,
12185   // it's a normal declaration name or member reference.
12186   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12187     NamedDecl *D = R.getAsSingle<NamedDecl>();
12188     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12189     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12190     // give a good diagnostic.
12191     if (D && D->isCXXInstanceMember()) {
12192       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12193                                                      /*TemplateArgs=*/nullptr,
12194                                                      /*Scope=*/nullptr);
12195     }
12196 
12197     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12198   }
12199 
12200   // If we have template arguments, rebuild them, then rebuild the
12201   // templateid expression.
12202   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12203   if (Old->hasExplicitTemplateArgs() &&
12204       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12205                                               Old->getNumTemplateArgs(),
12206                                               TransArgs)) {
12207     R.clear();
12208     return ExprError();
12209   }
12210 
12211   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12212                                             Old->requiresADL(), &TransArgs);
12213 }
12214 
12215 template<typename Derived>
12216 ExprResult
12217 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12218   bool ArgChanged = false;
12219   SmallVector<TypeSourceInfo *, 4> Args;
12220   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12221     TypeSourceInfo *From = E->getArg(I);
12222     TypeLoc FromTL = From->getTypeLoc();
12223     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12224       TypeLocBuilder TLB;
12225       TLB.reserve(FromTL.getFullDataSize());
12226       QualType To = getDerived().TransformType(TLB, FromTL);
12227       if (To.isNull())
12228         return ExprError();
12229 
12230       if (To == From->getType())
12231         Args.push_back(From);
12232       else {
12233         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12234         ArgChanged = true;
12235       }
12236       continue;
12237     }
12238 
12239     ArgChanged = true;
12240 
12241     // We have a pack expansion. Instantiate it.
12242     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12243     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12244     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12245     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12246 
12247     // Determine whether the set of unexpanded parameter packs can and should
12248     // be expanded.
12249     bool Expand = true;
12250     bool RetainExpansion = false;
12251     Optional<unsigned> OrigNumExpansions =
12252         ExpansionTL.getTypePtr()->getNumExpansions();
12253     Optional<unsigned> NumExpansions = OrigNumExpansions;
12254     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12255                                              PatternTL.getSourceRange(),
12256                                              Unexpanded,
12257                                              Expand, RetainExpansion,
12258                                              NumExpansions))
12259       return ExprError();
12260 
12261     if (!Expand) {
12262       // The transform has determined that we should perform a simple
12263       // transformation on the pack expansion, producing another pack
12264       // expansion.
12265       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12266 
12267       TypeLocBuilder TLB;
12268       TLB.reserve(From->getTypeLoc().getFullDataSize());
12269 
12270       QualType To = getDerived().TransformType(TLB, PatternTL);
12271       if (To.isNull())
12272         return ExprError();
12273 
12274       To = getDerived().RebuildPackExpansionType(To,
12275                                                  PatternTL.getSourceRange(),
12276                                                  ExpansionTL.getEllipsisLoc(),
12277                                                  NumExpansions);
12278       if (To.isNull())
12279         return ExprError();
12280 
12281       PackExpansionTypeLoc ToExpansionTL
12282         = TLB.push<PackExpansionTypeLoc>(To);
12283       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12284       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12285       continue;
12286     }
12287 
12288     // Expand the pack expansion by substituting for each argument in the
12289     // pack(s).
12290     for (unsigned I = 0; I != *NumExpansions; ++I) {
12291       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12292       TypeLocBuilder TLB;
12293       TLB.reserve(PatternTL.getFullDataSize());
12294       QualType To = getDerived().TransformType(TLB, PatternTL);
12295       if (To.isNull())
12296         return ExprError();
12297 
12298       if (To->containsUnexpandedParameterPack()) {
12299         To = getDerived().RebuildPackExpansionType(To,
12300                                                    PatternTL.getSourceRange(),
12301                                                    ExpansionTL.getEllipsisLoc(),
12302                                                    NumExpansions);
12303         if (To.isNull())
12304           return ExprError();
12305 
12306         PackExpansionTypeLoc ToExpansionTL
12307           = TLB.push<PackExpansionTypeLoc>(To);
12308         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12309       }
12310 
12311       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12312     }
12313 
12314     if (!RetainExpansion)
12315       continue;
12316 
12317     // If we're supposed to retain a pack expansion, do so by temporarily
12318     // forgetting the partially-substituted parameter pack.
12319     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12320 
12321     TypeLocBuilder TLB;
12322     TLB.reserve(From->getTypeLoc().getFullDataSize());
12323 
12324     QualType To = getDerived().TransformType(TLB, PatternTL);
12325     if (To.isNull())
12326       return ExprError();
12327 
12328     To = getDerived().RebuildPackExpansionType(To,
12329                                                PatternTL.getSourceRange(),
12330                                                ExpansionTL.getEllipsisLoc(),
12331                                                NumExpansions);
12332     if (To.isNull())
12333       return ExprError();
12334 
12335     PackExpansionTypeLoc ToExpansionTL
12336       = TLB.push<PackExpansionTypeLoc>(To);
12337     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12338     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12339   }
12340 
12341   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12342     return E;
12343 
12344   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12345                                        E->getEndLoc());
12346 }
12347 
12348 template<typename Derived>
12349 ExprResult
12350 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12351                                                  ConceptSpecializationExpr *E) {
12352   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12353   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12354   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12355                                               Old->NumTemplateArgs, TransArgs))
12356     return ExprError();
12357 
12358   return getDerived().RebuildConceptSpecializationExpr(
12359       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12360       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12361       &TransArgs);
12362 }
12363 
12364 template<typename Derived>
12365 ExprResult
12366 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12367   SmallVector<ParmVarDecl*, 4> TransParams;
12368   SmallVector<QualType, 4> TransParamTypes;
12369   Sema::ExtParameterInfoBuilder ExtParamInfos;
12370 
12371   // C++2a [expr.prim.req]p2
12372   // Expressions appearing within a requirement-body are unevaluated operands.
12373   EnterExpressionEvaluationContext Ctx(
12374       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12375 
12376   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12377       getSema().Context, getSema().CurContext,
12378       E->getBody()->getBeginLoc());
12379 
12380   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12381 
12382   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12383                                                E->getLocalParameters(),
12384                                                /*ParamTypes=*/nullptr,
12385                                                /*ParamInfos=*/nullptr,
12386                                                TransParamTypes, &TransParams,
12387                                                ExtParamInfos))
12388     return ExprError();
12389 
12390   for (ParmVarDecl *Param : TransParams)
12391     Param->setDeclContext(Body);
12392 
12393   SmallVector<concepts::Requirement *, 4> TransReqs;
12394   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12395                                                      TransReqs))
12396     return ExprError();
12397 
12398   for (concepts::Requirement *Req : TransReqs) {
12399     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12400       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12401         ER->getReturnTypeRequirement()
12402                 .getTypeConstraintTemplateParameterList()->getParam(0)
12403                 ->setDeclContext(Body);
12404       }
12405     }
12406   }
12407 
12408   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12409                                           TransParams, TransReqs,
12410                                           E->getRBraceLoc());
12411 }
12412 
12413 template<typename Derived>
12414 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12415     ArrayRef<concepts::Requirement *> Reqs,
12416     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12417   for (concepts::Requirement *Req : Reqs) {
12418     concepts::Requirement *TransReq = nullptr;
12419     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12420       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12421     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12422       TransReq = getDerived().TransformExprRequirement(ExprReq);
12423     else
12424       TransReq = getDerived().TransformNestedRequirement(
12425                      cast<concepts::NestedRequirement>(Req));
12426     if (!TransReq)
12427       return true;
12428     Transformed.push_back(TransReq);
12429   }
12430   return false;
12431 }
12432 
12433 template<typename Derived>
12434 concepts::TypeRequirement *
12435 TreeTransform<Derived>::TransformTypeRequirement(
12436     concepts::TypeRequirement *Req) {
12437   if (Req->isSubstitutionFailure()) {
12438     if (getDerived().AlwaysRebuild())
12439       return getDerived().RebuildTypeRequirement(
12440               Req->getSubstitutionDiagnostic());
12441     return Req;
12442   }
12443   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12444   if (!TransType)
12445     return nullptr;
12446   return getDerived().RebuildTypeRequirement(TransType);
12447 }
12448 
12449 template<typename Derived>
12450 concepts::ExprRequirement *
12451 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12452   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12453   if (Req->isExprSubstitutionFailure())
12454     TransExpr = Req->getExprSubstitutionDiagnostic();
12455   else {
12456     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12457     if (TransExprRes.isInvalid())
12458       return nullptr;
12459     TransExpr = TransExprRes.get();
12460   }
12461 
12462   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12463   const auto &RetReq = Req->getReturnTypeRequirement();
12464   if (RetReq.isEmpty())
12465     TransRetReq.emplace();
12466   else if (RetReq.isSubstitutionFailure())
12467     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12468   else if (RetReq.isTypeConstraint()) {
12469     TemplateParameterList *OrigTPL =
12470         RetReq.getTypeConstraintTemplateParameterList();
12471     TemplateParameterList *TPL =
12472         getDerived().TransformTemplateParameterList(OrigTPL);
12473     if (!TPL)
12474       return nullptr;
12475     TransRetReq.emplace(TPL);
12476   }
12477   assert(TransRetReq.hasValue() &&
12478          "All code paths leading here must set TransRetReq");
12479   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12480     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12481                                                Req->getNoexceptLoc(),
12482                                                std::move(*TransRetReq));
12483   return getDerived().RebuildExprRequirement(
12484       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12485       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12486 }
12487 
12488 template<typename Derived>
12489 concepts::NestedRequirement *
12490 TreeTransform<Derived>::TransformNestedRequirement(
12491     concepts::NestedRequirement *Req) {
12492   if (Req->isSubstitutionFailure()) {
12493     if (getDerived().AlwaysRebuild())
12494       return getDerived().RebuildNestedRequirement(
12495           Req->getSubstitutionDiagnostic());
12496     return Req;
12497   }
12498   ExprResult TransConstraint =
12499       getDerived().TransformExpr(Req->getConstraintExpr());
12500   if (TransConstraint.isInvalid())
12501     return nullptr;
12502   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12503 }
12504 
12505 template<typename Derived>
12506 ExprResult
12507 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12508   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12509   if (!T)
12510     return ExprError();
12511 
12512   if (!getDerived().AlwaysRebuild() &&
12513       T == E->getQueriedTypeSourceInfo())
12514     return E;
12515 
12516   ExprResult SubExpr;
12517   {
12518     EnterExpressionEvaluationContext Unevaluated(
12519         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12520     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12521     if (SubExpr.isInvalid())
12522       return ExprError();
12523 
12524     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12525       return E;
12526   }
12527 
12528   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12529                                             SubExpr.get(), E->getEndLoc());
12530 }
12531 
12532 template<typename Derived>
12533 ExprResult
12534 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12535   ExprResult SubExpr;
12536   {
12537     EnterExpressionEvaluationContext Unevaluated(
12538         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12539     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12540     if (SubExpr.isInvalid())
12541       return ExprError();
12542 
12543     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12544       return E;
12545   }
12546 
12547   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12548                                              SubExpr.get(), E->getEndLoc());
12549 }
12550 
12551 template <typename Derived>
12552 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12553     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12554     TypeSourceInfo **RecoveryTSI) {
12555   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12556       DRE, AddrTaken, RecoveryTSI);
12557 
12558   // Propagate both errors and recovered types, which return ExprEmpty.
12559   if (!NewDRE.isUsable())
12560     return NewDRE;
12561 
12562   // We got an expr, wrap it up in parens.
12563   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12564     return PE;
12565   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12566                                        PE->getRParen());
12567 }
12568 
12569 template <typename Derived>
12570 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12571     DependentScopeDeclRefExpr *E) {
12572   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12573                                             nullptr);
12574 }
12575 
12576 template <typename Derived>
12577 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12578     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12579     TypeSourceInfo **RecoveryTSI) {
12580   assert(E->getQualifierLoc());
12581   NestedNameSpecifierLoc QualifierLoc =
12582       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12583   if (!QualifierLoc)
12584     return ExprError();
12585   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12586 
12587   // TODO: If this is a conversion-function-id, verify that the
12588   // destination type name (if present) resolves the same way after
12589   // instantiation as it did in the local scope.
12590 
12591   DeclarationNameInfo NameInfo =
12592       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12593   if (!NameInfo.getName())
12594     return ExprError();
12595 
12596   if (!E->hasExplicitTemplateArgs()) {
12597     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12598         // Note: it is sufficient to compare the Name component of NameInfo:
12599         // if name has not changed, DNLoc has not changed either.
12600         NameInfo.getName() == E->getDeclName())
12601       return E;
12602 
12603     return getDerived().RebuildDependentScopeDeclRefExpr(
12604         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12605         IsAddressOfOperand, RecoveryTSI);
12606   }
12607 
12608   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12609   if (getDerived().TransformTemplateArguments(
12610           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12611     return ExprError();
12612 
12613   return getDerived().RebuildDependentScopeDeclRefExpr(
12614       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12615       RecoveryTSI);
12616 }
12617 
12618 template<typename Derived>
12619 ExprResult
12620 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12621   // CXXConstructExprs other than for list-initialization and
12622   // CXXTemporaryObjectExpr are always implicit, so when we have
12623   // a 1-argument construction we just transform that argument.
12624   if (getDerived().AllowSkippingCXXConstructExpr() &&
12625       ((E->getNumArgs() == 1 ||
12626         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12627        (!getDerived().DropCallArgument(E->getArg(0))) &&
12628        !E->isListInitialization()))
12629     return getDerived().TransformInitializer(E->getArg(0),
12630                                              /*DirectInit*/ false);
12631 
12632   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12633 
12634   QualType T = getDerived().TransformType(E->getType());
12635   if (T.isNull())
12636     return ExprError();
12637 
12638   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12639       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12640   if (!Constructor)
12641     return ExprError();
12642 
12643   bool ArgumentChanged = false;
12644   SmallVector<Expr*, 8> Args;
12645   {
12646     EnterExpressionEvaluationContext Context(
12647         getSema(), EnterExpressionEvaluationContext::InitList,
12648         E->isListInitialization());
12649     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12650                                     &ArgumentChanged))
12651       return ExprError();
12652   }
12653 
12654   if (!getDerived().AlwaysRebuild() &&
12655       T == E->getType() &&
12656       Constructor == E->getConstructor() &&
12657       !ArgumentChanged) {
12658     // Mark the constructor as referenced.
12659     // FIXME: Instantiation-specific
12660     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12661     return E;
12662   }
12663 
12664   return getDerived().RebuildCXXConstructExpr(
12665       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12666       E->hadMultipleCandidates(), E->isListInitialization(),
12667       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12668       E->getConstructionKind(), E->getParenOrBraceRange());
12669 }
12670 
12671 template<typename Derived>
12672 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12673     CXXInheritedCtorInitExpr *E) {
12674   QualType T = getDerived().TransformType(E->getType());
12675   if (T.isNull())
12676     return ExprError();
12677 
12678   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12679       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12680   if (!Constructor)
12681     return ExprError();
12682 
12683   if (!getDerived().AlwaysRebuild() &&
12684       T == E->getType() &&
12685       Constructor == E->getConstructor()) {
12686     // Mark the constructor as referenced.
12687     // FIXME: Instantiation-specific
12688     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12689     return E;
12690   }
12691 
12692   return getDerived().RebuildCXXInheritedCtorInitExpr(
12693       T, E->getLocation(), Constructor,
12694       E->constructsVBase(), E->inheritedFromVBase());
12695 }
12696 
12697 /// Transform a C++ temporary-binding expression.
12698 ///
12699 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12700 /// transform the subexpression and return that.
12701 template<typename Derived>
12702 ExprResult
12703 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12704   return getDerived().TransformExpr(E->getSubExpr());
12705 }
12706 
12707 /// Transform a C++ expression that contains cleanups that should
12708 /// be run after the expression is evaluated.
12709 ///
12710 /// Since ExprWithCleanups nodes are implicitly generated, we
12711 /// just transform the subexpression and return that.
12712 template<typename Derived>
12713 ExprResult
12714 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12715   return getDerived().TransformExpr(E->getSubExpr());
12716 }
12717 
12718 template<typename Derived>
12719 ExprResult
12720 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12721                                                     CXXTemporaryObjectExpr *E) {
12722   TypeSourceInfo *T =
12723       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12724   if (!T)
12725     return ExprError();
12726 
12727   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12728       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12729   if (!Constructor)
12730     return ExprError();
12731 
12732   bool ArgumentChanged = false;
12733   SmallVector<Expr*, 8> Args;
12734   Args.reserve(E->getNumArgs());
12735   {
12736     EnterExpressionEvaluationContext Context(
12737         getSema(), EnterExpressionEvaluationContext::InitList,
12738         E->isListInitialization());
12739     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12740                        &ArgumentChanged))
12741       return ExprError();
12742   }
12743 
12744   if (!getDerived().AlwaysRebuild() &&
12745       T == E->getTypeSourceInfo() &&
12746       Constructor == E->getConstructor() &&
12747       !ArgumentChanged) {
12748     // FIXME: Instantiation-specific
12749     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12750     return SemaRef.MaybeBindToTemporary(E);
12751   }
12752 
12753   // FIXME: We should just pass E->isListInitialization(), but we're not
12754   // prepared to handle list-initialization without a child InitListExpr.
12755   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12756   return getDerived().RebuildCXXTemporaryObjectExpr(
12757       T, LParenLoc, Args, E->getEndLoc(),
12758       /*ListInitialization=*/LParenLoc.isInvalid());
12759 }
12760 
12761 template<typename Derived>
12762 ExprResult
12763 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12764   // Transform any init-capture expressions before entering the scope of the
12765   // lambda body, because they are not semantically within that scope.
12766   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12767   struct TransformedInitCapture {
12768     // The location of the ... if the result is retaining a pack expansion.
12769     SourceLocation EllipsisLoc;
12770     // Zero or more expansions of the init-capture.
12771     SmallVector<InitCaptureInfoTy, 4> Expansions;
12772   };
12773   SmallVector<TransformedInitCapture, 4> InitCaptures;
12774   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12775   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12776                                     CEnd = E->capture_end();
12777        C != CEnd; ++C) {
12778     if (!E->isInitCapture(C))
12779       continue;
12780 
12781     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12782     VarDecl *OldVD = C->getCapturedVar();
12783 
12784     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12785                                 Optional<unsigned> NumExpansions) {
12786       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12787           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12788 
12789       if (NewExprInitResult.isInvalid()) {
12790         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12791         return;
12792       }
12793       Expr *NewExprInit = NewExprInitResult.get();
12794 
12795       QualType NewInitCaptureType =
12796           getSema().buildLambdaInitCaptureInitialization(
12797               C->getLocation(), OldVD->getType()->isReferenceType(),
12798               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12799               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12800               NewExprInit);
12801       Result.Expansions.push_back(
12802           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12803     };
12804 
12805     // If this is an init-capture pack, consider expanding the pack now.
12806     if (OldVD->isParameterPack()) {
12807       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12808                                              ->getTypeLoc()
12809                                              .castAs<PackExpansionTypeLoc>();
12810       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12811       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12812 
12813       // Determine whether the set of unexpanded parameter packs can and should
12814       // be expanded.
12815       bool Expand = true;
12816       bool RetainExpansion = false;
12817       Optional<unsigned> OrigNumExpansions =
12818           ExpansionTL.getTypePtr()->getNumExpansions();
12819       Optional<unsigned> NumExpansions = OrigNumExpansions;
12820       if (getDerived().TryExpandParameterPacks(
12821               ExpansionTL.getEllipsisLoc(),
12822               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12823               RetainExpansion, NumExpansions))
12824         return ExprError();
12825       if (Expand) {
12826         for (unsigned I = 0; I != *NumExpansions; ++I) {
12827           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12828           SubstInitCapture(SourceLocation(), None);
12829         }
12830       }
12831       if (!Expand || RetainExpansion) {
12832         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12833         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12834         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12835       }
12836     } else {
12837       SubstInitCapture(SourceLocation(), None);
12838     }
12839   }
12840 
12841   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12842   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12843 
12844   // Transform the template parameters, and add them to the current
12845   // instantiation scope. The null case is handled correctly.
12846   auto TPL = getDerived().TransformTemplateParameterList(
12847       E->getTemplateParameterList());
12848   LSI->GLTemplateParameterList = TPL;
12849 
12850   // Transform the type of the original lambda's call operator.
12851   // The transformation MUST be done in the CurrentInstantiationScope since
12852   // it introduces a mapping of the original to the newly created
12853   // transformed parameters.
12854   TypeSourceInfo *NewCallOpTSI = nullptr;
12855   {
12856     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12857     FunctionProtoTypeLoc OldCallOpFPTL =
12858         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12859 
12860     TypeLocBuilder NewCallOpTLBuilder;
12861     SmallVector<QualType, 4> ExceptionStorage;
12862     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12863     QualType NewCallOpType = TransformFunctionProtoType(
12864         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12865         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12866           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12867                                               ExceptionStorage, Changed);
12868         });
12869     if (NewCallOpType.isNull())
12870       return ExprError();
12871     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12872                                                         NewCallOpType);
12873   }
12874 
12875   // Transform the trailing requires clause
12876   ExprResult NewTrailingRequiresClause;
12877   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12878     // FIXME: Concepts: Substitution into requires clause should only happen
12879     //                  when checking satisfaction.
12880     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12881 
12882   // Create the local class that will describe the lambda.
12883   // FIXME: KnownDependent below is wrong when substituting inside a templated
12884   // context that isn't a DeclContext (such as a variable template).
12885   CXXRecordDecl *OldClass = E->getLambdaClass();
12886   CXXRecordDecl *Class
12887     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12888                                         NewCallOpTSI,
12889                                         /*KnownDependent=*/false,
12890                                         E->getCaptureDefault());
12891   getDerived().transformedLocalDecl(OldClass, {Class});
12892 
12893   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12894   if (getDerived().ReplacingOriginal())
12895     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12896                                OldClass->getLambdaManglingNumber(),
12897                                OldClass->getDeviceLambdaManglingNumber(),
12898                                OldClass->getLambdaContextDecl());
12899 
12900   // Build the call operator.
12901   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12902       Class, E->getIntroducerRange(), NewCallOpTSI,
12903       E->getCallOperator()->getEndLoc(),
12904       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12905       E->getCallOperator()->getConstexprKind(),
12906       NewTrailingRequiresClause.get());
12907 
12908   LSI->CallOperator = NewCallOperator;
12909 
12910   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12911   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12912 
12913   // Number the lambda for linkage purposes if necessary.
12914   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12915 
12916   // Introduce the context of the call operator.
12917   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12918                                  /*NewThisContext*/false);
12919 
12920   // Enter the scope of the lambda.
12921   getSema().buildLambdaScope(LSI, NewCallOperator,
12922                              E->getIntroducerRange(),
12923                              E->getCaptureDefault(),
12924                              E->getCaptureDefaultLoc(),
12925                              E->hasExplicitParameters(),
12926                              E->hasExplicitResultType(),
12927                              E->isMutable());
12928 
12929   bool Invalid = false;
12930 
12931   // Transform captures.
12932   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12933                                  CEnd = E->capture_end();
12934        C != CEnd; ++C) {
12935     // When we hit the first implicit capture, tell Sema that we've finished
12936     // the list of explicit captures.
12937     if (C->isImplicit())
12938       break;
12939 
12940     // Capturing 'this' is trivial.
12941     if (C->capturesThis()) {
12942       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12943                                     /*BuildAndDiagnose*/ true, nullptr,
12944                                     C->getCaptureKind() == LCK_StarThis);
12945       continue;
12946     }
12947     // Captured expression will be recaptured during captured variables
12948     // rebuilding.
12949     if (C->capturesVLAType())
12950       continue;
12951 
12952     // Rebuild init-captures, including the implied field declaration.
12953     if (E->isInitCapture(C)) {
12954       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12955 
12956       VarDecl *OldVD = C->getCapturedVar();
12957       llvm::SmallVector<Decl*, 4> NewVDs;
12958 
12959       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12960         ExprResult Init = Info.first;
12961         QualType InitQualType = Info.second;
12962         if (Init.isInvalid() || InitQualType.isNull()) {
12963           Invalid = true;
12964           break;
12965         }
12966         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12967             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12968             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12969         if (!NewVD) {
12970           Invalid = true;
12971           break;
12972         }
12973         NewVDs.push_back(NewVD);
12974         getSema().addInitCapture(LSI, NewVD);
12975       }
12976 
12977       if (Invalid)
12978         break;
12979 
12980       getDerived().transformedLocalDecl(OldVD, NewVDs);
12981       continue;
12982     }
12983 
12984     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12985 
12986     // Determine the capture kind for Sema.
12987     Sema::TryCaptureKind Kind
12988       = C->isImplicit()? Sema::TryCapture_Implicit
12989                        : C->getCaptureKind() == LCK_ByCopy
12990                            ? Sema::TryCapture_ExplicitByVal
12991                            : Sema::TryCapture_ExplicitByRef;
12992     SourceLocation EllipsisLoc;
12993     if (C->isPackExpansion()) {
12994       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12995       bool ShouldExpand = false;
12996       bool RetainExpansion = false;
12997       Optional<unsigned> NumExpansions;
12998       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12999                                                C->getLocation(),
13000                                                Unexpanded,
13001                                                ShouldExpand, RetainExpansion,
13002                                                NumExpansions)) {
13003         Invalid = true;
13004         continue;
13005       }
13006 
13007       if (ShouldExpand) {
13008         // The transform has determined that we should perform an expansion;
13009         // transform and capture each of the arguments.
13010         // expansion of the pattern. Do so.
13011         VarDecl *Pack = C->getCapturedVar();
13012         for (unsigned I = 0; I != *NumExpansions; ++I) {
13013           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13014           VarDecl *CapturedVar
13015             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13016                                                                Pack));
13017           if (!CapturedVar) {
13018             Invalid = true;
13019             continue;
13020           }
13021 
13022           // Capture the transformed variable.
13023           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13024         }
13025 
13026         // FIXME: Retain a pack expansion if RetainExpansion is true.
13027 
13028         continue;
13029       }
13030 
13031       EllipsisLoc = C->getEllipsisLoc();
13032     }
13033 
13034     // Transform the captured variable.
13035     VarDecl *CapturedVar
13036       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13037                                                          C->getCapturedVar()));
13038     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13039       Invalid = true;
13040       continue;
13041     }
13042 
13043     // Capture the transformed variable.
13044     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13045                                  EllipsisLoc);
13046   }
13047   getSema().finishLambdaExplicitCaptures(LSI);
13048 
13049   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13050   // evaluation context even if we're not transforming the function body.
13051   getSema().PushExpressionEvaluationContext(
13052       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13053 
13054   // Instantiate the body of the lambda expression.
13055   StmtResult Body =
13056       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13057 
13058   // ActOnLambda* will pop the function scope for us.
13059   FuncScopeCleanup.disable();
13060 
13061   if (Body.isInvalid()) {
13062     SavedContext.pop();
13063     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13064                                /*IsInstantiation=*/true);
13065     return ExprError();
13066   }
13067 
13068   // Copy the LSI before ActOnFinishFunctionBody removes it.
13069   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13070   // the call operator.
13071   auto LSICopy = *LSI;
13072   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13073                                     /*IsInstantiation*/ true);
13074   SavedContext.pop();
13075 
13076   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13077                                    &LSICopy);
13078 }
13079 
13080 template<typename Derived>
13081 StmtResult
13082 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13083   return TransformStmt(S);
13084 }
13085 
13086 template<typename Derived>
13087 StmtResult
13088 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13089   // Transform captures.
13090   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13091                                  CEnd = E->capture_end();
13092        C != CEnd; ++C) {
13093     // When we hit the first implicit capture, tell Sema that we've finished
13094     // the list of explicit captures.
13095     if (!C->isImplicit())
13096       continue;
13097 
13098     // Capturing 'this' is trivial.
13099     if (C->capturesThis()) {
13100       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13101                                     /*BuildAndDiagnose*/ true, nullptr,
13102                                     C->getCaptureKind() == LCK_StarThis);
13103       continue;
13104     }
13105     // Captured expression will be recaptured during captured variables
13106     // rebuilding.
13107     if (C->capturesVLAType())
13108       continue;
13109 
13110     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13111     assert(!E->isInitCapture(C) && "implicit init-capture?");
13112 
13113     // Transform the captured variable.
13114     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13115         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13116     if (!CapturedVar || CapturedVar->isInvalidDecl())
13117       return StmtError();
13118 
13119     // Capture the transformed variable.
13120     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13121   }
13122 
13123   return S;
13124 }
13125 
13126 template<typename Derived>
13127 ExprResult
13128 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13129                                                   CXXUnresolvedConstructExpr *E) {
13130   TypeSourceInfo *T =
13131       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13132   if (!T)
13133     return ExprError();
13134 
13135   bool ArgumentChanged = false;
13136   SmallVector<Expr*, 8> Args;
13137   Args.reserve(E->getNumArgs());
13138   {
13139     EnterExpressionEvaluationContext Context(
13140         getSema(), EnterExpressionEvaluationContext::InitList,
13141         E->isListInitialization());
13142     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13143                                     &ArgumentChanged))
13144       return ExprError();
13145   }
13146 
13147   if (!getDerived().AlwaysRebuild() &&
13148       T == E->getTypeSourceInfo() &&
13149       !ArgumentChanged)
13150     return E;
13151 
13152   // FIXME: we're faking the locations of the commas
13153   return getDerived().RebuildCXXUnresolvedConstructExpr(
13154       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13155 }
13156 
13157 template<typename Derived>
13158 ExprResult
13159 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13160                                              CXXDependentScopeMemberExpr *E) {
13161   // Transform the base of the expression.
13162   ExprResult Base((Expr*) nullptr);
13163   Expr *OldBase;
13164   QualType BaseType;
13165   QualType ObjectType;
13166   if (!E->isImplicitAccess()) {
13167     OldBase = E->getBase();
13168     Base = getDerived().TransformExpr(OldBase);
13169     if (Base.isInvalid())
13170       return ExprError();
13171 
13172     // Start the member reference and compute the object's type.
13173     ParsedType ObjectTy;
13174     bool MayBePseudoDestructor = false;
13175     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13176                                                 E->getOperatorLoc(),
13177                                       E->isArrow()? tok::arrow : tok::period,
13178                                                 ObjectTy,
13179                                                 MayBePseudoDestructor);
13180     if (Base.isInvalid())
13181       return ExprError();
13182 
13183     ObjectType = ObjectTy.get();
13184     BaseType = ((Expr*) Base.get())->getType();
13185   } else {
13186     OldBase = nullptr;
13187     BaseType = getDerived().TransformType(E->getBaseType());
13188     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13189   }
13190 
13191   // Transform the first part of the nested-name-specifier that qualifies
13192   // the member name.
13193   NamedDecl *FirstQualifierInScope
13194     = getDerived().TransformFirstQualifierInScope(
13195                                             E->getFirstQualifierFoundInScope(),
13196                                             E->getQualifierLoc().getBeginLoc());
13197 
13198   NestedNameSpecifierLoc QualifierLoc;
13199   if (E->getQualifier()) {
13200     QualifierLoc
13201       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13202                                                      ObjectType,
13203                                                      FirstQualifierInScope);
13204     if (!QualifierLoc)
13205       return ExprError();
13206   }
13207 
13208   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13209 
13210   // TODO: If this is a conversion-function-id, verify that the
13211   // destination type name (if present) resolves the same way after
13212   // instantiation as it did in the local scope.
13213 
13214   DeclarationNameInfo NameInfo
13215     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13216   if (!NameInfo.getName())
13217     return ExprError();
13218 
13219   if (!E->hasExplicitTemplateArgs()) {
13220     // This is a reference to a member without an explicitly-specified
13221     // template argument list. Optimize for this common case.
13222     if (!getDerived().AlwaysRebuild() &&
13223         Base.get() == OldBase &&
13224         BaseType == E->getBaseType() &&
13225         QualifierLoc == E->getQualifierLoc() &&
13226         NameInfo.getName() == E->getMember() &&
13227         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13228       return E;
13229 
13230     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13231                                                        BaseType,
13232                                                        E->isArrow(),
13233                                                        E->getOperatorLoc(),
13234                                                        QualifierLoc,
13235                                                        TemplateKWLoc,
13236                                                        FirstQualifierInScope,
13237                                                        NameInfo,
13238                                                        /*TemplateArgs*/nullptr);
13239   }
13240 
13241   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13242   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13243                                               E->getNumTemplateArgs(),
13244                                               TransArgs))
13245     return ExprError();
13246 
13247   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13248                                                      BaseType,
13249                                                      E->isArrow(),
13250                                                      E->getOperatorLoc(),
13251                                                      QualifierLoc,
13252                                                      TemplateKWLoc,
13253                                                      FirstQualifierInScope,
13254                                                      NameInfo,
13255                                                      &TransArgs);
13256 }
13257 
13258 template <typename Derived>
13259 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13260     UnresolvedMemberExpr *Old) {
13261   // Transform the base of the expression.
13262   ExprResult Base((Expr *)nullptr);
13263   QualType BaseType;
13264   if (!Old->isImplicitAccess()) {
13265     Base = getDerived().TransformExpr(Old->getBase());
13266     if (Base.isInvalid())
13267       return ExprError();
13268     Base =
13269         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13270     if (Base.isInvalid())
13271       return ExprError();
13272     BaseType = Base.get()->getType();
13273   } else {
13274     BaseType = getDerived().TransformType(Old->getBaseType());
13275   }
13276 
13277   NestedNameSpecifierLoc QualifierLoc;
13278   if (Old->getQualifierLoc()) {
13279     QualifierLoc =
13280         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13281     if (!QualifierLoc)
13282       return ExprError();
13283   }
13284 
13285   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13286 
13287   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13288 
13289   // Transform the declaration set.
13290   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13291     return ExprError();
13292 
13293   // Determine the naming class.
13294   if (Old->getNamingClass()) {
13295     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13296         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13297     if (!NamingClass)
13298       return ExprError();
13299 
13300     R.setNamingClass(NamingClass);
13301   }
13302 
13303   TemplateArgumentListInfo TransArgs;
13304   if (Old->hasExplicitTemplateArgs()) {
13305     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13306     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13307     if (getDerived().TransformTemplateArguments(
13308             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13309       return ExprError();
13310   }
13311 
13312   // FIXME: to do this check properly, we will need to preserve the
13313   // first-qualifier-in-scope here, just in case we had a dependent
13314   // base (and therefore couldn't do the check) and a
13315   // nested-name-qualifier (and therefore could do the lookup).
13316   NamedDecl *FirstQualifierInScope = nullptr;
13317 
13318   return getDerived().RebuildUnresolvedMemberExpr(
13319       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13320       TemplateKWLoc, FirstQualifierInScope, R,
13321       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13322 }
13323 
13324 template<typename Derived>
13325 ExprResult
13326 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13327   EnterExpressionEvaluationContext Unevaluated(
13328       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13329   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13330   if (SubExpr.isInvalid())
13331     return ExprError();
13332 
13333   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13334     return E;
13335 
13336   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13337 }
13338 
13339 template<typename Derived>
13340 ExprResult
13341 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13342   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13343   if (Pattern.isInvalid())
13344     return ExprError();
13345 
13346   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13347     return E;
13348 
13349   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13350                                            E->getNumExpansions());
13351 }
13352 
13353 template<typename Derived>
13354 ExprResult
13355 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13356   // If E is not value-dependent, then nothing will change when we transform it.
13357   // Note: This is an instantiation-centric view.
13358   if (!E->isValueDependent())
13359     return E;
13360 
13361   EnterExpressionEvaluationContext Unevaluated(
13362       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13363 
13364   ArrayRef<TemplateArgument> PackArgs;
13365   TemplateArgument ArgStorage;
13366 
13367   // Find the argument list to transform.
13368   if (E->isPartiallySubstituted()) {
13369     PackArgs = E->getPartialArguments();
13370   } else if (E->isValueDependent()) {
13371     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13372     bool ShouldExpand = false;
13373     bool RetainExpansion = false;
13374     Optional<unsigned> NumExpansions;
13375     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13376                                              Unexpanded,
13377                                              ShouldExpand, RetainExpansion,
13378                                              NumExpansions))
13379       return ExprError();
13380 
13381     // If we need to expand the pack, build a template argument from it and
13382     // expand that.
13383     if (ShouldExpand) {
13384       auto *Pack = E->getPack();
13385       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13386         ArgStorage = getSema().Context.getPackExpansionType(
13387             getSema().Context.getTypeDeclType(TTPD), None);
13388       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13389         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13390       } else {
13391         auto *VD = cast<ValueDecl>(Pack);
13392         ExprResult DRE = getSema().BuildDeclRefExpr(
13393             VD, VD->getType().getNonLValueExprType(getSema().Context),
13394             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13395             E->getPackLoc());
13396         if (DRE.isInvalid())
13397           return ExprError();
13398         ArgStorage = new (getSema().Context) PackExpansionExpr(
13399             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13400       }
13401       PackArgs = ArgStorage;
13402     }
13403   }
13404 
13405   // If we're not expanding the pack, just transform the decl.
13406   if (!PackArgs.size()) {
13407     auto *Pack = cast_or_null<NamedDecl>(
13408         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13409     if (!Pack)
13410       return ExprError();
13411     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13412                                               E->getPackLoc(),
13413                                               E->getRParenLoc(), None, None);
13414   }
13415 
13416   // Try to compute the result without performing a partial substitution.
13417   Optional<unsigned> Result = 0;
13418   for (const TemplateArgument &Arg : PackArgs) {
13419     if (!Arg.isPackExpansion()) {
13420       Result = *Result + 1;
13421       continue;
13422     }
13423 
13424     TemplateArgumentLoc ArgLoc;
13425     InventTemplateArgumentLoc(Arg, ArgLoc);
13426 
13427     // Find the pattern of the pack expansion.
13428     SourceLocation Ellipsis;
13429     Optional<unsigned> OrigNumExpansions;
13430     TemplateArgumentLoc Pattern =
13431         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13432                                                           OrigNumExpansions);
13433 
13434     // Substitute under the pack expansion. Do not expand the pack (yet).
13435     TemplateArgumentLoc OutPattern;
13436     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13437     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13438                                                /*Uneval*/ true))
13439       return true;
13440 
13441     // See if we can determine the number of arguments from the result.
13442     Optional<unsigned> NumExpansions =
13443         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13444     if (!NumExpansions) {
13445       // No: we must be in an alias template expansion, and we're going to need
13446       // to actually expand the packs.
13447       Result = None;
13448       break;
13449     }
13450 
13451     Result = *Result + *NumExpansions;
13452   }
13453 
13454   // Common case: we could determine the number of expansions without
13455   // substituting.
13456   if (Result)
13457     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13458                                               E->getPackLoc(),
13459                                               E->getRParenLoc(), *Result, None);
13460 
13461   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13462                                                E->getPackLoc());
13463   {
13464     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13465     typedef TemplateArgumentLocInventIterator<
13466         Derived, const TemplateArgument*> PackLocIterator;
13467     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13468                                    PackLocIterator(*this, PackArgs.end()),
13469                                    TransformedPackArgs, /*Uneval*/true))
13470       return ExprError();
13471   }
13472 
13473   // Check whether we managed to fully-expand the pack.
13474   // FIXME: Is it possible for us to do so and not hit the early exit path?
13475   SmallVector<TemplateArgument, 8> Args;
13476   bool PartialSubstitution = false;
13477   for (auto &Loc : TransformedPackArgs.arguments()) {
13478     Args.push_back(Loc.getArgument());
13479     if (Loc.getArgument().isPackExpansion())
13480       PartialSubstitution = true;
13481   }
13482 
13483   if (PartialSubstitution)
13484     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13485                                               E->getPackLoc(),
13486                                               E->getRParenLoc(), None, Args);
13487 
13488   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13489                                             E->getPackLoc(), E->getRParenLoc(),
13490                                             Args.size(), None);
13491 }
13492 
13493 template<typename Derived>
13494 ExprResult
13495 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13496                                           SubstNonTypeTemplateParmPackExpr *E) {
13497   // Default behavior is to do nothing with this transformation.
13498   return E;
13499 }
13500 
13501 template<typename Derived>
13502 ExprResult
13503 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13504                                           SubstNonTypeTemplateParmExpr *E) {
13505   // Default behavior is to do nothing with this transformation.
13506   return E;
13507 }
13508 
13509 template<typename Derived>
13510 ExprResult
13511 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13512   // Default behavior is to do nothing with this transformation.
13513   return E;
13514 }
13515 
13516 template<typename Derived>
13517 ExprResult
13518 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13519                                                   MaterializeTemporaryExpr *E) {
13520   return getDerived().TransformExpr(E->getSubExpr());
13521 }
13522 
13523 template<typename Derived>
13524 ExprResult
13525 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13526   UnresolvedLookupExpr *Callee = nullptr;
13527   if (Expr *OldCallee = E->getCallee()) {
13528     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13529     if (CalleeResult.isInvalid())
13530       return ExprError();
13531     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13532   }
13533 
13534   Expr *Pattern = E->getPattern();
13535 
13536   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13537   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13538   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13539 
13540   // Determine whether the set of unexpanded parameter packs can and should
13541   // be expanded.
13542   bool Expand = true;
13543   bool RetainExpansion = false;
13544   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13545                      NumExpansions = OrigNumExpansions;
13546   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13547                                            Pattern->getSourceRange(),
13548                                            Unexpanded,
13549                                            Expand, RetainExpansion,
13550                                            NumExpansions))
13551     return true;
13552 
13553   if (!Expand) {
13554     // Do not expand any packs here, just transform and rebuild a fold
13555     // expression.
13556     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13557 
13558     ExprResult LHS =
13559         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13560     if (LHS.isInvalid())
13561       return true;
13562 
13563     ExprResult RHS =
13564         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13565     if (RHS.isInvalid())
13566       return true;
13567 
13568     if (!getDerived().AlwaysRebuild() &&
13569         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13570       return E;
13571 
13572     return getDerived().RebuildCXXFoldExpr(
13573         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13574         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13575   }
13576 
13577   // Formally a fold expression expands to nested parenthesized expressions.
13578   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13579   // them.
13580   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13581     SemaRef.Diag(E->getEllipsisLoc(),
13582                  clang::diag::err_fold_expression_limit_exceeded)
13583         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13584         << E->getSourceRange();
13585     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13586     return ExprError();
13587   }
13588 
13589   // The transform has determined that we should perform an elementwise
13590   // expansion of the pattern. Do so.
13591   ExprResult Result = getDerived().TransformExpr(E->getInit());
13592   if (Result.isInvalid())
13593     return true;
13594   bool LeftFold = E->isLeftFold();
13595 
13596   // If we're retaining an expansion for a right fold, it is the innermost
13597   // component and takes the init (if any).
13598   if (!LeftFold && RetainExpansion) {
13599     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13600 
13601     ExprResult Out = getDerived().TransformExpr(Pattern);
13602     if (Out.isInvalid())
13603       return true;
13604 
13605     Result = getDerived().RebuildCXXFoldExpr(
13606         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13607         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13608     if (Result.isInvalid())
13609       return true;
13610   }
13611 
13612   for (unsigned I = 0; I != *NumExpansions; ++I) {
13613     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13614         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13615     ExprResult Out = getDerived().TransformExpr(Pattern);
13616     if (Out.isInvalid())
13617       return true;
13618 
13619     if (Out.get()->containsUnexpandedParameterPack()) {
13620       // We still have a pack; retain a pack expansion for this slice.
13621       Result = getDerived().RebuildCXXFoldExpr(
13622           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13623           E->getOperator(), E->getEllipsisLoc(),
13624           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13625           OrigNumExpansions);
13626     } else if (Result.isUsable()) {
13627       // We've got down to a single element; build a binary operator.
13628       Expr *LHS = LeftFold ? Result.get() : Out.get();
13629       Expr *RHS = LeftFold ? Out.get() : Result.get();
13630       if (Callee)
13631         Result = getDerived().RebuildCXXOperatorCallExpr(
13632             BinaryOperator::getOverloadedOperator(E->getOperator()),
13633             E->getEllipsisLoc(), Callee, LHS, RHS);
13634       else
13635         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13636                                                     E->getOperator(), LHS, RHS);
13637     } else
13638       Result = Out;
13639 
13640     if (Result.isInvalid())
13641       return true;
13642   }
13643 
13644   // If we're retaining an expansion for a left fold, it is the outermost
13645   // component and takes the complete expansion so far as its init (if any).
13646   if (LeftFold && RetainExpansion) {
13647     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13648 
13649     ExprResult Out = getDerived().TransformExpr(Pattern);
13650     if (Out.isInvalid())
13651       return true;
13652 
13653     Result = getDerived().RebuildCXXFoldExpr(
13654         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13655         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13656     if (Result.isInvalid())
13657       return true;
13658   }
13659 
13660   // If we had no init and an empty pack, and we're not retaining an expansion,
13661   // then produce a fallback value or error.
13662   if (Result.isUnset())
13663     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13664                                                 E->getOperator());
13665 
13666   return Result;
13667 }
13668 
13669 template<typename Derived>
13670 ExprResult
13671 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13672     CXXStdInitializerListExpr *E) {
13673   return getDerived().TransformExpr(E->getSubExpr());
13674 }
13675 
13676 template<typename Derived>
13677 ExprResult
13678 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13679   return SemaRef.MaybeBindToTemporary(E);
13680 }
13681 
13682 template<typename Derived>
13683 ExprResult
13684 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13685   return E;
13686 }
13687 
13688 template<typename Derived>
13689 ExprResult
13690 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13691   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13692   if (SubExpr.isInvalid())
13693     return ExprError();
13694 
13695   if (!getDerived().AlwaysRebuild() &&
13696       SubExpr.get() == E->getSubExpr())
13697     return E;
13698 
13699   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13700 }
13701 
13702 template<typename Derived>
13703 ExprResult
13704 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13705   // Transform each of the elements.
13706   SmallVector<Expr *, 8> Elements;
13707   bool ArgChanged = false;
13708   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13709                                   /*IsCall=*/false, Elements, &ArgChanged))
13710     return ExprError();
13711 
13712   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13713     return SemaRef.MaybeBindToTemporary(E);
13714 
13715   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13716                                               Elements.data(),
13717                                               Elements.size());
13718 }
13719 
13720 template<typename Derived>
13721 ExprResult
13722 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13723                                                     ObjCDictionaryLiteral *E) {
13724   // Transform each of the elements.
13725   SmallVector<ObjCDictionaryElement, 8> Elements;
13726   bool ArgChanged = false;
13727   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13728     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13729 
13730     if (OrigElement.isPackExpansion()) {
13731       // This key/value element is a pack expansion.
13732       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13733       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13734       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13735       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13736 
13737       // Determine whether the set of unexpanded parameter packs can
13738       // and should be expanded.
13739       bool Expand = true;
13740       bool RetainExpansion = false;
13741       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13742       Optional<unsigned> NumExpansions = OrigNumExpansions;
13743       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13744                                OrigElement.Value->getEndLoc());
13745       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13746                                                PatternRange, Unexpanded, Expand,
13747                                                RetainExpansion, NumExpansions))
13748         return ExprError();
13749 
13750       if (!Expand) {
13751         // The transform has determined that we should perform a simple
13752         // transformation on the pack expansion, producing another pack
13753         // expansion.
13754         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13755         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13756         if (Key.isInvalid())
13757           return ExprError();
13758 
13759         if (Key.get() != OrigElement.Key)
13760           ArgChanged = true;
13761 
13762         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13763         if (Value.isInvalid())
13764           return ExprError();
13765 
13766         if (Value.get() != OrigElement.Value)
13767           ArgChanged = true;
13768 
13769         ObjCDictionaryElement Expansion = {
13770           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13771         };
13772         Elements.push_back(Expansion);
13773         continue;
13774       }
13775 
13776       // Record right away that the argument was changed.  This needs
13777       // to happen even if the array expands to nothing.
13778       ArgChanged = true;
13779 
13780       // The transform has determined that we should perform an elementwise
13781       // expansion of the pattern. Do so.
13782       for (unsigned I = 0; I != *NumExpansions; ++I) {
13783         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13784         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13785         if (Key.isInvalid())
13786           return ExprError();
13787 
13788         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13789         if (Value.isInvalid())
13790           return ExprError();
13791 
13792         ObjCDictionaryElement Element = {
13793           Key.get(), Value.get(), SourceLocation(), NumExpansions
13794         };
13795 
13796         // If any unexpanded parameter packs remain, we still have a
13797         // pack expansion.
13798         // FIXME: Can this really happen?
13799         if (Key.get()->containsUnexpandedParameterPack() ||
13800             Value.get()->containsUnexpandedParameterPack())
13801           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13802 
13803         Elements.push_back(Element);
13804       }
13805 
13806       // FIXME: Retain a pack expansion if RetainExpansion is true.
13807 
13808       // We've finished with this pack expansion.
13809       continue;
13810     }
13811 
13812     // Transform and check key.
13813     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13814     if (Key.isInvalid())
13815       return ExprError();
13816 
13817     if (Key.get() != OrigElement.Key)
13818       ArgChanged = true;
13819 
13820     // Transform and check value.
13821     ExprResult Value
13822       = getDerived().TransformExpr(OrigElement.Value);
13823     if (Value.isInvalid())
13824       return ExprError();
13825 
13826     if (Value.get() != OrigElement.Value)
13827       ArgChanged = true;
13828 
13829     ObjCDictionaryElement Element = {
13830       Key.get(), Value.get(), SourceLocation(), None
13831     };
13832     Elements.push_back(Element);
13833   }
13834 
13835   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13836     return SemaRef.MaybeBindToTemporary(E);
13837 
13838   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13839                                                    Elements);
13840 }
13841 
13842 template<typename Derived>
13843 ExprResult
13844 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13845   TypeSourceInfo *EncodedTypeInfo
13846     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13847   if (!EncodedTypeInfo)
13848     return ExprError();
13849 
13850   if (!getDerived().AlwaysRebuild() &&
13851       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13852     return E;
13853 
13854   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13855                                             EncodedTypeInfo,
13856                                             E->getRParenLoc());
13857 }
13858 
13859 template<typename Derived>
13860 ExprResult TreeTransform<Derived>::
13861 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13862   // This is a kind of implicit conversion, and it needs to get dropped
13863   // and recomputed for the same general reasons that ImplicitCastExprs
13864   // do, as well a more specific one: this expression is only valid when
13865   // it appears *immediately* as an argument expression.
13866   return getDerived().TransformExpr(E->getSubExpr());
13867 }
13868 
13869 template<typename Derived>
13870 ExprResult TreeTransform<Derived>::
13871 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13872   TypeSourceInfo *TSInfo
13873     = getDerived().TransformType(E->getTypeInfoAsWritten());
13874   if (!TSInfo)
13875     return ExprError();
13876 
13877   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13878   if (Result.isInvalid())
13879     return ExprError();
13880 
13881   if (!getDerived().AlwaysRebuild() &&
13882       TSInfo == E->getTypeInfoAsWritten() &&
13883       Result.get() == E->getSubExpr())
13884     return E;
13885 
13886   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13887                                       E->getBridgeKeywordLoc(), TSInfo,
13888                                       Result.get());
13889 }
13890 
13891 template <typename Derived>
13892 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13893     ObjCAvailabilityCheckExpr *E) {
13894   return E;
13895 }
13896 
13897 template<typename Derived>
13898 ExprResult
13899 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13900   // Transform arguments.
13901   bool ArgChanged = false;
13902   SmallVector<Expr*, 8> Args;
13903   Args.reserve(E->getNumArgs());
13904   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13905                                   &ArgChanged))
13906     return ExprError();
13907 
13908   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13909     // Class message: transform the receiver type.
13910     TypeSourceInfo *ReceiverTypeInfo
13911       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13912     if (!ReceiverTypeInfo)
13913       return ExprError();
13914 
13915     // If nothing changed, just retain the existing message send.
13916     if (!getDerived().AlwaysRebuild() &&
13917         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13918       return SemaRef.MaybeBindToTemporary(E);
13919 
13920     // Build a new class message send.
13921     SmallVector<SourceLocation, 16> SelLocs;
13922     E->getSelectorLocs(SelLocs);
13923     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13924                                                E->getSelector(),
13925                                                SelLocs,
13926                                                E->getMethodDecl(),
13927                                                E->getLeftLoc(),
13928                                                Args,
13929                                                E->getRightLoc());
13930   }
13931   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13932            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13933     if (!E->getMethodDecl())
13934       return ExprError();
13935 
13936     // Build a new class message send to 'super'.
13937     SmallVector<SourceLocation, 16> SelLocs;
13938     E->getSelectorLocs(SelLocs);
13939     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13940                                                E->getSelector(),
13941                                                SelLocs,
13942                                                E->getReceiverType(),
13943                                                E->getMethodDecl(),
13944                                                E->getLeftLoc(),
13945                                                Args,
13946                                                E->getRightLoc());
13947   }
13948 
13949   // Instance message: transform the receiver
13950   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13951          "Only class and instance messages may be instantiated");
13952   ExprResult Receiver
13953     = getDerived().TransformExpr(E->getInstanceReceiver());
13954   if (Receiver.isInvalid())
13955     return ExprError();
13956 
13957   // If nothing changed, just retain the existing message send.
13958   if (!getDerived().AlwaysRebuild() &&
13959       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13960     return SemaRef.MaybeBindToTemporary(E);
13961 
13962   // Build a new instance message send.
13963   SmallVector<SourceLocation, 16> SelLocs;
13964   E->getSelectorLocs(SelLocs);
13965   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13966                                              E->getSelector(),
13967                                              SelLocs,
13968                                              E->getMethodDecl(),
13969                                              E->getLeftLoc(),
13970                                              Args,
13971                                              E->getRightLoc());
13972 }
13973 
13974 template<typename Derived>
13975 ExprResult
13976 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13977   return E;
13978 }
13979 
13980 template<typename Derived>
13981 ExprResult
13982 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13983   return E;
13984 }
13985 
13986 template<typename Derived>
13987 ExprResult
13988 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13989   // Transform the base expression.
13990   ExprResult Base = getDerived().TransformExpr(E->getBase());
13991   if (Base.isInvalid())
13992     return ExprError();
13993 
13994   // We don't need to transform the ivar; it will never change.
13995 
13996   // If nothing changed, just retain the existing expression.
13997   if (!getDerived().AlwaysRebuild() &&
13998       Base.get() == E->getBase())
13999     return E;
14000 
14001   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14002                                              E->getLocation(),
14003                                              E->isArrow(), E->isFreeIvar());
14004 }
14005 
14006 template<typename Derived>
14007 ExprResult
14008 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14009   // 'super' and types never change. Property never changes. Just
14010   // retain the existing expression.
14011   if (!E->isObjectReceiver())
14012     return E;
14013 
14014   // Transform the base expression.
14015   ExprResult Base = getDerived().TransformExpr(E->getBase());
14016   if (Base.isInvalid())
14017     return ExprError();
14018 
14019   // We don't need to transform the property; it will never change.
14020 
14021   // If nothing changed, just retain the existing expression.
14022   if (!getDerived().AlwaysRebuild() &&
14023       Base.get() == E->getBase())
14024     return E;
14025 
14026   if (E->isExplicitProperty())
14027     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14028                                                    E->getExplicitProperty(),
14029                                                    E->getLocation());
14030 
14031   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14032                                                  SemaRef.Context.PseudoObjectTy,
14033                                                  E->getImplicitPropertyGetter(),
14034                                                  E->getImplicitPropertySetter(),
14035                                                  E->getLocation());
14036 }
14037 
14038 template<typename Derived>
14039 ExprResult
14040 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14041   // Transform the base expression.
14042   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14043   if (Base.isInvalid())
14044     return ExprError();
14045 
14046   // Transform the key expression.
14047   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14048   if (Key.isInvalid())
14049     return ExprError();
14050 
14051   // If nothing changed, just retain the existing expression.
14052   if (!getDerived().AlwaysRebuild() &&
14053       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14054     return E;
14055 
14056   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14057                                                   Base.get(), Key.get(),
14058                                                   E->getAtIndexMethodDecl(),
14059                                                   E->setAtIndexMethodDecl());
14060 }
14061 
14062 template<typename Derived>
14063 ExprResult
14064 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14065   // Transform the base expression.
14066   ExprResult Base = getDerived().TransformExpr(E->getBase());
14067   if (Base.isInvalid())
14068     return ExprError();
14069 
14070   // If nothing changed, just retain the existing expression.
14071   if (!getDerived().AlwaysRebuild() &&
14072       Base.get() == E->getBase())
14073     return E;
14074 
14075   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14076                                          E->getOpLoc(),
14077                                          E->isArrow());
14078 }
14079 
14080 template<typename Derived>
14081 ExprResult
14082 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14083   bool ArgumentChanged = false;
14084   SmallVector<Expr*, 8> SubExprs;
14085   SubExprs.reserve(E->getNumSubExprs());
14086   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14087                                   SubExprs, &ArgumentChanged))
14088     return ExprError();
14089 
14090   if (!getDerived().AlwaysRebuild() &&
14091       !ArgumentChanged)
14092     return E;
14093 
14094   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14095                                                SubExprs,
14096                                                E->getRParenLoc());
14097 }
14098 
14099 template<typename Derived>
14100 ExprResult
14101 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14102   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14103   if (SrcExpr.isInvalid())
14104     return ExprError();
14105 
14106   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14107   if (!Type)
14108     return ExprError();
14109 
14110   if (!getDerived().AlwaysRebuild() &&
14111       Type == E->getTypeSourceInfo() &&
14112       SrcExpr.get() == E->getSrcExpr())
14113     return E;
14114 
14115   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14116                                                SrcExpr.get(), Type,
14117                                                E->getRParenLoc());
14118 }
14119 
14120 template<typename Derived>
14121 ExprResult
14122 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14123   BlockDecl *oldBlock = E->getBlockDecl();
14124 
14125   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14126   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14127 
14128   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14129   blockScope->TheDecl->setBlockMissingReturnType(
14130                          oldBlock->blockMissingReturnType());
14131 
14132   SmallVector<ParmVarDecl*, 4> params;
14133   SmallVector<QualType, 4> paramTypes;
14134 
14135   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14136 
14137   // Parameter substitution.
14138   Sema::ExtParameterInfoBuilder extParamInfos;
14139   if (getDerived().TransformFunctionTypeParams(
14140           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14141           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14142           extParamInfos)) {
14143     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14144     return ExprError();
14145   }
14146 
14147   QualType exprResultType =
14148       getDerived().TransformType(exprFunctionType->getReturnType());
14149 
14150   auto epi = exprFunctionType->getExtProtoInfo();
14151   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14152 
14153   QualType functionType =
14154     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14155   blockScope->FunctionType = functionType;
14156 
14157   // Set the parameters on the block decl.
14158   if (!params.empty())
14159     blockScope->TheDecl->setParams(params);
14160 
14161   if (!oldBlock->blockMissingReturnType()) {
14162     blockScope->HasImplicitReturnType = false;
14163     blockScope->ReturnType = exprResultType;
14164   }
14165 
14166   // Transform the body
14167   StmtResult body = getDerived().TransformStmt(E->getBody());
14168   if (body.isInvalid()) {
14169     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14170     return ExprError();
14171   }
14172 
14173 #ifndef NDEBUG
14174   // In builds with assertions, make sure that we captured everything we
14175   // captured before.
14176   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14177     for (const auto &I : oldBlock->captures()) {
14178       VarDecl *oldCapture = I.getVariable();
14179 
14180       // Ignore parameter packs.
14181       if (oldCapture->isParameterPack())
14182         continue;
14183 
14184       VarDecl *newCapture =
14185         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14186                                                  oldCapture));
14187       assert(blockScope->CaptureMap.count(newCapture));
14188     }
14189     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14190   }
14191 #endif
14192 
14193   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14194                                     /*Scope=*/nullptr);
14195 }
14196 
14197 template<typename Derived>
14198 ExprResult
14199 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14200   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14201   if (SrcExpr.isInvalid())
14202     return ExprError();
14203 
14204   QualType Type = getDerived().TransformType(E->getType());
14205 
14206   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14207                                  E->getRParenLoc());
14208 }
14209 
14210 template<typename Derived>
14211 ExprResult
14212 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14213   bool ArgumentChanged = false;
14214   SmallVector<Expr*, 8> SubExprs;
14215   SubExprs.reserve(E->getNumSubExprs());
14216   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14217                                   SubExprs, &ArgumentChanged))
14218     return ExprError();
14219 
14220   if (!getDerived().AlwaysRebuild() &&
14221       !ArgumentChanged)
14222     return E;
14223 
14224   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14225                                         E->getOp(), E->getRParenLoc());
14226 }
14227 
14228 //===----------------------------------------------------------------------===//
14229 // Type reconstruction
14230 //===----------------------------------------------------------------------===//
14231 
14232 template<typename Derived>
14233 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14234                                                     SourceLocation Star) {
14235   return SemaRef.BuildPointerType(PointeeType, Star,
14236                                   getDerived().getBaseEntity());
14237 }
14238 
14239 template<typename Derived>
14240 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14241                                                          SourceLocation Star) {
14242   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14243                                        getDerived().getBaseEntity());
14244 }
14245 
14246 template<typename Derived>
14247 QualType
14248 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14249                                              bool WrittenAsLValue,
14250                                              SourceLocation Sigil) {
14251   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14252                                     Sigil, getDerived().getBaseEntity());
14253 }
14254 
14255 template<typename Derived>
14256 QualType
14257 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14258                                                  QualType ClassType,
14259                                                  SourceLocation Sigil) {
14260   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14261                                         getDerived().getBaseEntity());
14262 }
14263 
14264 template<typename Derived>
14265 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14266            const ObjCTypeParamDecl *Decl,
14267            SourceLocation ProtocolLAngleLoc,
14268            ArrayRef<ObjCProtocolDecl *> Protocols,
14269            ArrayRef<SourceLocation> ProtocolLocs,
14270            SourceLocation ProtocolRAngleLoc) {
14271   return SemaRef.BuildObjCTypeParamType(Decl,
14272                                         ProtocolLAngleLoc, Protocols,
14273                                         ProtocolLocs, ProtocolRAngleLoc,
14274                                         /*FailOnError=*/true);
14275 }
14276 
14277 template<typename Derived>
14278 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14279            QualType BaseType,
14280            SourceLocation Loc,
14281            SourceLocation TypeArgsLAngleLoc,
14282            ArrayRef<TypeSourceInfo *> TypeArgs,
14283            SourceLocation TypeArgsRAngleLoc,
14284            SourceLocation ProtocolLAngleLoc,
14285            ArrayRef<ObjCProtocolDecl *> Protocols,
14286            ArrayRef<SourceLocation> ProtocolLocs,
14287            SourceLocation ProtocolRAngleLoc) {
14288   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14289                                      TypeArgs, TypeArgsRAngleLoc,
14290                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14291                                      ProtocolRAngleLoc,
14292                                      /*FailOnError=*/true);
14293 }
14294 
14295 template<typename Derived>
14296 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14297            QualType PointeeType,
14298            SourceLocation Star) {
14299   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14300 }
14301 
14302 template<typename Derived>
14303 QualType
14304 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14305                                          ArrayType::ArraySizeModifier SizeMod,
14306                                          const llvm::APInt *Size,
14307                                          Expr *SizeExpr,
14308                                          unsigned IndexTypeQuals,
14309                                          SourceRange BracketsRange) {
14310   if (SizeExpr || !Size)
14311     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14312                                   IndexTypeQuals, BracketsRange,
14313                                   getDerived().getBaseEntity());
14314 
14315   QualType Types[] = {
14316     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14317     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14318     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14319   };
14320   const unsigned NumTypes = llvm::array_lengthof(Types);
14321   QualType SizeType;
14322   for (unsigned I = 0; I != NumTypes; ++I)
14323     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14324       SizeType = Types[I];
14325       break;
14326     }
14327 
14328   // Note that we can return a VariableArrayType here in the case where
14329   // the element type was a dependent VariableArrayType.
14330   IntegerLiteral *ArraySize
14331       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14332                                /*FIXME*/BracketsRange.getBegin());
14333   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14334                                 IndexTypeQuals, BracketsRange,
14335                                 getDerived().getBaseEntity());
14336 }
14337 
14338 template<typename Derived>
14339 QualType
14340 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14341                                                  ArrayType::ArraySizeModifier SizeMod,
14342                                                  const llvm::APInt &Size,
14343                                                  Expr *SizeExpr,
14344                                                  unsigned IndexTypeQuals,
14345                                                  SourceRange BracketsRange) {
14346   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14347                                         IndexTypeQuals, BracketsRange);
14348 }
14349 
14350 template<typename Derived>
14351 QualType
14352 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14353                                           ArrayType::ArraySizeModifier SizeMod,
14354                                                  unsigned IndexTypeQuals,
14355                                                    SourceRange BracketsRange) {
14356   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14357                                        IndexTypeQuals, BracketsRange);
14358 }
14359 
14360 template<typename Derived>
14361 QualType
14362 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14363                                           ArrayType::ArraySizeModifier SizeMod,
14364                                                  Expr *SizeExpr,
14365                                                  unsigned IndexTypeQuals,
14366                                                  SourceRange BracketsRange) {
14367   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14368                                        SizeExpr,
14369                                        IndexTypeQuals, BracketsRange);
14370 }
14371 
14372 template<typename Derived>
14373 QualType
14374 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14375                                           ArrayType::ArraySizeModifier SizeMod,
14376                                                        Expr *SizeExpr,
14377                                                        unsigned IndexTypeQuals,
14378                                                    SourceRange BracketsRange) {
14379   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14380                                        SizeExpr,
14381                                        IndexTypeQuals, BracketsRange);
14382 }
14383 
14384 template <typename Derived>
14385 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14386     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14387   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14388                                           AttributeLoc);
14389 }
14390 
14391 template <typename Derived>
14392 QualType
14393 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14394                                           unsigned NumElements,
14395                                           VectorType::VectorKind VecKind) {
14396   // FIXME: semantic checking!
14397   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14398 }
14399 
14400 template <typename Derived>
14401 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14402     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14403     VectorType::VectorKind VecKind) {
14404   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14405 }
14406 
14407 template<typename Derived>
14408 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14409                                                       unsigned NumElements,
14410                                                  SourceLocation AttributeLoc) {
14411   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14412                           NumElements, true);
14413   IntegerLiteral *VectorSize
14414     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14415                              AttributeLoc);
14416   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14417 }
14418 
14419 template<typename Derived>
14420 QualType
14421 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14422                                                            Expr *SizeExpr,
14423                                                   SourceLocation AttributeLoc) {
14424   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14425 }
14426 
14427 template <typename Derived>
14428 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14429     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14430   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14431                                                NumColumns);
14432 }
14433 
14434 template <typename Derived>
14435 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14436     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14437     SourceLocation AttributeLoc) {
14438   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14439                                  AttributeLoc);
14440 }
14441 
14442 template<typename Derived>
14443 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14444     QualType T,
14445     MutableArrayRef<QualType> ParamTypes,
14446     const FunctionProtoType::ExtProtoInfo &EPI) {
14447   return SemaRef.BuildFunctionType(T, ParamTypes,
14448                                    getDerived().getBaseLocation(),
14449                                    getDerived().getBaseEntity(),
14450                                    EPI);
14451 }
14452 
14453 template<typename Derived>
14454 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14455   return SemaRef.Context.getFunctionNoProtoType(T);
14456 }
14457 
14458 template<typename Derived>
14459 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14460                                                             Decl *D) {
14461   assert(D && "no decl found");
14462   if (D->isInvalidDecl()) return QualType();
14463 
14464   // FIXME: Doesn't account for ObjCInterfaceDecl!
14465   TypeDecl *Ty;
14466   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14467     // A valid resolved using typename pack expansion decl can have multiple
14468     // UsingDecls, but they must each have exactly one type, and it must be
14469     // the same type in every case. But we must have at least one expansion!
14470     if (UPD->expansions().empty()) {
14471       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14472           << UPD->isCXXClassMember() << UPD;
14473       return QualType();
14474     }
14475 
14476     // We might still have some unresolved types. Try to pick a resolved type
14477     // if we can. The final instantiation will check that the remaining
14478     // unresolved types instantiate to the type we pick.
14479     QualType FallbackT;
14480     QualType T;
14481     for (auto *E : UPD->expansions()) {
14482       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14483       if (ThisT.isNull())
14484         continue;
14485       else if (ThisT->getAs<UnresolvedUsingType>())
14486         FallbackT = ThisT;
14487       else if (T.isNull())
14488         T = ThisT;
14489       else
14490         assert(getSema().Context.hasSameType(ThisT, T) &&
14491                "mismatched resolved types in using pack expansion");
14492     }
14493     return T.isNull() ? FallbackT : T;
14494   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14495     assert(Using->hasTypename() &&
14496            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14497 
14498     // A valid resolved using typename decl points to exactly one type decl.
14499     assert(++Using->shadow_begin() == Using->shadow_end());
14500 
14501     NamedDecl *Target = Using->shadow_begin()->getTargetDecl();
14502     if (SemaRef.DiagnoseUseOfDecl(Target, Loc))
14503       return QualType();
14504     Ty = cast<TypeDecl>(Target);
14505   } else {
14506     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14507            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14508     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14509   }
14510 
14511   return SemaRef.Context.getTypeDeclType(Ty);
14512 }
14513 
14514 template <typename Derived>
14515 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14516                                                        SourceLocation) {
14517   return SemaRef.BuildTypeofExprType(E);
14518 }
14519 
14520 template<typename Derived>
14521 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14522   return SemaRef.Context.getTypeOfType(Underlying);
14523 }
14524 
14525 template <typename Derived>
14526 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14527   return SemaRef.BuildDecltypeType(E);
14528 }
14529 
14530 template<typename Derived>
14531 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14532                                             UnaryTransformType::UTTKind UKind,
14533                                             SourceLocation Loc) {
14534   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14535 }
14536 
14537 template<typename Derived>
14538 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14539                                                       TemplateName Template,
14540                                              SourceLocation TemplateNameLoc,
14541                                      TemplateArgumentListInfo &TemplateArgs) {
14542   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14543 }
14544 
14545 template<typename Derived>
14546 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14547                                                    SourceLocation KWLoc) {
14548   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14549 }
14550 
14551 template<typename Derived>
14552 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14553                                                  SourceLocation KWLoc,
14554                                                  bool isReadPipe) {
14555   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14556                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14557 }
14558 
14559 template <typename Derived>
14560 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14561                                                    unsigned NumBits,
14562                                                    SourceLocation Loc) {
14563   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14564                         NumBits, true);
14565   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14566                                                 SemaRef.Context.IntTy, Loc);
14567   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14568 }
14569 
14570 template <typename Derived>
14571 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14572     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14573   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14574 }
14575 
14576 template<typename Derived>
14577 TemplateName
14578 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14579                                             bool TemplateKW,
14580                                             TemplateDecl *Template) {
14581   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14582                                                   Template);
14583 }
14584 
14585 template<typename Derived>
14586 TemplateName
14587 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14588                                             SourceLocation TemplateKWLoc,
14589                                             const IdentifierInfo &Name,
14590                                             SourceLocation NameLoc,
14591                                             QualType ObjectType,
14592                                             NamedDecl *FirstQualifierInScope,
14593                                             bool AllowInjectedClassName) {
14594   UnqualifiedId TemplateName;
14595   TemplateName.setIdentifier(&Name, NameLoc);
14596   Sema::TemplateTy Template;
14597   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14598                               TemplateName, ParsedType::make(ObjectType),
14599                               /*EnteringContext=*/false, Template,
14600                               AllowInjectedClassName);
14601   return Template.get();
14602 }
14603 
14604 template<typename Derived>
14605 TemplateName
14606 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14607                                             SourceLocation TemplateKWLoc,
14608                                             OverloadedOperatorKind Operator,
14609                                             SourceLocation NameLoc,
14610                                             QualType ObjectType,
14611                                             bool AllowInjectedClassName) {
14612   UnqualifiedId Name;
14613   // FIXME: Bogus location information.
14614   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14615   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14616   Sema::TemplateTy Template;
14617   getSema().ActOnTemplateName(
14618       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14619       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14620   return Template.get();
14621 }
14622 
14623 template<typename Derived>
14624 ExprResult
14625 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14626                                                    SourceLocation OpLoc,
14627                                                    Expr *OrigCallee,
14628                                                    Expr *First,
14629                                                    Expr *Second) {
14630   Expr *Callee = OrigCallee->IgnoreParenCasts();
14631   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14632 
14633   if (First->getObjectKind() == OK_ObjCProperty) {
14634     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14635     if (BinaryOperator::isAssignmentOp(Opc))
14636       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14637                                                  First, Second);
14638     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14639     if (Result.isInvalid())
14640       return ExprError();
14641     First = Result.get();
14642   }
14643 
14644   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14645     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14646     if (Result.isInvalid())
14647       return ExprError();
14648     Second = Result.get();
14649   }
14650 
14651   // Determine whether this should be a builtin operation.
14652   if (Op == OO_Subscript) {
14653     if (!First->getType()->isOverloadableType() &&
14654         !Second->getType()->isOverloadableType())
14655       return getSema().CreateBuiltinArraySubscriptExpr(
14656           First, Callee->getBeginLoc(), Second, OpLoc);
14657   } else if (Op == OO_Arrow) {
14658     // -> is never a builtin operation.
14659     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14660   } else if (Second == nullptr || isPostIncDec) {
14661     if (!First->getType()->isOverloadableType() ||
14662         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14663       // The argument is not of overloadable type, or this is an expression
14664       // of the form &Class::member, so try to create a built-in unary
14665       // operation.
14666       UnaryOperatorKind Opc
14667         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14668 
14669       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14670     }
14671   } else {
14672     if (!First->getType()->isOverloadableType() &&
14673         !Second->getType()->isOverloadableType()) {
14674       // Neither of the arguments is an overloadable type, so try to
14675       // create a built-in binary operation.
14676       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14677       ExprResult Result
14678         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14679       if (Result.isInvalid())
14680         return ExprError();
14681 
14682       return Result;
14683     }
14684   }
14685 
14686   // Compute the transformed set of functions (and function templates) to be
14687   // used during overload resolution.
14688   UnresolvedSet<16> Functions;
14689   bool RequiresADL;
14690 
14691   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14692     Functions.append(ULE->decls_begin(), ULE->decls_end());
14693     // If the overload could not be resolved in the template definition
14694     // (because we had a dependent argument), ADL is performed as part of
14695     // template instantiation.
14696     RequiresADL = ULE->requiresADL();
14697   } else {
14698     // If we've resolved this to a particular non-member function, just call
14699     // that function. If we resolved it to a member function,
14700     // CreateOverloaded* will find that function for us.
14701     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14702     if (!isa<CXXMethodDecl>(ND))
14703       Functions.addDecl(ND);
14704     RequiresADL = false;
14705   }
14706 
14707   // Add any functions found via argument-dependent lookup.
14708   Expr *Args[2] = { First, Second };
14709   unsigned NumArgs = 1 + (Second != nullptr);
14710 
14711   // Create the overloaded operator invocation for unary operators.
14712   if (NumArgs == 1 || isPostIncDec) {
14713     UnaryOperatorKind Opc
14714       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14715     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14716                                            RequiresADL);
14717   }
14718 
14719   if (Op == OO_Subscript) {
14720     SourceLocation LBrace;
14721     SourceLocation RBrace;
14722 
14723     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14724       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14725       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14726       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14727     } else {
14728       LBrace = Callee->getBeginLoc();
14729       RBrace = OpLoc;
14730     }
14731 
14732     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14733                                                       First, Second);
14734   }
14735 
14736   // Create the overloaded operator invocation for binary operators.
14737   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14738   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14739       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14740   if (Result.isInvalid())
14741     return ExprError();
14742 
14743   return Result;
14744 }
14745 
14746 template<typename Derived>
14747 ExprResult
14748 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14749                                                      SourceLocation OperatorLoc,
14750                                                        bool isArrow,
14751                                                        CXXScopeSpec &SS,
14752                                                      TypeSourceInfo *ScopeType,
14753                                                        SourceLocation CCLoc,
14754                                                        SourceLocation TildeLoc,
14755                                         PseudoDestructorTypeStorage Destroyed) {
14756   QualType BaseType = Base->getType();
14757   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14758       (!isArrow && !BaseType->getAs<RecordType>()) ||
14759       (isArrow && BaseType->getAs<PointerType>() &&
14760        !BaseType->castAs<PointerType>()->getPointeeType()
14761                                               ->template getAs<RecordType>())){
14762     // This pseudo-destructor expression is still a pseudo-destructor.
14763     return SemaRef.BuildPseudoDestructorExpr(
14764         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14765         CCLoc, TildeLoc, Destroyed);
14766   }
14767 
14768   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14769   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14770                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14771   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14772   NameInfo.setNamedTypeInfo(DestroyedType);
14773 
14774   // The scope type is now known to be a valid nested name specifier
14775   // component. Tack it on to the end of the nested name specifier.
14776   if (ScopeType) {
14777     if (!ScopeType->getType()->getAs<TagType>()) {
14778       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14779                      diag::err_expected_class_or_namespace)
14780           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14781       return ExprError();
14782     }
14783     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14784               CCLoc);
14785   }
14786 
14787   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14788   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14789                                             OperatorLoc, isArrow,
14790                                             SS, TemplateKWLoc,
14791                                             /*FIXME: FirstQualifier*/ nullptr,
14792                                             NameInfo,
14793                                             /*TemplateArgs*/ nullptr,
14794                                             /*S*/nullptr);
14795 }
14796 
14797 template<typename Derived>
14798 StmtResult
14799 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14800   SourceLocation Loc = S->getBeginLoc();
14801   CapturedDecl *CD = S->getCapturedDecl();
14802   unsigned NumParams = CD->getNumParams();
14803   unsigned ContextParamPos = CD->getContextParamPosition();
14804   SmallVector<Sema::CapturedParamNameType, 4> Params;
14805   for (unsigned I = 0; I < NumParams; ++I) {
14806     if (I != ContextParamPos) {
14807       Params.push_back(
14808              std::make_pair(
14809                   CD->getParam(I)->getName(),
14810                   getDerived().TransformType(CD->getParam(I)->getType())));
14811     } else {
14812       Params.push_back(std::make_pair(StringRef(), QualType()));
14813     }
14814   }
14815   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14816                                      S->getCapturedRegionKind(), Params);
14817   StmtResult Body;
14818   {
14819     Sema::CompoundScopeRAII CompoundScope(getSema());
14820     Body = getDerived().TransformStmt(S->getCapturedStmt());
14821   }
14822 
14823   if (Body.isInvalid()) {
14824     getSema().ActOnCapturedRegionError();
14825     return StmtError();
14826   }
14827 
14828   return getSema().ActOnCapturedRegionEnd(Body.get());
14829 }
14830 
14831 } // end namespace clang
14832 
14833 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14834