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 type found via an alias.
937   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
938     return SemaRef.Context.getUsingType(Found, Underlying);
939   }
940 
941   /// Build a new typedef type.
942   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
943     return SemaRef.Context.getTypeDeclType(Typedef);
944   }
945 
946   /// Build a new MacroDefined type.
947   QualType RebuildMacroQualifiedType(QualType T,
948                                      const IdentifierInfo *MacroII) {
949     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
950   }
951 
952   /// Build a new class/struct/union type.
953   QualType RebuildRecordType(RecordDecl *Record) {
954     return SemaRef.Context.getTypeDeclType(Record);
955   }
956 
957   /// Build a new Enum type.
958   QualType RebuildEnumType(EnumDecl *Enum) {
959     return SemaRef.Context.getTypeDeclType(Enum);
960   }
961 
962   /// Build a new typeof(expr) type.
963   ///
964   /// By default, performs semantic analysis when building the typeof type.
965   /// Subclasses may override this routine to provide different behavior.
966   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
967 
968   /// Build a new typeof(type) type.
969   ///
970   /// By default, builds a new TypeOfType with the given underlying type.
971   QualType RebuildTypeOfType(QualType Underlying);
972 
973   /// Build a new unary transform type.
974   QualType RebuildUnaryTransformType(QualType BaseType,
975                                      UnaryTransformType::UTTKind UKind,
976                                      SourceLocation Loc);
977 
978   /// Build a new C++11 decltype type.
979   ///
980   /// By default, performs semantic analysis when building the decltype type.
981   /// Subclasses may override this routine to provide different behavior.
982   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
983 
984   /// Build a new C++11 auto type.
985   ///
986   /// By default, builds a new AutoType with the given deduced type.
987   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
988                            ConceptDecl *TypeConstraintConcept,
989                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
990     // Note, IsDependent is always false here: we implicitly convert an 'auto'
991     // which has been deduced to a dependent type into an undeduced 'auto', so
992     // that we'll retry deduction after the transformation.
993     return SemaRef.Context.getAutoType(Deduced, Keyword,
994                                        /*IsDependent*/ false, /*IsPack=*/false,
995                                        TypeConstraintConcept,
996                                        TypeConstraintArgs);
997   }
998 
999   /// By default, builds a new DeducedTemplateSpecializationType with the given
1000   /// deduced type.
1001   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1002       QualType Deduced) {
1003     return SemaRef.Context.getDeducedTemplateSpecializationType(
1004         Template, Deduced, /*IsDependent*/ false);
1005   }
1006 
1007   /// Build a new template specialization type.
1008   ///
1009   /// By default, performs semantic analysis when building the template
1010   /// specialization type. Subclasses may override this routine to provide
1011   /// different behavior.
1012   QualType RebuildTemplateSpecializationType(TemplateName Template,
1013                                              SourceLocation TemplateLoc,
1014                                              TemplateArgumentListInfo &Args);
1015 
1016   /// Build a new parenthesized type.
1017   ///
1018   /// By default, builds a new ParenType type from the inner type.
1019   /// Subclasses may override this routine to provide different behavior.
1020   QualType RebuildParenType(QualType InnerType) {
1021     return SemaRef.BuildParenType(InnerType);
1022   }
1023 
1024   /// Build a new qualified name type.
1025   ///
1026   /// By default, builds a new ElaboratedType type from the keyword,
1027   /// the nested-name-specifier and the named type.
1028   /// Subclasses may override this routine to provide different behavior.
1029   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1030                                  ElaboratedTypeKeyword Keyword,
1031                                  NestedNameSpecifierLoc QualifierLoc,
1032                                  QualType Named) {
1033     return SemaRef.Context.getElaboratedType(Keyword,
1034                                          QualifierLoc.getNestedNameSpecifier(),
1035                                              Named);
1036   }
1037 
1038   /// Build a new typename type that refers to a template-id.
1039   ///
1040   /// By default, builds a new DependentNameType type from the
1041   /// nested-name-specifier and the given type. Subclasses may override
1042   /// this routine to provide different behavior.
1043   QualType RebuildDependentTemplateSpecializationType(
1044                                           ElaboratedTypeKeyword Keyword,
1045                                           NestedNameSpecifierLoc QualifierLoc,
1046                                           SourceLocation TemplateKWLoc,
1047                                           const IdentifierInfo *Name,
1048                                           SourceLocation NameLoc,
1049                                           TemplateArgumentListInfo &Args,
1050                                           bool AllowInjectedClassName) {
1051     // Rebuild the template name.
1052     // TODO: avoid TemplateName abstraction
1053     CXXScopeSpec SS;
1054     SS.Adopt(QualifierLoc);
1055     TemplateName InstName = getDerived().RebuildTemplateName(
1056         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1057         AllowInjectedClassName);
1058 
1059     if (InstName.isNull())
1060       return QualType();
1061 
1062     // If it's still dependent, make a dependent specialization.
1063     if (InstName.getAsDependentTemplateName())
1064       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1065                                           QualifierLoc.getNestedNameSpecifier(),
1066                                                                     Name,
1067                                                                     Args);
1068 
1069     // Otherwise, make an elaborated type wrapping a non-dependent
1070     // specialization.
1071     QualType T =
1072     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1073     if (T.isNull()) return QualType();
1074 
1075     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1076       return T;
1077 
1078     return SemaRef.Context.getElaboratedType(Keyword,
1079                                        QualifierLoc.getNestedNameSpecifier(),
1080                                              T);
1081   }
1082 
1083   /// Build a new typename type that refers to an identifier.
1084   ///
1085   /// By default, performs semantic analysis when building the typename type
1086   /// (or elaborated type). Subclasses may override this routine to provide
1087   /// different behavior.
1088   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1089                                     SourceLocation KeywordLoc,
1090                                     NestedNameSpecifierLoc QualifierLoc,
1091                                     const IdentifierInfo *Id,
1092                                     SourceLocation IdLoc,
1093                                     bool DeducedTSTContext) {
1094     CXXScopeSpec SS;
1095     SS.Adopt(QualifierLoc);
1096 
1097     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1098       // If the name is still dependent, just build a new dependent name type.
1099       if (!SemaRef.computeDeclContext(SS))
1100         return SemaRef.Context.getDependentNameType(Keyword,
1101                                           QualifierLoc.getNestedNameSpecifier(),
1102                                                     Id);
1103     }
1104 
1105     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1106       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1107                                        *Id, IdLoc, DeducedTSTContext);
1108     }
1109 
1110     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1111 
1112     // We had a dependent elaborated-type-specifier that has been transformed
1113     // into a non-dependent elaborated-type-specifier. Find the tag we're
1114     // referring to.
1115     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1116     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1117     if (!DC)
1118       return QualType();
1119 
1120     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1121       return QualType();
1122 
1123     TagDecl *Tag = nullptr;
1124     SemaRef.LookupQualifiedName(Result, DC);
1125     switch (Result.getResultKind()) {
1126       case LookupResult::NotFound:
1127       case LookupResult::NotFoundInCurrentInstantiation:
1128         break;
1129 
1130       case LookupResult::Found:
1131         Tag = Result.getAsSingle<TagDecl>();
1132         break;
1133 
1134       case LookupResult::FoundOverloaded:
1135       case LookupResult::FoundUnresolvedValue:
1136         llvm_unreachable("Tag lookup cannot find non-tags");
1137 
1138       case LookupResult::Ambiguous:
1139         // Let the LookupResult structure handle ambiguities.
1140         return QualType();
1141     }
1142 
1143     if (!Tag) {
1144       // Check where the name exists but isn't a tag type and use that to emit
1145       // better diagnostics.
1146       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1147       SemaRef.LookupQualifiedName(Result, DC);
1148       switch (Result.getResultKind()) {
1149         case LookupResult::Found:
1150         case LookupResult::FoundOverloaded:
1151         case LookupResult::FoundUnresolvedValue: {
1152           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1153           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1154           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1155                                                                << NTK << Kind;
1156           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1157           break;
1158         }
1159         default:
1160           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1161               << Kind << Id << DC << QualifierLoc.getSourceRange();
1162           break;
1163       }
1164       return QualType();
1165     }
1166 
1167     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1168                                               IdLoc, Id)) {
1169       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1170       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1171       return QualType();
1172     }
1173 
1174     // Build the elaborated-type-specifier type.
1175     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1176     return SemaRef.Context.getElaboratedType(Keyword,
1177                                          QualifierLoc.getNestedNameSpecifier(),
1178                                              T);
1179   }
1180 
1181   /// Build a new pack expansion type.
1182   ///
1183   /// By default, builds a new PackExpansionType type from the given pattern.
1184   /// Subclasses may override this routine to provide different behavior.
1185   QualType RebuildPackExpansionType(QualType Pattern,
1186                                     SourceRange PatternRange,
1187                                     SourceLocation EllipsisLoc,
1188                                     Optional<unsigned> NumExpansions) {
1189     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1190                                         NumExpansions);
1191   }
1192 
1193   /// Build a new atomic type given its value type.
1194   ///
1195   /// By default, performs semantic analysis when building the atomic type.
1196   /// Subclasses may override this routine to provide different behavior.
1197   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1198 
1199   /// Build a new pipe type given its value type.
1200   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1201                            bool isReadPipe);
1202 
1203   /// Build a bit-precise int given its value type.
1204   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1205                              SourceLocation Loc);
1206 
1207   /// Build a dependent bit-precise int given its value type.
1208   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1209                                       SourceLocation Loc);
1210 
1211   /// Build a new template name given a nested name specifier, a flag
1212   /// indicating whether the "template" keyword was provided, and the template
1213   /// that the template name refers to.
1214   ///
1215   /// By default, builds the new template name directly. Subclasses may override
1216   /// this routine to provide different behavior.
1217   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1218                                    bool TemplateKW,
1219                                    TemplateDecl *Template);
1220 
1221   /// Build a new template name given a nested name specifier and the
1222   /// name that is referred to as a template.
1223   ///
1224   /// By default, performs semantic analysis to determine whether the name can
1225   /// be resolved to a specific template, then builds the appropriate kind of
1226   /// template name. Subclasses may override this routine to provide different
1227   /// behavior.
1228   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1229                                    SourceLocation TemplateKWLoc,
1230                                    const IdentifierInfo &Name,
1231                                    SourceLocation NameLoc, QualType ObjectType,
1232                                    NamedDecl *FirstQualifierInScope,
1233                                    bool AllowInjectedClassName);
1234 
1235   /// Build a new template name given a nested name specifier and the
1236   /// overloaded operator name that is referred to as a template.
1237   ///
1238   /// By default, performs semantic analysis to determine whether the name can
1239   /// be resolved to a specific template, then builds the appropriate kind of
1240   /// template name. Subclasses may override this routine to provide different
1241   /// behavior.
1242   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1243                                    SourceLocation TemplateKWLoc,
1244                                    OverloadedOperatorKind Operator,
1245                                    SourceLocation NameLoc, QualType ObjectType,
1246                                    bool AllowInjectedClassName);
1247 
1248   /// Build a new template name given a template template parameter pack
1249   /// and the
1250   ///
1251   /// By default, performs semantic analysis to determine whether the name can
1252   /// be resolved to a specific template, then builds the appropriate kind of
1253   /// template name. Subclasses may override this routine to provide different
1254   /// behavior.
1255   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1256                                    const TemplateArgument &ArgPack) {
1257     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1258   }
1259 
1260   /// Build a new compound statement.
1261   ///
1262   /// By default, performs semantic analysis to build the new statement.
1263   /// Subclasses may override this routine to provide different behavior.
1264   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1265                                        MultiStmtArg Statements,
1266                                        SourceLocation RBraceLoc,
1267                                        bool IsStmtExpr) {
1268     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1269                                        IsStmtExpr);
1270   }
1271 
1272   /// Build a new case statement.
1273   ///
1274   /// By default, performs semantic analysis to build the new statement.
1275   /// Subclasses may override this routine to provide different behavior.
1276   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1277                                    Expr *LHS,
1278                                    SourceLocation EllipsisLoc,
1279                                    Expr *RHS,
1280                                    SourceLocation ColonLoc) {
1281     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1282                                    ColonLoc);
1283   }
1284 
1285   /// Attach the body to a new case statement.
1286   ///
1287   /// By default, performs semantic analysis to build the new statement.
1288   /// Subclasses may override this routine to provide different behavior.
1289   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1290     getSema().ActOnCaseStmtBody(S, Body);
1291     return S;
1292   }
1293 
1294   /// Build a new default statement.
1295   ///
1296   /// By default, performs semantic analysis to build the new statement.
1297   /// Subclasses may override this routine to provide different behavior.
1298   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1299                                       SourceLocation ColonLoc,
1300                                       Stmt *SubStmt) {
1301     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1302                                       /*CurScope=*/nullptr);
1303   }
1304 
1305   /// Build a new label statement.
1306   ///
1307   /// By default, performs semantic analysis to build the new statement.
1308   /// Subclasses may override this routine to provide different behavior.
1309   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1310                               SourceLocation ColonLoc, Stmt *SubStmt) {
1311     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1312   }
1313 
1314   /// Build a new attributed statement.
1315   ///
1316   /// By default, performs semantic analysis to build the new statement.
1317   /// Subclasses may override this routine to provide different behavior.
1318   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1319                                    ArrayRef<const Attr *> Attrs,
1320                                    Stmt *SubStmt) {
1321     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1322   }
1323 
1324   /// Build a new "if" statement.
1325   ///
1326   /// By default, performs semantic analysis to build the new statement.
1327   /// Subclasses may override this routine to provide different behavior.
1328   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1329                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1330                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1331                            SourceLocation ElseLoc, Stmt *Else) {
1332     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1333                                  Then, ElseLoc, Else);
1334   }
1335 
1336   /// Start building a new switch statement.
1337   ///
1338   /// By default, performs semantic analysis to build the new statement.
1339   /// Subclasses may override this routine to provide different behavior.
1340   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1341                                     SourceLocation LParenLoc, Stmt *Init,
1342                                     Sema::ConditionResult Cond,
1343                                     SourceLocation RParenLoc) {
1344     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1345                                             RParenLoc);
1346   }
1347 
1348   /// Attach the body to the switch statement.
1349   ///
1350   /// By default, performs semantic analysis to build the new statement.
1351   /// Subclasses may override this routine to provide different behavior.
1352   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1353                                    Stmt *Switch, Stmt *Body) {
1354     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1355   }
1356 
1357   /// Build a new while statement.
1358   ///
1359   /// By default, performs semantic analysis to build the new statement.
1360   /// Subclasses may override this routine to provide different behavior.
1361   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1362                               Sema::ConditionResult Cond,
1363                               SourceLocation RParenLoc, Stmt *Body) {
1364     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1365   }
1366 
1367   /// Build a new do-while statement.
1368   ///
1369   /// By default, performs semantic analysis to build the new statement.
1370   /// Subclasses may override this routine to provide different behavior.
1371   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1372                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1373                            Expr *Cond, SourceLocation RParenLoc) {
1374     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1375                                  Cond, RParenLoc);
1376   }
1377 
1378   /// Build a new for statement.
1379   ///
1380   /// By default, performs semantic analysis to build the new statement.
1381   /// Subclasses may override this routine to provide different behavior.
1382   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1383                             Stmt *Init, Sema::ConditionResult Cond,
1384                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1385                             Stmt *Body) {
1386     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1387                                   Inc, RParenLoc, Body);
1388   }
1389 
1390   /// Build a new goto statement.
1391   ///
1392   /// By default, performs semantic analysis to build the new statement.
1393   /// Subclasses may override this routine to provide different behavior.
1394   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1395                              LabelDecl *Label) {
1396     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1397   }
1398 
1399   /// Build a new indirect goto statement.
1400   ///
1401   /// By default, performs semantic analysis to build the new statement.
1402   /// Subclasses may override this routine to provide different behavior.
1403   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1404                                      SourceLocation StarLoc,
1405                                      Expr *Target) {
1406     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1407   }
1408 
1409   /// Build a new return statement.
1410   ///
1411   /// By default, performs semantic analysis to build the new statement.
1412   /// Subclasses may override this routine to provide different behavior.
1413   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1414     return getSema().BuildReturnStmt(ReturnLoc, Result);
1415   }
1416 
1417   /// Build a new declaration statement.
1418   ///
1419   /// By default, performs semantic analysis to build the new statement.
1420   /// Subclasses may override this routine to provide different behavior.
1421   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1422                              SourceLocation StartLoc, SourceLocation EndLoc) {
1423     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1424     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1425   }
1426 
1427   /// Build a new inline asm statement.
1428   ///
1429   /// By default, performs semantic analysis to build the new statement.
1430   /// Subclasses may override this routine to provide different behavior.
1431   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1432                                bool IsVolatile, unsigned NumOutputs,
1433                                unsigned NumInputs, IdentifierInfo **Names,
1434                                MultiExprArg Constraints, MultiExprArg Exprs,
1435                                Expr *AsmString, MultiExprArg Clobbers,
1436                                unsigned NumLabels,
1437                                SourceLocation RParenLoc) {
1438     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1439                                      NumInputs, Names, Constraints, Exprs,
1440                                      AsmString, Clobbers, NumLabels, RParenLoc);
1441   }
1442 
1443   /// Build a new MS style inline asm statement.
1444   ///
1445   /// By default, performs semantic analysis to build the new statement.
1446   /// Subclasses may override this routine to provide different behavior.
1447   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1448                               ArrayRef<Token> AsmToks,
1449                               StringRef AsmString,
1450                               unsigned NumOutputs, unsigned NumInputs,
1451                               ArrayRef<StringRef> Constraints,
1452                               ArrayRef<StringRef> Clobbers,
1453                               ArrayRef<Expr*> Exprs,
1454                               SourceLocation EndLoc) {
1455     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1456                                     NumOutputs, NumInputs,
1457                                     Constraints, Clobbers, Exprs, EndLoc);
1458   }
1459 
1460   /// Build a new co_return statement.
1461   ///
1462   /// By default, performs semantic analysis to build the new statement.
1463   /// Subclasses may override this routine to provide different behavior.
1464   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1465                                  bool IsImplicit) {
1466     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1467   }
1468 
1469   /// Build a new co_await expression.
1470   ///
1471   /// By default, performs semantic analysis to build the new expression.
1472   /// Subclasses may override this routine to provide different behavior.
1473   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1474                                 bool IsImplicit) {
1475     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1476   }
1477 
1478   /// Build a new co_await expression.
1479   ///
1480   /// By default, performs semantic analysis to build the new expression.
1481   /// Subclasses may override this routine to provide different behavior.
1482   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1483                                          Expr *Result,
1484                                          UnresolvedLookupExpr *Lookup) {
1485     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1486   }
1487 
1488   /// Build a new co_yield expression.
1489   ///
1490   /// By default, performs semantic analysis to build the new expression.
1491   /// Subclasses may override this routine to provide different behavior.
1492   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1493     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1494   }
1495 
1496   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1497     return getSema().BuildCoroutineBodyStmt(Args);
1498   }
1499 
1500   /// Build a new Objective-C \@try statement.
1501   ///
1502   /// By default, performs semantic analysis to build the new statement.
1503   /// Subclasses may override this routine to provide different behavior.
1504   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1505                                         Stmt *TryBody,
1506                                         MultiStmtArg CatchStmts,
1507                                         Stmt *Finally) {
1508     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1509                                         Finally);
1510   }
1511 
1512   /// Rebuild an Objective-C exception declaration.
1513   ///
1514   /// By default, performs semantic analysis to build the new declaration.
1515   /// Subclasses may override this routine to provide different behavior.
1516   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1517                                     TypeSourceInfo *TInfo, QualType T) {
1518     return getSema().BuildObjCExceptionDecl(TInfo, T,
1519                                             ExceptionDecl->getInnerLocStart(),
1520                                             ExceptionDecl->getLocation(),
1521                                             ExceptionDecl->getIdentifier());
1522   }
1523 
1524   /// Build a new Objective-C \@catch statement.
1525   ///
1526   /// By default, performs semantic analysis to build the new statement.
1527   /// Subclasses may override this routine to provide different behavior.
1528   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1529                                           SourceLocation RParenLoc,
1530                                           VarDecl *Var,
1531                                           Stmt *Body) {
1532     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1533                                           Var, Body);
1534   }
1535 
1536   /// Build a new Objective-C \@finally statement.
1537   ///
1538   /// By default, performs semantic analysis to build the new statement.
1539   /// Subclasses may override this routine to provide different behavior.
1540   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1541                                             Stmt *Body) {
1542     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1543   }
1544 
1545   /// Build a new Objective-C \@throw statement.
1546   ///
1547   /// By default, performs semantic analysis to build the new statement.
1548   /// Subclasses may override this routine to provide different behavior.
1549   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1550                                           Expr *Operand) {
1551     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1552   }
1553 
1554   /// Build a new OpenMP Canonical loop.
1555   ///
1556   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1557   /// OMPCanonicalLoop.
1558   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1559     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1560   }
1561 
1562   /// Build a new OpenMP executable directive.
1563   ///
1564   /// By default, performs semantic analysis to build the new statement.
1565   /// Subclasses may override this routine to provide different behavior.
1566   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1567                                            DeclarationNameInfo DirName,
1568                                            OpenMPDirectiveKind CancelRegion,
1569                                            ArrayRef<OMPClause *> Clauses,
1570                                            Stmt *AStmt, SourceLocation StartLoc,
1571                                            SourceLocation EndLoc) {
1572     return getSema().ActOnOpenMPExecutableDirective(
1573         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1574   }
1575 
1576   /// Build a new OpenMP 'if' clause.
1577   ///
1578   /// By default, performs semantic analysis to build the new OpenMP clause.
1579   /// Subclasses may override this routine to provide different behavior.
1580   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1581                                 Expr *Condition, SourceLocation StartLoc,
1582                                 SourceLocation LParenLoc,
1583                                 SourceLocation NameModifierLoc,
1584                                 SourceLocation ColonLoc,
1585                                 SourceLocation EndLoc) {
1586     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1587                                          LParenLoc, NameModifierLoc, ColonLoc,
1588                                          EndLoc);
1589   }
1590 
1591   /// Build a new OpenMP 'final' clause.
1592   ///
1593   /// By default, performs semantic analysis to build the new OpenMP clause.
1594   /// Subclasses may override this routine to provide different behavior.
1595   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1596                                    SourceLocation LParenLoc,
1597                                    SourceLocation EndLoc) {
1598     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1599                                             EndLoc);
1600   }
1601 
1602   /// Build a new OpenMP 'num_threads' clause.
1603   ///
1604   /// By default, performs semantic analysis to build the new OpenMP clause.
1605   /// Subclasses may override this routine to provide different behavior.
1606   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1607                                         SourceLocation StartLoc,
1608                                         SourceLocation LParenLoc,
1609                                         SourceLocation EndLoc) {
1610     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1611                                                  LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'safelen' clause.
1615   ///
1616   /// By default, performs semantic analysis to build the new OpenMP clause.
1617   /// Subclasses may override this routine to provide different behavior.
1618   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1619                                      SourceLocation LParenLoc,
1620                                      SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1622   }
1623 
1624   /// Build a new OpenMP 'simdlen' clause.
1625   ///
1626   /// By default, performs semantic analysis to build the new OpenMP clause.
1627   /// Subclasses may override this routine to provide different behavior.
1628   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1629                                      SourceLocation LParenLoc,
1630                                      SourceLocation EndLoc) {
1631     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1632   }
1633 
1634   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1635                                    SourceLocation StartLoc,
1636                                    SourceLocation LParenLoc,
1637                                    SourceLocation EndLoc) {
1638     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'full' clause.
1642   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1643                                   SourceLocation EndLoc) {
1644     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1645   }
1646 
1647   /// Build a new OpenMP 'partial' clause.
1648   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1649                                      SourceLocation LParenLoc,
1650                                      SourceLocation EndLoc) {
1651     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1652                                               EndLoc);
1653   }
1654 
1655   /// Build a new OpenMP 'allocator' clause.
1656   ///
1657   /// By default, performs semantic analysis to build the new OpenMP clause.
1658   /// Subclasses may override this routine to provide different behavior.
1659   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1660                                        SourceLocation LParenLoc,
1661                                        SourceLocation EndLoc) {
1662     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1663   }
1664 
1665   /// Build a new OpenMP 'collapse' clause.
1666   ///
1667   /// By default, performs semantic analysis to build the new OpenMP clause.
1668   /// Subclasses may override this routine to provide different behavior.
1669   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1670                                       SourceLocation LParenLoc,
1671                                       SourceLocation EndLoc) {
1672     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1673                                                EndLoc);
1674   }
1675 
1676   /// Build a new OpenMP 'default' clause.
1677   ///
1678   /// By default, performs semantic analysis to build the new OpenMP clause.
1679   /// Subclasses may override this routine to provide different behavior.
1680   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1681                                      SourceLocation StartLoc,
1682                                      SourceLocation LParenLoc,
1683                                      SourceLocation EndLoc) {
1684     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1685                                               StartLoc, LParenLoc, EndLoc);
1686   }
1687 
1688   /// Build a new OpenMP 'proc_bind' clause.
1689   ///
1690   /// By default, performs semantic analysis to build the new OpenMP clause.
1691   /// Subclasses may override this routine to provide different behavior.
1692   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1693                                       SourceLocation KindKwLoc,
1694                                       SourceLocation StartLoc,
1695                                       SourceLocation LParenLoc,
1696                                       SourceLocation EndLoc) {
1697     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1698                                                StartLoc, LParenLoc, EndLoc);
1699   }
1700 
1701   /// Build a new OpenMP 'schedule' clause.
1702   ///
1703   /// By default, performs semantic analysis to build the new OpenMP clause.
1704   /// Subclasses may override this routine to provide different behavior.
1705   OMPClause *RebuildOMPScheduleClause(
1706       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1707       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1708       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1709       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1710     return getSema().ActOnOpenMPScheduleClause(
1711         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1712         CommaLoc, EndLoc);
1713   }
1714 
1715   /// Build a new OpenMP 'ordered' clause.
1716   ///
1717   /// By default, performs semantic analysis to build the new OpenMP clause.
1718   /// Subclasses may override this routine to provide different behavior.
1719   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1720                                      SourceLocation EndLoc,
1721                                      SourceLocation LParenLoc, Expr *Num) {
1722     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1723   }
1724 
1725   /// Build a new OpenMP 'private' clause.
1726   ///
1727   /// By default, performs semantic analysis to build the new OpenMP clause.
1728   /// Subclasses may override this routine to provide different behavior.
1729   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1730                                      SourceLocation StartLoc,
1731                                      SourceLocation LParenLoc,
1732                                      SourceLocation EndLoc) {
1733     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1734                                               EndLoc);
1735   }
1736 
1737   /// Build a new OpenMP 'firstprivate' clause.
1738   ///
1739   /// By default, performs semantic analysis to build the new OpenMP clause.
1740   /// Subclasses may override this routine to provide different behavior.
1741   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1742                                           SourceLocation StartLoc,
1743                                           SourceLocation LParenLoc,
1744                                           SourceLocation EndLoc) {
1745     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1746                                                    EndLoc);
1747   }
1748 
1749   /// Build a new OpenMP 'lastprivate' clause.
1750   ///
1751   /// By default, performs semantic analysis to build the new OpenMP clause.
1752   /// Subclasses may override this routine to provide different behavior.
1753   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1754                                          OpenMPLastprivateModifier LPKind,
1755                                          SourceLocation LPKindLoc,
1756                                          SourceLocation ColonLoc,
1757                                          SourceLocation StartLoc,
1758                                          SourceLocation LParenLoc,
1759                                          SourceLocation EndLoc) {
1760     return getSema().ActOnOpenMPLastprivateClause(
1761         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1762   }
1763 
1764   /// Build a new OpenMP 'shared' clause.
1765   ///
1766   /// By default, performs semantic analysis to build the new OpenMP clause.
1767   /// Subclasses may override this routine to provide different behavior.
1768   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1769                                     SourceLocation StartLoc,
1770                                     SourceLocation LParenLoc,
1771                                     SourceLocation EndLoc) {
1772     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1773                                              EndLoc);
1774   }
1775 
1776   /// Build a new OpenMP 'reduction' clause.
1777   ///
1778   /// By default, performs semantic analysis to build the new statement.
1779   /// Subclasses may override this routine to provide different behavior.
1780   OMPClause *RebuildOMPReductionClause(
1781       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1782       SourceLocation StartLoc, SourceLocation LParenLoc,
1783       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1784       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1785       const DeclarationNameInfo &ReductionId,
1786       ArrayRef<Expr *> UnresolvedReductions) {
1787     return getSema().ActOnOpenMPReductionClause(
1788         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1789         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1790   }
1791 
1792   /// Build a new OpenMP 'task_reduction' clause.
1793   ///
1794   /// By default, performs semantic analysis to build the new statement.
1795   /// Subclasses may override this routine to provide different behavior.
1796   OMPClause *RebuildOMPTaskReductionClause(
1797       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1798       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1799       CXXScopeSpec &ReductionIdScopeSpec,
1800       const DeclarationNameInfo &ReductionId,
1801       ArrayRef<Expr *> UnresolvedReductions) {
1802     return getSema().ActOnOpenMPTaskReductionClause(
1803         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1804         ReductionId, UnresolvedReductions);
1805   }
1806 
1807   /// Build a new OpenMP 'in_reduction' clause.
1808   ///
1809   /// By default, performs semantic analysis to build the new statement.
1810   /// Subclasses may override this routine to provide different behavior.
1811   OMPClause *
1812   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1813                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1814                               SourceLocation EndLoc,
1815                               CXXScopeSpec &ReductionIdScopeSpec,
1816                               const DeclarationNameInfo &ReductionId,
1817                               ArrayRef<Expr *> UnresolvedReductions) {
1818     return getSema().ActOnOpenMPInReductionClause(
1819         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1820         ReductionId, UnresolvedReductions);
1821   }
1822 
1823   /// Build a new OpenMP 'linear' clause.
1824   ///
1825   /// By default, performs semantic analysis to build the new OpenMP clause.
1826   /// Subclasses may override this routine to provide different behavior.
1827   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1828                                     SourceLocation StartLoc,
1829                                     SourceLocation LParenLoc,
1830                                     OpenMPLinearClauseKind Modifier,
1831                                     SourceLocation ModifierLoc,
1832                                     SourceLocation ColonLoc,
1833                                     SourceLocation EndLoc) {
1834     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1835                                              Modifier, ModifierLoc, ColonLoc,
1836                                              EndLoc);
1837   }
1838 
1839   /// Build a new OpenMP 'aligned' clause.
1840   ///
1841   /// By default, performs semantic analysis to build the new OpenMP clause.
1842   /// Subclasses may override this routine to provide different behavior.
1843   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1844                                      SourceLocation StartLoc,
1845                                      SourceLocation LParenLoc,
1846                                      SourceLocation ColonLoc,
1847                                      SourceLocation EndLoc) {
1848     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1849                                               LParenLoc, ColonLoc, EndLoc);
1850   }
1851 
1852   /// Build a new OpenMP 'copyin' clause.
1853   ///
1854   /// By default, performs semantic analysis to build the new OpenMP clause.
1855   /// Subclasses may override this routine to provide different behavior.
1856   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1857                                     SourceLocation StartLoc,
1858                                     SourceLocation LParenLoc,
1859                                     SourceLocation EndLoc) {
1860     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1861                                              EndLoc);
1862   }
1863 
1864   /// Build a new OpenMP 'copyprivate' clause.
1865   ///
1866   /// By default, performs semantic analysis to build the new OpenMP clause.
1867   /// Subclasses may override this routine to provide different behavior.
1868   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1869                                          SourceLocation StartLoc,
1870                                          SourceLocation LParenLoc,
1871                                          SourceLocation EndLoc) {
1872     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1873                                                   EndLoc);
1874   }
1875 
1876   /// Build a new OpenMP 'flush' pseudo clause.
1877   ///
1878   /// By default, performs semantic analysis to build the new OpenMP clause.
1879   /// Subclasses may override this routine to provide different behavior.
1880   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1881                                    SourceLocation StartLoc,
1882                                    SourceLocation LParenLoc,
1883                                    SourceLocation EndLoc) {
1884     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1885                                             EndLoc);
1886   }
1887 
1888   /// Build a new OpenMP 'depobj' pseudo clause.
1889   ///
1890   /// By default, performs semantic analysis to build the new OpenMP clause.
1891   /// Subclasses may override this routine to provide different behavior.
1892   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1893                                     SourceLocation LParenLoc,
1894                                     SourceLocation EndLoc) {
1895     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1896                                              EndLoc);
1897   }
1898 
1899   /// Build a new OpenMP 'depend' pseudo clause.
1900   ///
1901   /// By default, performs semantic analysis to build the new OpenMP clause.
1902   /// Subclasses may override this routine to provide different behavior.
1903   OMPClause *
1904   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1905                          SourceLocation DepLoc, SourceLocation ColonLoc,
1906                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1907                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1908     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1909                                              ColonLoc, VarList, StartLoc,
1910                                              LParenLoc, EndLoc);
1911   }
1912 
1913   /// Build a new OpenMP 'device' clause.
1914   ///
1915   /// By default, performs semantic analysis to build the new statement.
1916   /// Subclasses may override this routine to provide different behavior.
1917   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1918                                     Expr *Device, SourceLocation StartLoc,
1919                                     SourceLocation LParenLoc,
1920                                     SourceLocation ModifierLoc,
1921                                     SourceLocation EndLoc) {
1922     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1923                                              LParenLoc, ModifierLoc, EndLoc);
1924   }
1925 
1926   /// Build a new OpenMP 'map' clause.
1927   ///
1928   /// By default, performs semantic analysis to build the new OpenMP clause.
1929   /// Subclasses may override this routine to provide different behavior.
1930   OMPClause *RebuildOMPMapClause(
1931       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1932       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1933       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1934       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1935       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1936       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1937     return getSema().ActOnOpenMPMapClause(
1938         MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId,
1939         MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs,
1940         /*NoDiagnose=*/false, UnresolvedMappers);
1941   }
1942 
1943   /// Build a new OpenMP 'allocate' clause.
1944   ///
1945   /// By default, performs semantic analysis to build the new OpenMP clause.
1946   /// Subclasses may override this routine to provide different behavior.
1947   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1948                                       SourceLocation StartLoc,
1949                                       SourceLocation LParenLoc,
1950                                       SourceLocation ColonLoc,
1951                                       SourceLocation EndLoc) {
1952     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1953                                                LParenLoc, ColonLoc, EndLoc);
1954   }
1955 
1956   /// Build a new OpenMP 'num_teams' clause.
1957   ///
1958   /// By default, performs semantic analysis to build the new statement.
1959   /// Subclasses may override this routine to provide different behavior.
1960   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1961                                       SourceLocation LParenLoc,
1962                                       SourceLocation EndLoc) {
1963     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1964                                                EndLoc);
1965   }
1966 
1967   /// Build a new OpenMP 'thread_limit' clause.
1968   ///
1969   /// By default, performs semantic analysis to build the new statement.
1970   /// Subclasses may override this routine to provide different behavior.
1971   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1972                                          SourceLocation StartLoc,
1973                                          SourceLocation LParenLoc,
1974                                          SourceLocation EndLoc) {
1975     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1976                                                   LParenLoc, EndLoc);
1977   }
1978 
1979   /// Build a new OpenMP 'priority' clause.
1980   ///
1981   /// By default, performs semantic analysis to build the new statement.
1982   /// Subclasses may override this routine to provide different behavior.
1983   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1984                                       SourceLocation LParenLoc,
1985                                       SourceLocation EndLoc) {
1986     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1987                                                EndLoc);
1988   }
1989 
1990   /// Build a new OpenMP 'grainsize' clause.
1991   ///
1992   /// By default, performs semantic analysis to build the new statement.
1993   /// Subclasses may override this routine to provide different behavior.
1994   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1995                                        SourceLocation LParenLoc,
1996                                        SourceLocation EndLoc) {
1997     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1998                                                 EndLoc);
1999   }
2000 
2001   /// Build a new OpenMP 'num_tasks' clause.
2002   ///
2003   /// By default, performs semantic analysis to build the new statement.
2004   /// Subclasses may override this routine to provide different behavior.
2005   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
2006                                       SourceLocation LParenLoc,
2007                                       SourceLocation EndLoc) {
2008     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
2009                                                EndLoc);
2010   }
2011 
2012   /// Build a new OpenMP 'hint' clause.
2013   ///
2014   /// By default, performs semantic analysis to build the new statement.
2015   /// Subclasses may override this routine to provide different behavior.
2016   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2017                                   SourceLocation LParenLoc,
2018                                   SourceLocation EndLoc) {
2019     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2020   }
2021 
2022   /// Build a new OpenMP 'detach' clause.
2023   ///
2024   /// By default, performs semantic analysis to build the new statement.
2025   /// Subclasses may override this routine to provide different behavior.
2026   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2027                                     SourceLocation LParenLoc,
2028                                     SourceLocation EndLoc) {
2029     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2030   }
2031 
2032   /// Build a new OpenMP 'dist_schedule' clause.
2033   ///
2034   /// By default, performs semantic analysis to build the new OpenMP clause.
2035   /// Subclasses may override this routine to provide different behavior.
2036   OMPClause *
2037   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2038                                Expr *ChunkSize, SourceLocation StartLoc,
2039                                SourceLocation LParenLoc, SourceLocation KindLoc,
2040                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2041     return getSema().ActOnOpenMPDistScheduleClause(
2042         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2043   }
2044 
2045   /// Build a new OpenMP 'to' clause.
2046   ///
2047   /// By default, performs semantic analysis to build the new statement.
2048   /// Subclasses may override this routine to provide different behavior.
2049   OMPClause *
2050   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2051                      ArrayRef<SourceLocation> MotionModifiersLoc,
2052                      CXXScopeSpec &MapperIdScopeSpec,
2053                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2054                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2055                      ArrayRef<Expr *> UnresolvedMappers) {
2056     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2057                                          MapperIdScopeSpec, MapperId, ColonLoc,
2058                                          VarList, Locs, UnresolvedMappers);
2059   }
2060 
2061   /// Build a new OpenMP 'from' clause.
2062   ///
2063   /// By default, performs semantic analysis to build the new statement.
2064   /// Subclasses may override this routine to provide different behavior.
2065   OMPClause *
2066   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2067                        ArrayRef<SourceLocation> MotionModifiersLoc,
2068                        CXXScopeSpec &MapperIdScopeSpec,
2069                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2070                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2071                        ArrayRef<Expr *> UnresolvedMappers) {
2072     return getSema().ActOnOpenMPFromClause(
2073         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2074         ColonLoc, VarList, Locs, UnresolvedMappers);
2075   }
2076 
2077   /// Build a new OpenMP 'use_device_ptr' clause.
2078   ///
2079   /// By default, performs semantic analysis to build the new OpenMP clause.
2080   /// Subclasses may override this routine to provide different behavior.
2081   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2082                                           const OMPVarListLocTy &Locs) {
2083     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2084   }
2085 
2086   /// Build a new OpenMP 'use_device_addr' clause.
2087   ///
2088   /// By default, performs semantic analysis to build the new OpenMP clause.
2089   /// Subclasses may override this routine to provide different behavior.
2090   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2091                                            const OMPVarListLocTy &Locs) {
2092     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2093   }
2094 
2095   /// Build a new OpenMP 'is_device_ptr' clause.
2096   ///
2097   /// By default, performs semantic analysis to build the new OpenMP clause.
2098   /// Subclasses may override this routine to provide different behavior.
2099   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2100                                          const OMPVarListLocTy &Locs) {
2101     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2102   }
2103 
2104   /// Build a new OpenMP 'defaultmap' clause.
2105   ///
2106   /// By default, performs semantic analysis to build the new OpenMP clause.
2107   /// Subclasses may override this routine to provide different behavior.
2108   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2109                                         OpenMPDefaultmapClauseKind Kind,
2110                                         SourceLocation StartLoc,
2111                                         SourceLocation LParenLoc,
2112                                         SourceLocation MLoc,
2113                                         SourceLocation KindLoc,
2114                                         SourceLocation EndLoc) {
2115     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2116                                                  MLoc, KindLoc, EndLoc);
2117   }
2118 
2119   /// Build a new OpenMP 'nontemporal' clause.
2120   ///
2121   /// By default, performs semantic analysis to build the new OpenMP clause.
2122   /// Subclasses may override this routine to provide different behavior.
2123   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2124                                          SourceLocation StartLoc,
2125                                          SourceLocation LParenLoc,
2126                                          SourceLocation EndLoc) {
2127     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2128                                                   EndLoc);
2129   }
2130 
2131   /// Build a new OpenMP 'inclusive' clause.
2132   ///
2133   /// By default, performs semantic analysis to build the new OpenMP clause.
2134   /// Subclasses may override this routine to provide different behavior.
2135   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2136                                        SourceLocation StartLoc,
2137                                        SourceLocation LParenLoc,
2138                                        SourceLocation EndLoc) {
2139     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2140                                                 EndLoc);
2141   }
2142 
2143   /// Build a new OpenMP 'exclusive' clause.
2144   ///
2145   /// By default, performs semantic analysis to build the new OpenMP clause.
2146   /// Subclasses may override this routine to provide different behavior.
2147   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2148                                        SourceLocation StartLoc,
2149                                        SourceLocation LParenLoc,
2150                                        SourceLocation EndLoc) {
2151     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2152                                                 EndLoc);
2153   }
2154 
2155   /// Build a new OpenMP 'uses_allocators' clause.
2156   ///
2157   /// By default, performs semantic analysis to build the new OpenMP clause.
2158   /// Subclasses may override this routine to provide different behavior.
2159   OMPClause *RebuildOMPUsesAllocatorsClause(
2160       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2161       SourceLocation LParenLoc, SourceLocation EndLoc) {
2162     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2163                                                     Data);
2164   }
2165 
2166   /// Build a new OpenMP 'affinity' clause.
2167   ///
2168   /// By default, performs semantic analysis to build the new OpenMP clause.
2169   /// Subclasses may override this routine to provide different behavior.
2170   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2171                                       SourceLocation LParenLoc,
2172                                       SourceLocation ColonLoc,
2173                                       SourceLocation EndLoc, Expr *Modifier,
2174                                       ArrayRef<Expr *> Locators) {
2175     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2176                                                EndLoc, Modifier, Locators);
2177   }
2178 
2179   /// Build a new OpenMP 'order' clause.
2180   ///
2181   /// By default, performs semantic analysis to build the new OpenMP clause.
2182   /// Subclasses may override this routine to provide different behavior.
2183   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2184                                    SourceLocation KindKwLoc,
2185                                    SourceLocation StartLoc,
2186                                    SourceLocation LParenLoc,
2187                                    SourceLocation EndLoc) {
2188     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2189                                             LParenLoc, EndLoc);
2190   }
2191 
2192   /// Build a new OpenMP 'init' clause.
2193   ///
2194   /// By default, performs semantic analysis to build the new OpenMP clause.
2195   /// Subclasses may override this routine to provide different behavior.
2196   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2197                                   bool IsTarget, bool IsTargetSync,
2198                                   SourceLocation StartLoc,
2199                                   SourceLocation LParenLoc,
2200                                   SourceLocation VarLoc,
2201                                   SourceLocation EndLoc) {
2202     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2203                                            IsTargetSync, StartLoc, LParenLoc,
2204                                            VarLoc, EndLoc);
2205   }
2206 
2207   /// Build a new OpenMP 'use' clause.
2208   ///
2209   /// By default, performs semantic analysis to build the new OpenMP clause.
2210   /// Subclasses may override this routine to provide different behavior.
2211   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2212                                  SourceLocation LParenLoc,
2213                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2214     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2215                                           VarLoc, EndLoc);
2216   }
2217 
2218   /// Build a new OpenMP 'destroy' clause.
2219   ///
2220   /// By default, performs semantic analysis to build the new OpenMP clause.
2221   /// Subclasses may override this routine to provide different behavior.
2222   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2223                                      SourceLocation LParenLoc,
2224                                      SourceLocation VarLoc,
2225                                      SourceLocation EndLoc) {
2226     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2227                                               VarLoc, EndLoc);
2228   }
2229 
2230   /// Build a new OpenMP 'novariants' clause.
2231   ///
2232   /// By default, performs semantic analysis to build the new OpenMP clause.
2233   /// Subclasses may override this routine to provide different behavior.
2234   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2235                                         SourceLocation StartLoc,
2236                                         SourceLocation LParenLoc,
2237                                         SourceLocation EndLoc) {
2238     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2239                                                  EndLoc);
2240   }
2241 
2242   /// Build a new OpenMP 'nocontext' clause.
2243   ///
2244   /// By default, performs semantic analysis to build the new OpenMP clause.
2245   /// Subclasses may override this routine to provide different behavior.
2246   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2247                                        SourceLocation LParenLoc,
2248                                        SourceLocation EndLoc) {
2249     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2250                                                 EndLoc);
2251   }
2252 
2253   /// Build a new OpenMP 'filter' clause.
2254   ///
2255   /// By default, performs semantic analysis to build the new OpenMP clause.
2256   /// Subclasses may override this routine to provide different behavior.
2257   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2258                                     SourceLocation LParenLoc,
2259                                     SourceLocation EndLoc) {
2260     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2261                                              EndLoc);
2262   }
2263 
2264   /// Build a new OpenMP 'bind' clause.
2265   ///
2266   /// By default, performs semantic analysis to build the new OpenMP clause.
2267   /// Subclasses may override this routine to provide different behavior.
2268   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2269                                   SourceLocation KindLoc,
2270                                   SourceLocation StartLoc,
2271                                   SourceLocation LParenLoc,
2272                                   SourceLocation EndLoc) {
2273     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2274                                            EndLoc);
2275   }
2276 
2277   /// Build a new OpenMP 'align' clause.
2278   ///
2279   /// By default, performs semantic analysis to build the new OpenMP clause.
2280   /// Subclasses may override this routine to provide different behavior.
2281   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2282                                    SourceLocation LParenLoc,
2283                                    SourceLocation EndLoc) {
2284     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2285   }
2286 
2287   /// Rebuild the operand to an Objective-C \@synchronized statement.
2288   ///
2289   /// By default, performs semantic analysis to build the new statement.
2290   /// Subclasses may override this routine to provide different behavior.
2291   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2292                                               Expr *object) {
2293     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2294   }
2295 
2296   /// Build a new Objective-C \@synchronized statement.
2297   ///
2298   /// By default, performs semantic analysis to build the new statement.
2299   /// Subclasses may override this routine to provide different behavior.
2300   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2301                                            Expr *Object, Stmt *Body) {
2302     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2303   }
2304 
2305   /// Build a new Objective-C \@autoreleasepool statement.
2306   ///
2307   /// By default, performs semantic analysis to build the new statement.
2308   /// Subclasses may override this routine to provide different behavior.
2309   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2310                                             Stmt *Body) {
2311     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2312   }
2313 
2314   /// Build a new Objective-C fast enumeration statement.
2315   ///
2316   /// By default, performs semantic analysis to build the new statement.
2317   /// Subclasses may override this routine to provide different behavior.
2318   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2319                                           Stmt *Element,
2320                                           Expr *Collection,
2321                                           SourceLocation RParenLoc,
2322                                           Stmt *Body) {
2323     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2324                                                 Element,
2325                                                 Collection,
2326                                                 RParenLoc);
2327     if (ForEachStmt.isInvalid())
2328       return StmtError();
2329 
2330     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2331   }
2332 
2333   /// Build a new C++ exception declaration.
2334   ///
2335   /// By default, performs semantic analysis to build the new decaration.
2336   /// Subclasses may override this routine to provide different behavior.
2337   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2338                                 TypeSourceInfo *Declarator,
2339                                 SourceLocation StartLoc,
2340                                 SourceLocation IdLoc,
2341                                 IdentifierInfo *Id) {
2342     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2343                                                        StartLoc, IdLoc, Id);
2344     if (Var)
2345       getSema().CurContext->addDecl(Var);
2346     return Var;
2347   }
2348 
2349   /// Build a new C++ catch statement.
2350   ///
2351   /// By default, performs semantic analysis to build the new statement.
2352   /// Subclasses may override this routine to provide different behavior.
2353   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2354                                  VarDecl *ExceptionDecl,
2355                                  Stmt *Handler) {
2356     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2357                                                       Handler));
2358   }
2359 
2360   /// Build a new C++ try statement.
2361   ///
2362   /// By default, performs semantic analysis to build the new statement.
2363   /// Subclasses may override this routine to provide different behavior.
2364   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2365                                ArrayRef<Stmt *> Handlers) {
2366     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2367   }
2368 
2369   /// Build a new C++0x range-based for statement.
2370   ///
2371   /// By default, performs semantic analysis to build the new statement.
2372   /// Subclasses may override this routine to provide different behavior.
2373   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2374                                     SourceLocation CoawaitLoc, Stmt *Init,
2375                                     SourceLocation ColonLoc, Stmt *Range,
2376                                     Stmt *Begin, Stmt *End, Expr *Cond,
2377                                     Expr *Inc, Stmt *LoopVar,
2378                                     SourceLocation RParenLoc) {
2379     // If we've just learned that the range is actually an Objective-C
2380     // collection, treat this as an Objective-C fast enumeration loop.
2381     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2382       if (RangeStmt->isSingleDecl()) {
2383         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2384           if (RangeVar->isInvalidDecl())
2385             return StmtError();
2386 
2387           Expr *RangeExpr = RangeVar->getInit();
2388           if (!RangeExpr->isTypeDependent() &&
2389               RangeExpr->getType()->isObjCObjectPointerType()) {
2390             // FIXME: Support init-statements in Objective-C++20 ranged for
2391             // statement.
2392             if (Init) {
2393               return SemaRef.Diag(Init->getBeginLoc(),
2394                                   diag::err_objc_for_range_init_stmt)
2395                          << Init->getSourceRange();
2396             }
2397             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2398                                                         RangeExpr, RParenLoc);
2399           }
2400         }
2401       }
2402     }
2403 
2404     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2405                                           Range, Begin, End, Cond, Inc, LoopVar,
2406                                           RParenLoc, Sema::BFRK_Rebuild);
2407   }
2408 
2409   /// Build a new C++0x range-based for statement.
2410   ///
2411   /// By default, performs semantic analysis to build the new statement.
2412   /// Subclasses may override this routine to provide different behavior.
2413   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2414                                           bool IsIfExists,
2415                                           NestedNameSpecifierLoc QualifierLoc,
2416                                           DeclarationNameInfo NameInfo,
2417                                           Stmt *Nested) {
2418     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2419                                                 QualifierLoc, NameInfo, Nested);
2420   }
2421 
2422   /// Attach body to a C++0x range-based for statement.
2423   ///
2424   /// By default, performs semantic analysis to finish the new statement.
2425   /// Subclasses may override this routine to provide different behavior.
2426   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2427     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2428   }
2429 
2430   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2431                                Stmt *TryBlock, Stmt *Handler) {
2432     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2433   }
2434 
2435   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2436                                   Stmt *Block) {
2437     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2438   }
2439 
2440   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2441     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2442   }
2443 
2444   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2445                                              SourceLocation LParen,
2446                                              SourceLocation RParen,
2447                                              TypeSourceInfo *TSI) {
2448     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2449   }
2450 
2451   /// Build a new predefined expression.
2452   ///
2453   /// By default, performs semantic analysis to build the new expression.
2454   /// Subclasses may override this routine to provide different behavior.
2455   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2456                                    PredefinedExpr::IdentKind IK) {
2457     return getSema().BuildPredefinedExpr(Loc, IK);
2458   }
2459 
2460   /// Build a new expression that references a declaration.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2465                                         LookupResult &R,
2466                                         bool RequiresADL) {
2467     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2468   }
2469 
2470 
2471   /// Build a new expression that references a declaration.
2472   ///
2473   /// By default, performs semantic analysis to build the new expression.
2474   /// Subclasses may override this routine to provide different behavior.
2475   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2476                                 ValueDecl *VD,
2477                                 const DeclarationNameInfo &NameInfo,
2478                                 NamedDecl *Found,
2479                                 TemplateArgumentListInfo *TemplateArgs) {
2480     CXXScopeSpec SS;
2481     SS.Adopt(QualifierLoc);
2482     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2483                                               TemplateArgs);
2484   }
2485 
2486   /// Build a new expression in parentheses.
2487   ///
2488   /// By default, performs semantic analysis to build the new expression.
2489   /// Subclasses may override this routine to provide different behavior.
2490   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2491                                     SourceLocation RParen) {
2492     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2493   }
2494 
2495   /// Build a new pseudo-destructor expression.
2496   ///
2497   /// By default, performs semantic analysis to build the new expression.
2498   /// Subclasses may override this routine to provide different behavior.
2499   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2500                                             SourceLocation OperatorLoc,
2501                                             bool isArrow,
2502                                             CXXScopeSpec &SS,
2503                                             TypeSourceInfo *ScopeType,
2504                                             SourceLocation CCLoc,
2505                                             SourceLocation TildeLoc,
2506                                         PseudoDestructorTypeStorage Destroyed);
2507 
2508   /// Build a new unary operator expression.
2509   ///
2510   /// By default, performs semantic analysis to build the new expression.
2511   /// Subclasses may override this routine to provide different behavior.
2512   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2513                                         UnaryOperatorKind Opc,
2514                                         Expr *SubExpr) {
2515     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2516   }
2517 
2518   /// Build a new builtin offsetof expression.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2523                                  TypeSourceInfo *Type,
2524                                  ArrayRef<Sema::OffsetOfComponent> Components,
2525                                  SourceLocation RParenLoc) {
2526     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2527                                           RParenLoc);
2528   }
2529 
2530   /// Build a new sizeof, alignof or vec_step expression with a
2531   /// type argument.
2532   ///
2533   /// By default, performs semantic analysis to build the new expression.
2534   /// Subclasses may override this routine to provide different behavior.
2535   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2536                                          SourceLocation OpLoc,
2537                                          UnaryExprOrTypeTrait ExprKind,
2538                                          SourceRange R) {
2539     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2540   }
2541 
2542   /// Build a new sizeof, alignof or vec step expression with an
2543   /// expression argument.
2544   ///
2545   /// By default, performs semantic analysis to build the new expression.
2546   /// Subclasses may override this routine to provide different behavior.
2547   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2548                                          UnaryExprOrTypeTrait ExprKind,
2549                                          SourceRange R) {
2550     ExprResult Result
2551       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2552     if (Result.isInvalid())
2553       return ExprError();
2554 
2555     return Result;
2556   }
2557 
2558   /// Build a new array subscript expression.
2559   ///
2560   /// By default, performs semantic analysis to build the new expression.
2561   /// Subclasses may override this routine to provide different behavior.
2562   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2563                                              SourceLocation LBracketLoc,
2564                                              Expr *RHS,
2565                                              SourceLocation RBracketLoc) {
2566     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2567                                              LBracketLoc, RHS,
2568                                              RBracketLoc);
2569   }
2570 
2571   /// Build a new matrix subscript expression.
2572   ///
2573   /// By default, performs semantic analysis to build the new expression.
2574   /// Subclasses may override this routine to provide different behavior.
2575   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2576                                         Expr *ColumnIdx,
2577                                         SourceLocation RBracketLoc) {
2578     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2579                                                       RBracketLoc);
2580   }
2581 
2582   /// Build a new array section expression.
2583   ///
2584   /// By default, performs semantic analysis to build the new expression.
2585   /// Subclasses may override this routine to provide different behavior.
2586   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2587                                         Expr *LowerBound,
2588                                         SourceLocation ColonLocFirst,
2589                                         SourceLocation ColonLocSecond,
2590                                         Expr *Length, Expr *Stride,
2591                                         SourceLocation RBracketLoc) {
2592     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2593                                               ColonLocFirst, ColonLocSecond,
2594                                               Length, Stride, RBracketLoc);
2595   }
2596 
2597   /// Build a new array shaping expression.
2598   ///
2599   /// By default, performs semantic analysis to build the new expression.
2600   /// Subclasses may override this routine to provide different behavior.
2601   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2602                                         SourceLocation RParenLoc,
2603                                         ArrayRef<Expr *> Dims,
2604                                         ArrayRef<SourceRange> BracketsRanges) {
2605     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2606                                               BracketsRanges);
2607   }
2608 
2609   /// Build a new iterator expression.
2610   ///
2611   /// By default, performs semantic analysis to build the new expression.
2612   /// Subclasses may override this routine to provide different behavior.
2613   ExprResult RebuildOMPIteratorExpr(
2614       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2615       ArrayRef<Sema::OMPIteratorData> Data) {
2616     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2617                                           LLoc, RLoc, Data);
2618   }
2619 
2620   /// Build a new call expression.
2621   ///
2622   /// By default, performs semantic analysis to build the new expression.
2623   /// Subclasses may override this routine to provide different behavior.
2624   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2625                                    MultiExprArg Args,
2626                                    SourceLocation RParenLoc,
2627                                    Expr *ExecConfig = nullptr) {
2628     return getSema().ActOnCallExpr(
2629         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2630   }
2631 
2632   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2633                                      MultiExprArg Args,
2634                                      SourceLocation RParenLoc) {
2635     return getSema().ActOnArraySubscriptExpr(
2636         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2637   }
2638 
2639   /// Build a new member access expression.
2640   ///
2641   /// By default, performs semantic analysis to build the new expression.
2642   /// Subclasses may override this routine to provide different behavior.
2643   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2644                                bool isArrow,
2645                                NestedNameSpecifierLoc QualifierLoc,
2646                                SourceLocation TemplateKWLoc,
2647                                const DeclarationNameInfo &MemberNameInfo,
2648                                ValueDecl *Member,
2649                                NamedDecl *FoundDecl,
2650                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2651                                NamedDecl *FirstQualifierInScope) {
2652     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2653                                                                       isArrow);
2654     if (!Member->getDeclName()) {
2655       // We have a reference to an unnamed field.  This is always the
2656       // base of an anonymous struct/union member access, i.e. the
2657       // field is always of record type.
2658       assert(Member->getType()->isRecordType() &&
2659              "unnamed member not of record type?");
2660 
2661       BaseResult =
2662         getSema().PerformObjectMemberConversion(BaseResult.get(),
2663                                                 QualifierLoc.getNestedNameSpecifier(),
2664                                                 FoundDecl, Member);
2665       if (BaseResult.isInvalid())
2666         return ExprError();
2667       Base = BaseResult.get();
2668 
2669       CXXScopeSpec EmptySS;
2670       return getSema().BuildFieldReferenceExpr(
2671           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2672           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2673     }
2674 
2675     CXXScopeSpec SS;
2676     SS.Adopt(QualifierLoc);
2677 
2678     Base = BaseResult.get();
2679     QualType BaseType = Base->getType();
2680 
2681     if (isArrow && !BaseType->isPointerType())
2682       return ExprError();
2683 
2684     // FIXME: this involves duplicating earlier analysis in a lot of
2685     // cases; we should avoid this when possible.
2686     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2687     R.addDecl(FoundDecl);
2688     R.resolveKind();
2689 
2690     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2691                                               SS, TemplateKWLoc,
2692                                               FirstQualifierInScope,
2693                                               R, ExplicitTemplateArgs,
2694                                               /*S*/nullptr);
2695   }
2696 
2697   /// Build a new binary operator expression.
2698   ///
2699   /// By default, performs semantic analysis to build the new expression.
2700   /// Subclasses may override this routine to provide different behavior.
2701   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2702                                          BinaryOperatorKind Opc,
2703                                          Expr *LHS, Expr *RHS) {
2704     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2705   }
2706 
2707   /// Build a new rewritten operator expression.
2708   ///
2709   /// By default, performs semantic analysis to build the new expression.
2710   /// Subclasses may override this routine to provide different behavior.
2711   ExprResult RebuildCXXRewrittenBinaryOperator(
2712       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2713       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2714     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2715                                            RHS, /*RequiresADL*/false);
2716   }
2717 
2718   /// Build a new conditional operator expression.
2719   ///
2720   /// By default, performs semantic analysis to build the new expression.
2721   /// Subclasses may override this routine to provide different behavior.
2722   ExprResult RebuildConditionalOperator(Expr *Cond,
2723                                         SourceLocation QuestionLoc,
2724                                         Expr *LHS,
2725                                         SourceLocation ColonLoc,
2726                                         Expr *RHS) {
2727     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2728                                         LHS, RHS);
2729   }
2730 
2731   /// Build a new C-style cast 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 RebuildCStyleCastExpr(SourceLocation LParenLoc,
2736                                          TypeSourceInfo *TInfo,
2737                                          SourceLocation RParenLoc,
2738                                          Expr *SubExpr) {
2739     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2740                                          SubExpr);
2741   }
2742 
2743   /// Build a new compound literal 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 RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2748                                               TypeSourceInfo *TInfo,
2749                                               SourceLocation RParenLoc,
2750                                               Expr *Init) {
2751     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2752                                               Init);
2753   }
2754 
2755   /// Build a new extended vector element access expression.
2756   ///
2757   /// By default, performs semantic analysis to build the new expression.
2758   /// Subclasses may override this routine to provide different behavior.
2759   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2760                                                SourceLocation OpLoc,
2761                                                SourceLocation AccessorLoc,
2762                                                IdentifierInfo &Accessor) {
2763 
2764     CXXScopeSpec SS;
2765     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2766     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2767                                               OpLoc, /*IsArrow*/ false,
2768                                               SS, SourceLocation(),
2769                                               /*FirstQualifierInScope*/ nullptr,
2770                                               NameInfo,
2771                                               /* TemplateArgs */ nullptr,
2772                                               /*S*/ nullptr);
2773   }
2774 
2775   /// Build a new initializer list expression.
2776   ///
2777   /// By default, performs semantic analysis to build the new expression.
2778   /// Subclasses may override this routine to provide different behavior.
2779   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2780                              MultiExprArg Inits,
2781                              SourceLocation RBraceLoc) {
2782     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2783   }
2784 
2785   /// Build a new designated initializer expression.
2786   ///
2787   /// By default, performs semantic analysis to build the new expression.
2788   /// Subclasses may override this routine to provide different behavior.
2789   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2790                                              MultiExprArg ArrayExprs,
2791                                              SourceLocation EqualOrColonLoc,
2792                                              bool GNUSyntax,
2793                                              Expr *Init) {
2794     ExprResult Result
2795       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2796                                            Init);
2797     if (Result.isInvalid())
2798       return ExprError();
2799 
2800     return Result;
2801   }
2802 
2803   /// Build a new value-initialized expression.
2804   ///
2805   /// By default, builds the implicit value initialization without performing
2806   /// any semantic analysis. Subclasses may override this routine to provide
2807   /// different behavior.
2808   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2809     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2810   }
2811 
2812   /// Build a new \c va_arg expression.
2813   ///
2814   /// By default, performs semantic analysis to build the new expression.
2815   /// Subclasses may override this routine to provide different behavior.
2816   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2817                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2818                                     SourceLocation RParenLoc) {
2819     return getSema().BuildVAArgExpr(BuiltinLoc,
2820                                     SubExpr, TInfo,
2821                                     RParenLoc);
2822   }
2823 
2824   /// Build a new expression list in parentheses.
2825   ///
2826   /// By default, performs semantic analysis to build the new expression.
2827   /// Subclasses may override this routine to provide different behavior.
2828   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2829                                   MultiExprArg SubExprs,
2830                                   SourceLocation RParenLoc) {
2831     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2832   }
2833 
2834   /// Build a new address-of-label expression.
2835   ///
2836   /// By default, performs semantic analysis, using the name of the label
2837   /// rather than attempting to map the label statement itself.
2838   /// Subclasses may override this routine to provide different behavior.
2839   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2840                                   SourceLocation LabelLoc, LabelDecl *Label) {
2841     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2842   }
2843 
2844   /// Build a new GNU statement expression.
2845   ///
2846   /// By default, performs semantic analysis to build the new expression.
2847   /// Subclasses may override this routine to provide different behavior.
2848   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2849                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2850     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2851                                    TemplateDepth);
2852   }
2853 
2854   /// Build a new __builtin_choose_expr 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 RebuildChooseExpr(SourceLocation BuiltinLoc,
2859                                      Expr *Cond, Expr *LHS, Expr *RHS,
2860                                      SourceLocation RParenLoc) {
2861     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2862                                    Cond, LHS, RHS,
2863                                    RParenLoc);
2864   }
2865 
2866   /// Build a new generic selection expression.
2867   ///
2868   /// By default, performs semantic analysis to build the new expression.
2869   /// Subclasses may override this routine to provide different behavior.
2870   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2871                                          SourceLocation DefaultLoc,
2872                                          SourceLocation RParenLoc,
2873                                          Expr *ControllingExpr,
2874                                          ArrayRef<TypeSourceInfo *> Types,
2875                                          ArrayRef<Expr *> Exprs) {
2876     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2877                                                 ControllingExpr, Types, Exprs);
2878   }
2879 
2880   /// Build a new overloaded operator call expression.
2881   ///
2882   /// By default, performs semantic analysis to build the new expression.
2883   /// The semantic analysis provides the behavior of template instantiation,
2884   /// copying with transformations that turn what looks like an overloaded
2885   /// operator call into a use of a builtin operator, performing
2886   /// argument-dependent lookup, etc. Subclasses may override this routine to
2887   /// provide different behavior.
2888   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2889                                               SourceLocation OpLoc,
2890                                               Expr *Callee,
2891                                               Expr *First,
2892                                               Expr *Second);
2893 
2894   /// Build a new C++ "named" cast expression, such as static_cast or
2895   /// reinterpret_cast.
2896   ///
2897   /// By default, this routine dispatches to one of the more-specific routines
2898   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2899   /// Subclasses may override this routine to provide different behavior.
2900   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2901                                            Stmt::StmtClass Class,
2902                                            SourceLocation LAngleLoc,
2903                                            TypeSourceInfo *TInfo,
2904                                            SourceLocation RAngleLoc,
2905                                            SourceLocation LParenLoc,
2906                                            Expr *SubExpr,
2907                                            SourceLocation RParenLoc) {
2908     switch (Class) {
2909     case Stmt::CXXStaticCastExprClass:
2910       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2911                                                    RAngleLoc, LParenLoc,
2912                                                    SubExpr, RParenLoc);
2913 
2914     case Stmt::CXXDynamicCastExprClass:
2915       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2916                                                     RAngleLoc, LParenLoc,
2917                                                     SubExpr, RParenLoc);
2918 
2919     case Stmt::CXXReinterpretCastExprClass:
2920       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2921                                                         RAngleLoc, LParenLoc,
2922                                                         SubExpr,
2923                                                         RParenLoc);
2924 
2925     case Stmt::CXXConstCastExprClass:
2926       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2927                                                    RAngleLoc, LParenLoc,
2928                                                    SubExpr, RParenLoc);
2929 
2930     case Stmt::CXXAddrspaceCastExprClass:
2931       return getDerived().RebuildCXXAddrspaceCastExpr(
2932           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2933 
2934     default:
2935       llvm_unreachable("Invalid C++ named cast");
2936     }
2937   }
2938 
2939   /// Build a new C++ static_cast expression.
2940   ///
2941   /// By default, performs semantic analysis to build the new expression.
2942   /// Subclasses may override this routine to provide different behavior.
2943   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2944                                             SourceLocation LAngleLoc,
2945                                             TypeSourceInfo *TInfo,
2946                                             SourceLocation RAngleLoc,
2947                                             SourceLocation LParenLoc,
2948                                             Expr *SubExpr,
2949                                             SourceLocation RParenLoc) {
2950     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2951                                        TInfo, SubExpr,
2952                                        SourceRange(LAngleLoc, RAngleLoc),
2953                                        SourceRange(LParenLoc, RParenLoc));
2954   }
2955 
2956   /// Build a new C++ dynamic_cast expression.
2957   ///
2958   /// By default, performs semantic analysis to build the new expression.
2959   /// Subclasses may override this routine to provide different behavior.
2960   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2961                                              SourceLocation LAngleLoc,
2962                                              TypeSourceInfo *TInfo,
2963                                              SourceLocation RAngleLoc,
2964                                              SourceLocation LParenLoc,
2965                                              Expr *SubExpr,
2966                                              SourceLocation RParenLoc) {
2967     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2968                                        TInfo, SubExpr,
2969                                        SourceRange(LAngleLoc, RAngleLoc),
2970                                        SourceRange(LParenLoc, RParenLoc));
2971   }
2972 
2973   /// Build a new C++ reinterpret_cast expression.
2974   ///
2975   /// By default, performs semantic analysis to build the new expression.
2976   /// Subclasses may override this routine to provide different behavior.
2977   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2978                                                  SourceLocation LAngleLoc,
2979                                                  TypeSourceInfo *TInfo,
2980                                                  SourceLocation RAngleLoc,
2981                                                  SourceLocation LParenLoc,
2982                                                  Expr *SubExpr,
2983                                                  SourceLocation RParenLoc) {
2984     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2985                                        TInfo, SubExpr,
2986                                        SourceRange(LAngleLoc, RAngleLoc),
2987                                        SourceRange(LParenLoc, RParenLoc));
2988   }
2989 
2990   /// Build a new C++ const_cast expression.
2991   ///
2992   /// By default, performs semantic analysis to build the new expression.
2993   /// Subclasses may override this routine to provide different behavior.
2994   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2995                                            SourceLocation LAngleLoc,
2996                                            TypeSourceInfo *TInfo,
2997                                            SourceLocation RAngleLoc,
2998                                            SourceLocation LParenLoc,
2999                                            Expr *SubExpr,
3000                                            SourceLocation RParenLoc) {
3001     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3002                                        TInfo, SubExpr,
3003                                        SourceRange(LAngleLoc, RAngleLoc),
3004                                        SourceRange(LParenLoc, RParenLoc));
3005   }
3006 
3007   ExprResult
3008   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3009                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3010                               SourceLocation LParenLoc, Expr *SubExpr,
3011                               SourceLocation RParenLoc) {
3012     return getSema().BuildCXXNamedCast(
3013         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3014         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3015   }
3016 
3017   /// Build a new C++ functional-style cast expression.
3018   ///
3019   /// By default, performs semantic analysis to build the new expression.
3020   /// Subclasses may override this routine to provide different behavior.
3021   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3022                                           SourceLocation LParenLoc,
3023                                           Expr *Sub,
3024                                           SourceLocation RParenLoc,
3025                                           bool ListInitialization) {
3026     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3027                                                MultiExprArg(&Sub, 1), RParenLoc,
3028                                                ListInitialization);
3029   }
3030 
3031   /// Build a new C++ __builtin_bit_cast expression.
3032   ///
3033   /// By default, performs semantic analysis to build the new expression.
3034   /// Subclasses may override this routine to provide different behavior.
3035   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3036                                        TypeSourceInfo *TSI, Expr *Sub,
3037                                        SourceLocation RParenLoc) {
3038     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3039   }
3040 
3041   /// Build a new C++ typeid(type) expression.
3042   ///
3043   /// By default, performs semantic analysis to build the new expression.
3044   /// Subclasses may override this routine to provide different behavior.
3045   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3046                                         SourceLocation TypeidLoc,
3047                                         TypeSourceInfo *Operand,
3048                                         SourceLocation RParenLoc) {
3049     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3050                                     RParenLoc);
3051   }
3052 
3053 
3054   /// Build a new C++ typeid(expr) 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 RebuildCXXTypeidExpr(QualType TypeInfoType,
3059                                         SourceLocation TypeidLoc,
3060                                         Expr *Operand,
3061                                         SourceLocation RParenLoc) {
3062     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3063                                     RParenLoc);
3064   }
3065 
3066   /// Build a new C++ __uuidof(type) expression.
3067   ///
3068   /// By default, performs semantic analysis to build the new expression.
3069   /// Subclasses may override this routine to provide different behavior.
3070   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3071                                   TypeSourceInfo *Operand,
3072                                   SourceLocation RParenLoc) {
3073     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3074   }
3075 
3076   /// Build a new C++ __uuidof(expr) expression.
3077   ///
3078   /// By default, performs semantic analysis to build the new expression.
3079   /// Subclasses may override this routine to provide different behavior.
3080   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3081                                   Expr *Operand, SourceLocation RParenLoc) {
3082     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3083   }
3084 
3085   /// Build a new C++ "this" expression.
3086   ///
3087   /// By default, builds a new "this" expression without performing any
3088   /// semantic analysis. Subclasses may override this routine to provide
3089   /// different behavior.
3090   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3091                                 QualType ThisType,
3092                                 bool isImplicit) {
3093     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3094   }
3095 
3096   /// Build a new C++ throw expression.
3097   ///
3098   /// By default, performs semantic analysis to build the new expression.
3099   /// Subclasses may override this routine to provide different behavior.
3100   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3101                                  bool IsThrownVariableInScope) {
3102     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3103   }
3104 
3105   /// Build a new C++ default-argument expression.
3106   ///
3107   /// By default, builds a new default-argument expression, which does not
3108   /// require any semantic analysis. Subclasses may override this routine to
3109   /// provide different behavior.
3110   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3111     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3112                                      getSema().CurContext);
3113   }
3114 
3115   /// Build a new C++11 default-initialization expression.
3116   ///
3117   /// By default, builds a new default field initialization expression, which
3118   /// does not require any semantic analysis. Subclasses may override this
3119   /// routine to provide different behavior.
3120   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3121                                        FieldDecl *Field) {
3122     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3123                                       getSema().CurContext);
3124   }
3125 
3126   /// Build a new C++ zero-initialization expression.
3127   ///
3128   /// By default, performs semantic analysis to build the new expression.
3129   /// Subclasses may override this routine to provide different behavior.
3130   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3131                                            SourceLocation LParenLoc,
3132                                            SourceLocation RParenLoc) {
3133     return getSema().BuildCXXTypeConstructExpr(
3134         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3135   }
3136 
3137   /// Build a new C++ "new" expression.
3138   ///
3139   /// By default, performs semantic analysis to build the new expression.
3140   /// Subclasses may override this routine to provide different behavior.
3141   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3142                                bool UseGlobal,
3143                                SourceLocation PlacementLParen,
3144                                MultiExprArg PlacementArgs,
3145                                SourceLocation PlacementRParen,
3146                                SourceRange TypeIdParens,
3147                                QualType AllocatedType,
3148                                TypeSourceInfo *AllocatedTypeInfo,
3149                                Optional<Expr *> ArraySize,
3150                                SourceRange DirectInitRange,
3151                                Expr *Initializer) {
3152     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3153                                  PlacementLParen,
3154                                  PlacementArgs,
3155                                  PlacementRParen,
3156                                  TypeIdParens,
3157                                  AllocatedType,
3158                                  AllocatedTypeInfo,
3159                                  ArraySize,
3160                                  DirectInitRange,
3161                                  Initializer);
3162   }
3163 
3164   /// Build a new C++ "delete" 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 RebuildCXXDeleteExpr(SourceLocation StartLoc,
3169                                         bool IsGlobalDelete,
3170                                         bool IsArrayForm,
3171                                         Expr *Operand) {
3172     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3173                                     Operand);
3174   }
3175 
3176   /// Build a new type trait expression.
3177   ///
3178   /// By default, performs semantic analysis to build the new expression.
3179   /// Subclasses may override this routine to provide different behavior.
3180   ExprResult RebuildTypeTrait(TypeTrait Trait,
3181                               SourceLocation StartLoc,
3182                               ArrayRef<TypeSourceInfo *> Args,
3183                               SourceLocation RParenLoc) {
3184     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3185   }
3186 
3187   /// Build a new array type 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 RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3192                                    SourceLocation StartLoc,
3193                                    TypeSourceInfo *TSInfo,
3194                                    Expr *DimExpr,
3195                                    SourceLocation RParenLoc) {
3196     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3197   }
3198 
3199   /// Build a new expression trait 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 RebuildExpressionTrait(ExpressionTrait Trait,
3204                                    SourceLocation StartLoc,
3205                                    Expr *Queried,
3206                                    SourceLocation RParenLoc) {
3207     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3208   }
3209 
3210   /// Build a new (previously unresolved) declaration reference
3211   /// expression.
3212   ///
3213   /// By default, performs semantic analysis to build the new expression.
3214   /// Subclasses may override this routine to provide different behavior.
3215   ExprResult RebuildDependentScopeDeclRefExpr(
3216                                           NestedNameSpecifierLoc QualifierLoc,
3217                                           SourceLocation TemplateKWLoc,
3218                                        const DeclarationNameInfo &NameInfo,
3219                               const TemplateArgumentListInfo *TemplateArgs,
3220                                           bool IsAddressOfOperand,
3221                                           TypeSourceInfo **RecoveryTSI) {
3222     CXXScopeSpec SS;
3223     SS.Adopt(QualifierLoc);
3224 
3225     if (TemplateArgs || TemplateKWLoc.isValid())
3226       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3227                                                     TemplateArgs);
3228 
3229     return getSema().BuildQualifiedDeclarationNameExpr(
3230         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3231   }
3232 
3233   /// Build a new template-id expression.
3234   ///
3235   /// By default, performs semantic analysis to build the new expression.
3236   /// Subclasses may override this routine to provide different behavior.
3237   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3238                                    SourceLocation TemplateKWLoc,
3239                                    LookupResult &R,
3240                                    bool RequiresADL,
3241                               const TemplateArgumentListInfo *TemplateArgs) {
3242     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3243                                          TemplateArgs);
3244   }
3245 
3246   /// Build a new object-construction expression.
3247   ///
3248   /// By default, performs semantic analysis to build the new expression.
3249   /// Subclasses may override this routine to provide different behavior.
3250   ExprResult RebuildCXXConstructExpr(QualType T,
3251                                      SourceLocation Loc,
3252                                      CXXConstructorDecl *Constructor,
3253                                      bool IsElidable,
3254                                      MultiExprArg Args,
3255                                      bool HadMultipleCandidates,
3256                                      bool ListInitialization,
3257                                      bool StdInitListInitialization,
3258                                      bool RequiresZeroInit,
3259                              CXXConstructExpr::ConstructionKind ConstructKind,
3260                                      SourceRange ParenRange) {
3261     // Reconstruct the constructor we originally found, which might be
3262     // different if this is a call to an inherited constructor.
3263     CXXConstructorDecl *FoundCtor = Constructor;
3264     if (Constructor->isInheritingConstructor())
3265       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3266 
3267     SmallVector<Expr *, 8> ConvertedArgs;
3268     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3269                                           ConvertedArgs))
3270       return ExprError();
3271 
3272     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3273                                            IsElidable,
3274                                            ConvertedArgs,
3275                                            HadMultipleCandidates,
3276                                            ListInitialization,
3277                                            StdInitListInitialization,
3278                                            RequiresZeroInit, ConstructKind,
3279                                            ParenRange);
3280   }
3281 
3282   /// Build a new implicit construction via inherited constructor
3283   /// expression.
3284   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3285                                              CXXConstructorDecl *Constructor,
3286                                              bool ConstructsVBase,
3287                                              bool InheritedFromVBase) {
3288     return new (getSema().Context) CXXInheritedCtorInitExpr(
3289         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3290   }
3291 
3292   /// Build a new object-construction expression.
3293   ///
3294   /// By default, performs semantic analysis to build the new expression.
3295   /// Subclasses may override this routine to provide different behavior.
3296   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3297                                            SourceLocation LParenOrBraceLoc,
3298                                            MultiExprArg Args,
3299                                            SourceLocation RParenOrBraceLoc,
3300                                            bool ListInitialization) {
3301     return getSema().BuildCXXTypeConstructExpr(
3302         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3303   }
3304 
3305   /// Build a new object-construction expression.
3306   ///
3307   /// By default, performs semantic analysis to build the new expression.
3308   /// Subclasses may override this routine to provide different behavior.
3309   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3310                                                SourceLocation LParenLoc,
3311                                                MultiExprArg Args,
3312                                                SourceLocation RParenLoc,
3313                                                bool ListInitialization) {
3314     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3315                                                RParenLoc, ListInitialization);
3316   }
3317 
3318   /// Build a new member reference expression.
3319   ///
3320   /// By default, performs semantic analysis to build the new expression.
3321   /// Subclasses may override this routine to provide different behavior.
3322   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3323                                                 QualType BaseType,
3324                                                 bool IsArrow,
3325                                                 SourceLocation OperatorLoc,
3326                                           NestedNameSpecifierLoc QualifierLoc,
3327                                                 SourceLocation TemplateKWLoc,
3328                                             NamedDecl *FirstQualifierInScope,
3329                                    const DeclarationNameInfo &MemberNameInfo,
3330                               const TemplateArgumentListInfo *TemplateArgs) {
3331     CXXScopeSpec SS;
3332     SS.Adopt(QualifierLoc);
3333 
3334     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3335                                             OperatorLoc, IsArrow,
3336                                             SS, TemplateKWLoc,
3337                                             FirstQualifierInScope,
3338                                             MemberNameInfo,
3339                                             TemplateArgs, /*S*/nullptr);
3340   }
3341 
3342   /// Build a new member reference expression.
3343   ///
3344   /// By default, performs semantic analysis to build the new expression.
3345   /// Subclasses may override this routine to provide different behavior.
3346   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3347                                          SourceLocation OperatorLoc,
3348                                          bool IsArrow,
3349                                          NestedNameSpecifierLoc QualifierLoc,
3350                                          SourceLocation TemplateKWLoc,
3351                                          NamedDecl *FirstQualifierInScope,
3352                                          LookupResult &R,
3353                                 const TemplateArgumentListInfo *TemplateArgs) {
3354     CXXScopeSpec SS;
3355     SS.Adopt(QualifierLoc);
3356 
3357     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3358                                             OperatorLoc, IsArrow,
3359                                             SS, TemplateKWLoc,
3360                                             FirstQualifierInScope,
3361                                             R, TemplateArgs, /*S*/nullptr);
3362   }
3363 
3364   /// Build a new noexcept expression.
3365   ///
3366   /// By default, performs semantic analysis to build the new expression.
3367   /// Subclasses may override this routine to provide different behavior.
3368   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3369     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3370   }
3371 
3372   /// Build a new expression to compute the length of a parameter pack.
3373   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3374                                    NamedDecl *Pack,
3375                                    SourceLocation PackLoc,
3376                                    SourceLocation RParenLoc,
3377                                    Optional<unsigned> Length,
3378                                    ArrayRef<TemplateArgument> PartialArgs) {
3379     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3380                                   RParenLoc, Length, PartialArgs);
3381   }
3382 
3383   /// Build a new expression representing a call to a source location
3384   ///  builtin.
3385   ///
3386   /// By default, performs semantic analysis to build the new expression.
3387   /// Subclasses may override this routine to provide different behavior.
3388   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3389                                   SourceLocation BuiltinLoc,
3390                                   SourceLocation RPLoc,
3391                                   DeclContext *ParentContext) {
3392     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3393   }
3394 
3395   /// Build a new Objective-C boxed expression.
3396   ///
3397   /// By default, performs semantic analysis to build the new expression.
3398   /// Subclasses may override this routine to provide different behavior.
3399   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3400       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3401       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3402       TemplateArgumentListInfo *TALI) {
3403     CXXScopeSpec SS;
3404     SS.Adopt(NNS);
3405     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3406                                                          ConceptNameInfo,
3407                                                          FoundDecl,
3408                                                          NamedConcept, TALI);
3409     if (Result.isInvalid())
3410       return ExprError();
3411     return Result;
3412   }
3413 
3414   /// \brief Build a new requires expression.
3415   ///
3416   /// By default, performs semantic analysis to build the new expression.
3417   /// Subclasses may override this routine to provide different behavior.
3418   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3419                                  RequiresExprBodyDecl *Body,
3420                                  ArrayRef<ParmVarDecl *> LocalParameters,
3421                                  ArrayRef<concepts::Requirement *> Requirements,
3422                                  SourceLocation ClosingBraceLoc) {
3423     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3424                                 LocalParameters, Requirements, ClosingBraceLoc);
3425   }
3426 
3427   concepts::TypeRequirement *
3428   RebuildTypeRequirement(
3429       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3430     return SemaRef.BuildTypeRequirement(SubstDiag);
3431   }
3432 
3433   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3434     return SemaRef.BuildTypeRequirement(T);
3435   }
3436 
3437   concepts::ExprRequirement *
3438   RebuildExprRequirement(
3439       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3440       SourceLocation NoexceptLoc,
3441       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3442     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3443                                         std::move(Ret));
3444   }
3445 
3446   concepts::ExprRequirement *
3447   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3448                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3449     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3450                                         std::move(Ret));
3451   }
3452 
3453   concepts::NestedRequirement *
3454   RebuildNestedRequirement(
3455       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3456     return SemaRef.BuildNestedRequirement(SubstDiag);
3457   }
3458 
3459   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3460     return SemaRef.BuildNestedRequirement(Constraint);
3461   }
3462 
3463   /// \brief Build a new Objective-C boxed expression.
3464   ///
3465   /// By default, performs semantic analysis to build the new expression.
3466   /// Subclasses may override this routine to provide different behavior.
3467   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3468     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3469   }
3470 
3471   /// Build a new Objective-C array literal.
3472   ///
3473   /// By default, performs semantic analysis to build the new expression.
3474   /// Subclasses may override this routine to provide different behavior.
3475   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3476                                      Expr **Elements, unsigned NumElements) {
3477     return getSema().BuildObjCArrayLiteral(Range,
3478                                            MultiExprArg(Elements, NumElements));
3479   }
3480 
3481   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3482                                          Expr *Base, Expr *Key,
3483                                          ObjCMethodDecl *getterMethod,
3484                                          ObjCMethodDecl *setterMethod) {
3485     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3486                                                    getterMethod, setterMethod);
3487   }
3488 
3489   /// Build a new Objective-C dictionary literal.
3490   ///
3491   /// By default, performs semantic analysis to build the new expression.
3492   /// Subclasses may override this routine to provide different behavior.
3493   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3494                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3495     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3496   }
3497 
3498   /// Build a new Objective-C \@encode expression.
3499   ///
3500   /// By default, performs semantic analysis to build the new expression.
3501   /// Subclasses may override this routine to provide different behavior.
3502   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3503                                          TypeSourceInfo *EncodeTypeInfo,
3504                                          SourceLocation RParenLoc) {
3505     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3506   }
3507 
3508   /// Build a new Objective-C class message.
3509   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3510                                           Selector Sel,
3511                                           ArrayRef<SourceLocation> SelectorLocs,
3512                                           ObjCMethodDecl *Method,
3513                                           SourceLocation LBracLoc,
3514                                           MultiExprArg Args,
3515                                           SourceLocation RBracLoc) {
3516     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3517                                      ReceiverTypeInfo->getType(),
3518                                      /*SuperLoc=*/SourceLocation(),
3519                                      Sel, Method, LBracLoc, SelectorLocs,
3520                                      RBracLoc, Args);
3521   }
3522 
3523   /// Build a new Objective-C instance message.
3524   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3525                                           Selector Sel,
3526                                           ArrayRef<SourceLocation> SelectorLocs,
3527                                           ObjCMethodDecl *Method,
3528                                           SourceLocation LBracLoc,
3529                                           MultiExprArg Args,
3530                                           SourceLocation RBracLoc) {
3531     return SemaRef.BuildInstanceMessage(Receiver,
3532                                         Receiver->getType(),
3533                                         /*SuperLoc=*/SourceLocation(),
3534                                         Sel, Method, LBracLoc, SelectorLocs,
3535                                         RBracLoc, Args);
3536   }
3537 
3538   /// Build a new Objective-C instance/class message to 'super'.
3539   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3540                                     Selector Sel,
3541                                     ArrayRef<SourceLocation> SelectorLocs,
3542                                     QualType SuperType,
3543                                     ObjCMethodDecl *Method,
3544                                     SourceLocation LBracLoc,
3545                                     MultiExprArg Args,
3546                                     SourceLocation RBracLoc) {
3547     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3548                                           SuperType,
3549                                           SuperLoc,
3550                                           Sel, Method, LBracLoc, SelectorLocs,
3551                                           RBracLoc, Args)
3552                                       : SemaRef.BuildClassMessage(nullptr,
3553                                           SuperType,
3554                                           SuperLoc,
3555                                           Sel, Method, LBracLoc, SelectorLocs,
3556                                           RBracLoc, Args);
3557 
3558 
3559   }
3560 
3561   /// Build a new Objective-C ivar reference expression.
3562   ///
3563   /// By default, performs semantic analysis to build the new expression.
3564   /// Subclasses may override this routine to provide different behavior.
3565   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3566                                           SourceLocation IvarLoc,
3567                                           bool IsArrow, bool IsFreeIvar) {
3568     CXXScopeSpec SS;
3569     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3570     ExprResult Result = getSema().BuildMemberReferenceExpr(
3571         BaseArg, BaseArg->getType(),
3572         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3573         /*FirstQualifierInScope=*/nullptr, NameInfo,
3574         /*TemplateArgs=*/nullptr,
3575         /*S=*/nullptr);
3576     if (IsFreeIvar && Result.isUsable())
3577       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3578     return Result;
3579   }
3580 
3581   /// Build a new Objective-C property reference expression.
3582   ///
3583   /// By default, performs semantic analysis to build the new expression.
3584   /// Subclasses may override this routine to provide different behavior.
3585   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3586                                         ObjCPropertyDecl *Property,
3587                                         SourceLocation PropertyLoc) {
3588     CXXScopeSpec SS;
3589     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3590     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3591                                               /*FIXME:*/PropertyLoc,
3592                                               /*IsArrow=*/false,
3593                                               SS, SourceLocation(),
3594                                               /*FirstQualifierInScope=*/nullptr,
3595                                               NameInfo,
3596                                               /*TemplateArgs=*/nullptr,
3597                                               /*S=*/nullptr);
3598   }
3599 
3600   /// Build a new Objective-C property reference expression.
3601   ///
3602   /// By default, performs semantic analysis to build the new expression.
3603   /// Subclasses may override this routine to provide different behavior.
3604   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3605                                         ObjCMethodDecl *Getter,
3606                                         ObjCMethodDecl *Setter,
3607                                         SourceLocation PropertyLoc) {
3608     // Since these expressions can only be value-dependent, we do not
3609     // need to perform semantic analysis again.
3610     return Owned(
3611       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3612                                                   VK_LValue, OK_ObjCProperty,
3613                                                   PropertyLoc, Base));
3614   }
3615 
3616   /// Build a new Objective-C "isa" expression.
3617   ///
3618   /// By default, performs semantic analysis to build the new expression.
3619   /// Subclasses may override this routine to provide different behavior.
3620   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3621                                 SourceLocation OpLoc, bool IsArrow) {
3622     CXXScopeSpec SS;
3623     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3624     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3625                                               OpLoc, IsArrow,
3626                                               SS, SourceLocation(),
3627                                               /*FirstQualifierInScope=*/nullptr,
3628                                               NameInfo,
3629                                               /*TemplateArgs=*/nullptr,
3630                                               /*S=*/nullptr);
3631   }
3632 
3633   /// Build a new shuffle vector expression.
3634   ///
3635   /// By default, performs semantic analysis to build the new expression.
3636   /// Subclasses may override this routine to provide different behavior.
3637   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3638                                       MultiExprArg SubExprs,
3639                                       SourceLocation RParenLoc) {
3640     // Find the declaration for __builtin_shufflevector
3641     const IdentifierInfo &Name
3642       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3643     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3644     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3645     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3646 
3647     // Build a reference to the __builtin_shufflevector builtin
3648     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3649     Expr *Callee = new (SemaRef.Context)
3650         DeclRefExpr(SemaRef.Context, Builtin, false,
3651                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3652     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3653     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3654                                        CK_BuiltinFnToFnPtr).get();
3655 
3656     // Build the CallExpr
3657     ExprResult TheCall = CallExpr::Create(
3658         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3659         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3660         FPOptionsOverride());
3661 
3662     // Type-check the __builtin_shufflevector expression.
3663     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3664   }
3665 
3666   /// Build a new convert vector expression.
3667   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3668                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3669                                       SourceLocation RParenLoc) {
3670     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3671                                          BuiltinLoc, RParenLoc);
3672   }
3673 
3674   /// Build a new template argument pack expansion.
3675   ///
3676   /// By default, performs semantic analysis to build a new pack expansion
3677   /// for a template argument. Subclasses may override this routine to provide
3678   /// different behavior.
3679   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3680                                            SourceLocation EllipsisLoc,
3681                                            Optional<unsigned> NumExpansions) {
3682     switch (Pattern.getArgument().getKind()) {
3683     case TemplateArgument::Expression: {
3684       ExprResult Result
3685         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3686                                        EllipsisLoc, NumExpansions);
3687       if (Result.isInvalid())
3688         return TemplateArgumentLoc();
3689 
3690       return TemplateArgumentLoc(Result.get(), Result.get());
3691     }
3692 
3693     case TemplateArgument::Template:
3694       return TemplateArgumentLoc(
3695           SemaRef.Context,
3696           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3697                            NumExpansions),
3698           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3699           EllipsisLoc);
3700 
3701     case TemplateArgument::Null:
3702     case TemplateArgument::Integral:
3703     case TemplateArgument::Declaration:
3704     case TemplateArgument::Pack:
3705     case TemplateArgument::TemplateExpansion:
3706     case TemplateArgument::NullPtr:
3707       llvm_unreachable("Pack expansion pattern has no parameter packs");
3708 
3709     case TemplateArgument::Type:
3710       if (TypeSourceInfo *Expansion
3711             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3712                                            EllipsisLoc,
3713                                            NumExpansions))
3714         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3715                                    Expansion);
3716       break;
3717     }
3718 
3719     return TemplateArgumentLoc();
3720   }
3721 
3722   /// Build a new expression pack expansion.
3723   ///
3724   /// By default, performs semantic analysis to build a new pack expansion
3725   /// for an expression. Subclasses may override this routine to provide
3726   /// different behavior.
3727   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3728                                   Optional<unsigned> NumExpansions) {
3729     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3730   }
3731 
3732   /// Build a new C++1z fold-expression.
3733   ///
3734   /// By default, performs semantic analysis in order to build a new fold
3735   /// expression.
3736   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3737                                 SourceLocation LParenLoc, Expr *LHS,
3738                                 BinaryOperatorKind Operator,
3739                                 SourceLocation EllipsisLoc, Expr *RHS,
3740                                 SourceLocation RParenLoc,
3741                                 Optional<unsigned> NumExpansions) {
3742     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3743                                       EllipsisLoc, RHS, RParenLoc,
3744                                       NumExpansions);
3745   }
3746 
3747   /// Build an empty C++1z fold-expression with the given operator.
3748   ///
3749   /// By default, produces the fallback value for the fold-expression, or
3750   /// produce an error if there is no fallback value.
3751   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3752                                      BinaryOperatorKind Operator) {
3753     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3754   }
3755 
3756   /// Build a new atomic operation expression.
3757   ///
3758   /// By default, performs semantic analysis to build the new expression.
3759   /// Subclasses may override this routine to provide different behavior.
3760   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3761                                AtomicExpr::AtomicOp Op,
3762                                SourceLocation RParenLoc) {
3763     // Use this for all of the locations, since we don't know the difference
3764     // between the call and the expr at this point.
3765     SourceRange Range{BuiltinLoc, RParenLoc};
3766     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3767                                      Sema::AtomicArgumentOrder::AST);
3768   }
3769 
3770   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3771                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3772     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3773   }
3774 
3775 private:
3776   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3777                                      QualType ObjectType,
3778                                      NamedDecl *FirstQualifierInScope,
3779                                      CXXScopeSpec &SS);
3780 
3781   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3782                                              QualType ObjectType,
3783                                              NamedDecl *FirstQualifierInScope,
3784                                              CXXScopeSpec &SS);
3785 
3786   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3787                                             NamedDecl *FirstQualifierInScope,
3788                                             CXXScopeSpec &SS);
3789 
3790   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3791                                       DependentNameTypeLoc TL,
3792                                       bool DeducibleTSTContext);
3793 };
3794 
3795 template <typename Derived>
3796 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3797   if (!S)
3798     return S;
3799 
3800   switch (S->getStmtClass()) {
3801   case Stmt::NoStmtClass: break;
3802 
3803   // Transform individual statement nodes
3804   // Pass SDK into statements that can produce a value
3805 #define STMT(Node, Parent)                                              \
3806   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3807 #define VALUESTMT(Node, Parent)                                         \
3808   case Stmt::Node##Class:                                               \
3809     return getDerived().Transform##Node(cast<Node>(S), SDK);
3810 #define ABSTRACT_STMT(Node)
3811 #define EXPR(Node, Parent)
3812 #include "clang/AST/StmtNodes.inc"
3813 
3814   // Transform expressions by calling TransformExpr.
3815 #define STMT(Node, Parent)
3816 #define ABSTRACT_STMT(Stmt)
3817 #define EXPR(Node, Parent) case Stmt::Node##Class:
3818 #include "clang/AST/StmtNodes.inc"
3819     {
3820       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3821 
3822       if (SDK == SDK_StmtExprResult)
3823         E = getSema().ActOnStmtExprResult(E);
3824       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3825     }
3826   }
3827 
3828   return S;
3829 }
3830 
3831 template<typename Derived>
3832 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3833   if (!S)
3834     return S;
3835 
3836   switch (S->getClauseKind()) {
3837   default: break;
3838   // Transform individual clause nodes
3839 #define GEN_CLANG_CLAUSE_CLASS
3840 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3841   case Enum:                                                                   \
3842     return getDerived().Transform##Class(cast<Class>(S));
3843 #include "llvm/Frontend/OpenMP/OMP.inc"
3844   }
3845 
3846   return S;
3847 }
3848 
3849 
3850 template<typename Derived>
3851 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3852   if (!E)
3853     return E;
3854 
3855   switch (E->getStmtClass()) {
3856     case Stmt::NoStmtClass: break;
3857 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3858 #define ABSTRACT_STMT(Stmt)
3859 #define EXPR(Node, Parent)                                              \
3860     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3861 #include "clang/AST/StmtNodes.inc"
3862   }
3863 
3864   return E;
3865 }
3866 
3867 template<typename Derived>
3868 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3869                                                         bool NotCopyInit) {
3870   // Initializers are instantiated like expressions, except that various outer
3871   // layers are stripped.
3872   if (!Init)
3873     return Init;
3874 
3875   if (auto *FE = dyn_cast<FullExpr>(Init))
3876     Init = FE->getSubExpr();
3877 
3878   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
3879     OpaqueValueExpr *OVE = AIL->getCommonExpr();
3880     Init = OVE->getSourceExpr();
3881   }
3882 
3883   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3884     Init = MTE->getSubExpr();
3885 
3886   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3887     Init = Binder->getSubExpr();
3888 
3889   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3890     Init = ICE->getSubExprAsWritten();
3891 
3892   if (CXXStdInitializerListExpr *ILE =
3893           dyn_cast<CXXStdInitializerListExpr>(Init))
3894     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3895 
3896   // If this is copy-initialization, we only need to reconstruct
3897   // InitListExprs. Other forms of copy-initialization will be a no-op if
3898   // the initializer is already the right type.
3899   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3900   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3901     return getDerived().TransformExpr(Init);
3902 
3903   // Revert value-initialization back to empty parens.
3904   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3905     SourceRange Parens = VIE->getSourceRange();
3906     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3907                                              Parens.getEnd());
3908   }
3909 
3910   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3911   if (isa<ImplicitValueInitExpr>(Init))
3912     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3913                                              SourceLocation());
3914 
3915   // Revert initialization by constructor back to a parenthesized or braced list
3916   // of expressions. Any other form of initializer can just be reused directly.
3917   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3918     return getDerived().TransformExpr(Init);
3919 
3920   // If the initialization implicitly converted an initializer list to a
3921   // std::initializer_list object, unwrap the std::initializer_list too.
3922   if (Construct && Construct->isStdInitListInitialization())
3923     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3924 
3925   // Enter a list-init context if this was list initialization.
3926   EnterExpressionEvaluationContext Context(
3927       getSema(), EnterExpressionEvaluationContext::InitList,
3928       Construct->isListInitialization());
3929 
3930   SmallVector<Expr*, 8> NewArgs;
3931   bool ArgChanged = false;
3932   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3933                                   /*IsCall*/true, NewArgs, &ArgChanged))
3934     return ExprError();
3935 
3936   // If this was list initialization, revert to syntactic list form.
3937   if (Construct->isListInitialization())
3938     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3939                                         Construct->getEndLoc());
3940 
3941   // Build a ParenListExpr to represent anything else.
3942   SourceRange Parens = Construct->getParenOrBraceRange();
3943   if (Parens.isInvalid()) {
3944     // This was a variable declaration's initialization for which no initializer
3945     // was specified.
3946     assert(NewArgs.empty() &&
3947            "no parens or braces but have direct init with arguments?");
3948     return ExprEmpty();
3949   }
3950   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3951                                            Parens.getEnd());
3952 }
3953 
3954 template<typename Derived>
3955 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3956                                             unsigned NumInputs,
3957                                             bool IsCall,
3958                                       SmallVectorImpl<Expr *> &Outputs,
3959                                             bool *ArgChanged) {
3960   for (unsigned I = 0; I != NumInputs; ++I) {
3961     // If requested, drop call arguments that need to be dropped.
3962     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3963       if (ArgChanged)
3964         *ArgChanged = true;
3965 
3966       break;
3967     }
3968 
3969     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3970       Expr *Pattern = Expansion->getPattern();
3971 
3972       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3973       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3974       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3975 
3976       // Determine whether the set of unexpanded parameter packs can and should
3977       // be expanded.
3978       bool Expand = true;
3979       bool RetainExpansion = false;
3980       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3981       Optional<unsigned> NumExpansions = OrigNumExpansions;
3982       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3983                                                Pattern->getSourceRange(),
3984                                                Unexpanded,
3985                                                Expand, RetainExpansion,
3986                                                NumExpansions))
3987         return true;
3988 
3989       if (!Expand) {
3990         // The transform has determined that we should perform a simple
3991         // transformation on the pack expansion, producing another pack
3992         // expansion.
3993         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3994         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3995         if (OutPattern.isInvalid())
3996           return true;
3997 
3998         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3999                                                 Expansion->getEllipsisLoc(),
4000                                                            NumExpansions);
4001         if (Out.isInvalid())
4002           return true;
4003 
4004         if (ArgChanged)
4005           *ArgChanged = true;
4006         Outputs.push_back(Out.get());
4007         continue;
4008       }
4009 
4010       // Record right away that the argument was changed.  This needs
4011       // to happen even if the array expands to nothing.
4012       if (ArgChanged) *ArgChanged = true;
4013 
4014       // The transform has determined that we should perform an elementwise
4015       // expansion of the pattern. Do so.
4016       for (unsigned I = 0; I != *NumExpansions; ++I) {
4017         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4018         ExprResult Out = getDerived().TransformExpr(Pattern);
4019         if (Out.isInvalid())
4020           return true;
4021 
4022         if (Out.get()->containsUnexpandedParameterPack()) {
4023           Out = getDerived().RebuildPackExpansion(
4024               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4025           if (Out.isInvalid())
4026             return true;
4027         }
4028 
4029         Outputs.push_back(Out.get());
4030       }
4031 
4032       // If we're supposed to retain a pack expansion, do so by temporarily
4033       // forgetting the partially-substituted parameter pack.
4034       if (RetainExpansion) {
4035         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4036 
4037         ExprResult Out = getDerived().TransformExpr(Pattern);
4038         if (Out.isInvalid())
4039           return true;
4040 
4041         Out = getDerived().RebuildPackExpansion(
4042             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4043         if (Out.isInvalid())
4044           return true;
4045 
4046         Outputs.push_back(Out.get());
4047       }
4048 
4049       continue;
4050     }
4051 
4052     ExprResult Result =
4053       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4054              : getDerived().TransformExpr(Inputs[I]);
4055     if (Result.isInvalid())
4056       return true;
4057 
4058     if (Result.get() != Inputs[I] && ArgChanged)
4059       *ArgChanged = true;
4060 
4061     Outputs.push_back(Result.get());
4062   }
4063 
4064   return false;
4065 }
4066 
4067 template <typename Derived>
4068 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4069     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4070   if (Var) {
4071     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4072         getDerived().TransformDefinition(Var->getLocation(), Var));
4073 
4074     if (!ConditionVar)
4075       return Sema::ConditionError();
4076 
4077     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4078   }
4079 
4080   if (Expr) {
4081     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4082 
4083     if (CondExpr.isInvalid())
4084       return Sema::ConditionError();
4085 
4086     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4087                                     /*MissingOK=*/true);
4088   }
4089 
4090   return Sema::ConditionResult();
4091 }
4092 
4093 template <typename Derived>
4094 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4095     NestedNameSpecifierLoc NNS, QualType ObjectType,
4096     NamedDecl *FirstQualifierInScope) {
4097   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4098   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4099        Qualifier = Qualifier.getPrefix())
4100     Qualifiers.push_back(Qualifier);
4101 
4102   CXXScopeSpec SS;
4103   while (!Qualifiers.empty()) {
4104     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4105     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4106 
4107     switch (QNNS->getKind()) {
4108     case NestedNameSpecifier::Identifier: {
4109       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4110                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4111                                       ObjectType);
4112       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4113                                               SS, FirstQualifierInScope, false))
4114         return NestedNameSpecifierLoc();
4115       break;
4116     }
4117 
4118     case NestedNameSpecifier::Namespace: {
4119       NamespaceDecl *NS =
4120           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4121               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4122       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4123       break;
4124     }
4125 
4126     case NestedNameSpecifier::NamespaceAlias: {
4127       NamespaceAliasDecl *Alias =
4128           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4129               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4130       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4131                 Q.getLocalEndLoc());
4132       break;
4133     }
4134 
4135     case NestedNameSpecifier::Global:
4136       // There is no meaningful transformation that one could perform on the
4137       // global scope.
4138       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4139       break;
4140 
4141     case NestedNameSpecifier::Super: {
4142       CXXRecordDecl *RD =
4143           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4144               SourceLocation(), QNNS->getAsRecordDecl()));
4145       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4146       break;
4147     }
4148 
4149     case NestedNameSpecifier::TypeSpecWithTemplate:
4150     case NestedNameSpecifier::TypeSpec: {
4151       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4152                                               FirstQualifierInScope, SS);
4153 
4154       if (!TL)
4155         return NestedNameSpecifierLoc();
4156 
4157       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4158           (SemaRef.getLangOpts().CPlusPlus11 &&
4159            TL.getType()->isEnumeralType())) {
4160         assert(!TL.getType().hasLocalQualifiers() &&
4161                "Can't get cv-qualifiers here");
4162         if (TL.getType()->isEnumeralType())
4163           SemaRef.Diag(TL.getBeginLoc(),
4164                        diag::warn_cxx98_compat_enum_nested_name_spec);
4165         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4166                   Q.getLocalEndLoc());
4167         break;
4168       }
4169       // If the nested-name-specifier is an invalid type def, don't emit an
4170       // error because a previous error should have already been emitted.
4171       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4172       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4173         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4174             << TL.getType() << SS.getRange();
4175       }
4176       return NestedNameSpecifierLoc();
4177     }
4178     }
4179 
4180     // The qualifier-in-scope and object type only apply to the leftmost entity.
4181     FirstQualifierInScope = nullptr;
4182     ObjectType = QualType();
4183   }
4184 
4185   // Don't rebuild the nested-name-specifier if we don't have to.
4186   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4187       !getDerived().AlwaysRebuild())
4188     return NNS;
4189 
4190   // If we can re-use the source-location data from the original
4191   // nested-name-specifier, do so.
4192   if (SS.location_size() == NNS.getDataLength() &&
4193       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4194     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4195 
4196   // Allocate new nested-name-specifier location information.
4197   return SS.getWithLocInContext(SemaRef.Context);
4198 }
4199 
4200 template<typename Derived>
4201 DeclarationNameInfo
4202 TreeTransform<Derived>
4203 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4204   DeclarationName Name = NameInfo.getName();
4205   if (!Name)
4206     return DeclarationNameInfo();
4207 
4208   switch (Name.getNameKind()) {
4209   case DeclarationName::Identifier:
4210   case DeclarationName::ObjCZeroArgSelector:
4211   case DeclarationName::ObjCOneArgSelector:
4212   case DeclarationName::ObjCMultiArgSelector:
4213   case DeclarationName::CXXOperatorName:
4214   case DeclarationName::CXXLiteralOperatorName:
4215   case DeclarationName::CXXUsingDirective:
4216     return NameInfo;
4217 
4218   case DeclarationName::CXXDeductionGuideName: {
4219     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4220     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4221         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4222     if (!NewTemplate)
4223       return DeclarationNameInfo();
4224 
4225     DeclarationNameInfo NewNameInfo(NameInfo);
4226     NewNameInfo.setName(
4227         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4228     return NewNameInfo;
4229   }
4230 
4231   case DeclarationName::CXXConstructorName:
4232   case DeclarationName::CXXDestructorName:
4233   case DeclarationName::CXXConversionFunctionName: {
4234     TypeSourceInfo *NewTInfo;
4235     CanQualType NewCanTy;
4236     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4237       NewTInfo = getDerived().TransformType(OldTInfo);
4238       if (!NewTInfo)
4239         return DeclarationNameInfo();
4240       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4241     }
4242     else {
4243       NewTInfo = nullptr;
4244       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4245       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4246       if (NewT.isNull())
4247         return DeclarationNameInfo();
4248       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4249     }
4250 
4251     DeclarationName NewName
4252       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4253                                                            NewCanTy);
4254     DeclarationNameInfo NewNameInfo(NameInfo);
4255     NewNameInfo.setName(NewName);
4256     NewNameInfo.setNamedTypeInfo(NewTInfo);
4257     return NewNameInfo;
4258   }
4259   }
4260 
4261   llvm_unreachable("Unknown name kind.");
4262 }
4263 
4264 template<typename Derived>
4265 TemplateName
4266 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4267                                               TemplateName Name,
4268                                               SourceLocation NameLoc,
4269                                               QualType ObjectType,
4270                                               NamedDecl *FirstQualifierInScope,
4271                                               bool AllowInjectedClassName) {
4272   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4273     TemplateDecl *Template = QTN->getTemplateDecl();
4274     assert(Template && "qualified template name must refer to a template");
4275 
4276     TemplateDecl *TransTemplate
4277       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4278                                                               Template));
4279     if (!TransTemplate)
4280       return TemplateName();
4281 
4282     if (!getDerived().AlwaysRebuild() &&
4283         SS.getScopeRep() == QTN->getQualifier() &&
4284         TransTemplate == Template)
4285       return Name;
4286 
4287     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4288                                             TransTemplate);
4289   }
4290 
4291   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4292     if (SS.getScopeRep()) {
4293       // These apply to the scope specifier, not the template.
4294       ObjectType = QualType();
4295       FirstQualifierInScope = nullptr;
4296     }
4297 
4298     if (!getDerived().AlwaysRebuild() &&
4299         SS.getScopeRep() == DTN->getQualifier() &&
4300         ObjectType.isNull())
4301       return Name;
4302 
4303     // FIXME: Preserve the location of the "template" keyword.
4304     SourceLocation TemplateKWLoc = NameLoc;
4305 
4306     if (DTN->isIdentifier()) {
4307       return getDerived().RebuildTemplateName(SS,
4308                                               TemplateKWLoc,
4309                                               *DTN->getIdentifier(),
4310                                               NameLoc,
4311                                               ObjectType,
4312                                               FirstQualifierInScope,
4313                                               AllowInjectedClassName);
4314     }
4315 
4316     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4317                                             DTN->getOperator(), NameLoc,
4318                                             ObjectType, AllowInjectedClassName);
4319   }
4320 
4321   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4322     TemplateDecl *TransTemplate
4323       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4324                                                               Template));
4325     if (!TransTemplate)
4326       return TemplateName();
4327 
4328     if (!getDerived().AlwaysRebuild() &&
4329         TransTemplate == Template)
4330       return Name;
4331 
4332     return TemplateName(TransTemplate);
4333   }
4334 
4335   if (SubstTemplateTemplateParmPackStorage *SubstPack
4336       = Name.getAsSubstTemplateTemplateParmPack()) {
4337     TemplateTemplateParmDecl *TransParam
4338     = cast_or_null<TemplateTemplateParmDecl>(
4339             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4340     if (!TransParam)
4341       return TemplateName();
4342 
4343     if (!getDerived().AlwaysRebuild() &&
4344         TransParam == SubstPack->getParameterPack())
4345       return Name;
4346 
4347     return getDerived().RebuildTemplateName(TransParam,
4348                                             SubstPack->getArgumentPack());
4349   }
4350 
4351   // These should be getting filtered out before they reach the AST.
4352   llvm_unreachable("overloaded function decl survived to here");
4353 }
4354 
4355 template<typename Derived>
4356 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4357                                          const TemplateArgument &Arg,
4358                                          TemplateArgumentLoc &Output) {
4359   Output = getSema().getTrivialTemplateArgumentLoc(
4360       Arg, QualType(), getDerived().getBaseLocation());
4361 }
4362 
4363 template <typename Derived>
4364 bool TreeTransform<Derived>::TransformTemplateArgument(
4365     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4366     bool Uneval) {
4367   const TemplateArgument &Arg = Input.getArgument();
4368   switch (Arg.getKind()) {
4369   case TemplateArgument::Null:
4370   case TemplateArgument::Pack:
4371     llvm_unreachable("Unexpected TemplateArgument");
4372 
4373   case TemplateArgument::Integral:
4374   case TemplateArgument::NullPtr:
4375   case TemplateArgument::Declaration: {
4376     // Transform a resolved template argument straight to a resolved template
4377     // argument. We get here when substituting into an already-substituted
4378     // template type argument during concept satisfaction checking.
4379     QualType T = Arg.getNonTypeTemplateArgumentType();
4380     QualType NewT = getDerived().TransformType(T);
4381     if (NewT.isNull())
4382       return true;
4383 
4384     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4385                        ? Arg.getAsDecl()
4386                        : nullptr;
4387     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4388                               getDerived().getBaseLocation(), D))
4389                         : nullptr;
4390     if (D && !NewD)
4391       return true;
4392 
4393     if (NewT == T && D == NewD)
4394       Output = Input;
4395     else if (Arg.getKind() == TemplateArgument::Integral)
4396       Output = TemplateArgumentLoc(
4397           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4398           TemplateArgumentLocInfo());
4399     else if (Arg.getKind() == TemplateArgument::NullPtr)
4400       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4401                                    TemplateArgumentLocInfo());
4402     else
4403       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4404                                    TemplateArgumentLocInfo());
4405 
4406     return false;
4407   }
4408 
4409   case TemplateArgument::Type: {
4410     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4411     if (!DI)
4412       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4413 
4414     DI = getDerived().TransformType(DI);
4415     if (!DI)
4416       return true;
4417 
4418     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4419     return false;
4420   }
4421 
4422   case TemplateArgument::Template: {
4423     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4424     if (QualifierLoc) {
4425       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4426       if (!QualifierLoc)
4427         return true;
4428     }
4429 
4430     CXXScopeSpec SS;
4431     SS.Adopt(QualifierLoc);
4432     TemplateName Template = getDerived().TransformTemplateName(
4433         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4434     if (Template.isNull())
4435       return true;
4436 
4437     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4438                                  QualifierLoc, Input.getTemplateNameLoc());
4439     return false;
4440   }
4441 
4442   case TemplateArgument::TemplateExpansion:
4443     llvm_unreachable("Caller should expand pack expansions");
4444 
4445   case TemplateArgument::Expression: {
4446     // Template argument expressions are constant expressions.
4447     EnterExpressionEvaluationContext Unevaluated(
4448         getSema(),
4449         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4450                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4451         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4452         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4453 
4454     Expr *InputExpr = Input.getSourceExpression();
4455     if (!InputExpr)
4456       InputExpr = Input.getArgument().getAsExpr();
4457 
4458     ExprResult E = getDerived().TransformExpr(InputExpr);
4459     E = SemaRef.ActOnConstantExpression(E);
4460     if (E.isInvalid())
4461       return true;
4462     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4463     return false;
4464   }
4465   }
4466 
4467   // Work around bogus GCC warning
4468   return true;
4469 }
4470 
4471 /// Iterator adaptor that invents template argument location information
4472 /// for each of the template arguments in its underlying iterator.
4473 template<typename Derived, typename InputIterator>
4474 class TemplateArgumentLocInventIterator {
4475   TreeTransform<Derived> &Self;
4476   InputIterator Iter;
4477 
4478 public:
4479   typedef TemplateArgumentLoc value_type;
4480   typedef TemplateArgumentLoc reference;
4481   typedef typename std::iterator_traits<InputIterator>::difference_type
4482     difference_type;
4483   typedef std::input_iterator_tag iterator_category;
4484 
4485   class pointer {
4486     TemplateArgumentLoc Arg;
4487 
4488   public:
4489     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4490 
4491     const TemplateArgumentLoc *operator->() const { return &Arg; }
4492   };
4493 
4494   TemplateArgumentLocInventIterator() { }
4495 
4496   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4497                                              InputIterator Iter)
4498     : Self(Self), Iter(Iter) { }
4499 
4500   TemplateArgumentLocInventIterator &operator++() {
4501     ++Iter;
4502     return *this;
4503   }
4504 
4505   TemplateArgumentLocInventIterator operator++(int) {
4506     TemplateArgumentLocInventIterator Old(*this);
4507     ++(*this);
4508     return Old;
4509   }
4510 
4511   reference operator*() const {
4512     TemplateArgumentLoc Result;
4513     Self.InventTemplateArgumentLoc(*Iter, Result);
4514     return Result;
4515   }
4516 
4517   pointer operator->() const { return pointer(**this); }
4518 
4519   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4520                          const TemplateArgumentLocInventIterator &Y) {
4521     return X.Iter == Y.Iter;
4522   }
4523 
4524   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4525                          const TemplateArgumentLocInventIterator &Y) {
4526     return X.Iter != Y.Iter;
4527   }
4528 };
4529 
4530 template<typename Derived>
4531 template<typename InputIterator>
4532 bool TreeTransform<Derived>::TransformTemplateArguments(
4533     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4534     bool Uneval) {
4535   for (; First != Last; ++First) {
4536     TemplateArgumentLoc Out;
4537     TemplateArgumentLoc In = *First;
4538 
4539     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4540       // Unpack argument packs, which we translate them into separate
4541       // arguments.
4542       // FIXME: We could do much better if we could guarantee that the
4543       // TemplateArgumentLocInfo for the pack expansion would be usable for
4544       // all of the template arguments in the argument pack.
4545       typedef TemplateArgumentLocInventIterator<Derived,
4546                                                 TemplateArgument::pack_iterator>
4547         PackLocIterator;
4548       if (TransformTemplateArguments(PackLocIterator(*this,
4549                                                  In.getArgument().pack_begin()),
4550                                      PackLocIterator(*this,
4551                                                    In.getArgument().pack_end()),
4552                                      Outputs, Uneval))
4553         return true;
4554 
4555       continue;
4556     }
4557 
4558     if (In.getArgument().isPackExpansion()) {
4559       // We have a pack expansion, for which we will be substituting into
4560       // the pattern.
4561       SourceLocation Ellipsis;
4562       Optional<unsigned> OrigNumExpansions;
4563       TemplateArgumentLoc Pattern
4564         = getSema().getTemplateArgumentPackExpansionPattern(
4565               In, Ellipsis, OrigNumExpansions);
4566 
4567       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4568       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4569       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4570 
4571       // Determine whether the set of unexpanded parameter packs can and should
4572       // be expanded.
4573       bool Expand = true;
4574       bool RetainExpansion = false;
4575       Optional<unsigned> NumExpansions = OrigNumExpansions;
4576       if (getDerived().TryExpandParameterPacks(Ellipsis,
4577                                                Pattern.getSourceRange(),
4578                                                Unexpanded,
4579                                                Expand,
4580                                                RetainExpansion,
4581                                                NumExpansions))
4582         return true;
4583 
4584       if (!Expand) {
4585         // The transform has determined that we should perform a simple
4586         // transformation on the pack expansion, producing another pack
4587         // expansion.
4588         TemplateArgumentLoc OutPattern;
4589         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4590         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4591           return true;
4592 
4593         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4594                                                 NumExpansions);
4595         if (Out.getArgument().isNull())
4596           return true;
4597 
4598         Outputs.addArgument(Out);
4599         continue;
4600       }
4601 
4602       // The transform has determined that we should perform an elementwise
4603       // expansion of the pattern. Do so.
4604       for (unsigned I = 0; I != *NumExpansions; ++I) {
4605         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4606 
4607         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4608           return true;
4609 
4610         if (Out.getArgument().containsUnexpandedParameterPack()) {
4611           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4612                                                   OrigNumExpansions);
4613           if (Out.getArgument().isNull())
4614             return true;
4615         }
4616 
4617         Outputs.addArgument(Out);
4618       }
4619 
4620       // If we're supposed to retain a pack expansion, do so by temporarily
4621       // forgetting the partially-substituted parameter pack.
4622       if (RetainExpansion) {
4623         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4624 
4625         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4626           return true;
4627 
4628         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4629                                                 OrigNumExpansions);
4630         if (Out.getArgument().isNull())
4631           return true;
4632 
4633         Outputs.addArgument(Out);
4634       }
4635 
4636       continue;
4637     }
4638 
4639     // The simple case:
4640     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4641       return true;
4642 
4643     Outputs.addArgument(Out);
4644   }
4645 
4646   return false;
4647 
4648 }
4649 
4650 //===----------------------------------------------------------------------===//
4651 // Type transformation
4652 //===----------------------------------------------------------------------===//
4653 
4654 template<typename Derived>
4655 QualType TreeTransform<Derived>::TransformType(QualType T) {
4656   if (getDerived().AlreadyTransformed(T))
4657     return T;
4658 
4659   // Temporary workaround.  All of these transformations should
4660   // eventually turn into transformations on TypeLocs.
4661   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4662                                                 getDerived().getBaseLocation());
4663 
4664   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4665 
4666   if (!NewDI)
4667     return QualType();
4668 
4669   return NewDI->getType();
4670 }
4671 
4672 template<typename Derived>
4673 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4674   // Refine the base location to the type's location.
4675   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4676                        getDerived().getBaseEntity());
4677   if (getDerived().AlreadyTransformed(DI->getType()))
4678     return DI;
4679 
4680   TypeLocBuilder TLB;
4681 
4682   TypeLoc TL = DI->getTypeLoc();
4683   TLB.reserve(TL.getFullDataSize());
4684 
4685   QualType Result = getDerived().TransformType(TLB, TL);
4686   if (Result.isNull())
4687     return nullptr;
4688 
4689   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4690 }
4691 
4692 template<typename Derived>
4693 QualType
4694 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4695   switch (T.getTypeLocClass()) {
4696 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4697 #define TYPELOC(CLASS, PARENT)                                                 \
4698   case TypeLoc::CLASS:                                                         \
4699     return getDerived().Transform##CLASS##Type(TLB,                            \
4700                                                T.castAs<CLASS##TypeLoc>());
4701 #include "clang/AST/TypeLocNodes.def"
4702   }
4703 
4704   llvm_unreachable("unhandled type loc!");
4705 }
4706 
4707 template<typename Derived>
4708 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4709   if (!isa<DependentNameType>(T))
4710     return TransformType(T);
4711 
4712   if (getDerived().AlreadyTransformed(T))
4713     return T;
4714   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4715                                                 getDerived().getBaseLocation());
4716   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4717   return NewDI ? NewDI->getType() : QualType();
4718 }
4719 
4720 template<typename Derived>
4721 TypeSourceInfo *
4722 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4723   if (!isa<DependentNameType>(DI->getType()))
4724     return TransformType(DI);
4725 
4726   // Refine the base location to the type's location.
4727   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4728                        getDerived().getBaseEntity());
4729   if (getDerived().AlreadyTransformed(DI->getType()))
4730     return DI;
4731 
4732   TypeLocBuilder TLB;
4733 
4734   TypeLoc TL = DI->getTypeLoc();
4735   TLB.reserve(TL.getFullDataSize());
4736 
4737   auto QTL = TL.getAs<QualifiedTypeLoc>();
4738   if (QTL)
4739     TL = QTL.getUnqualifiedLoc();
4740 
4741   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4742 
4743   QualType Result = getDerived().TransformDependentNameType(
4744       TLB, DNTL, /*DeducedTSTContext*/true);
4745   if (Result.isNull())
4746     return nullptr;
4747 
4748   if (QTL) {
4749     Result = getDerived().RebuildQualifiedType(Result, QTL);
4750     if (Result.isNull())
4751       return nullptr;
4752     TLB.TypeWasModifiedSafely(Result);
4753   }
4754 
4755   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4756 }
4757 
4758 template<typename Derived>
4759 QualType
4760 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4761                                                QualifiedTypeLoc T) {
4762   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4763   if (Result.isNull())
4764     return QualType();
4765 
4766   Result = getDerived().RebuildQualifiedType(Result, T);
4767 
4768   if (Result.isNull())
4769     return QualType();
4770 
4771   // RebuildQualifiedType might have updated the type, but not in a way
4772   // that invalidates the TypeLoc. (There's no location information for
4773   // qualifiers.)
4774   TLB.TypeWasModifiedSafely(Result);
4775 
4776   return Result;
4777 }
4778 
4779 template <typename Derived>
4780 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4781                                                       QualifiedTypeLoc TL) {
4782 
4783   SourceLocation Loc = TL.getBeginLoc();
4784   Qualifiers Quals = TL.getType().getLocalQualifiers();
4785 
4786   if ((T.getAddressSpace() != LangAS::Default &&
4787        Quals.getAddressSpace() != LangAS::Default) &&
4788       T.getAddressSpace() != Quals.getAddressSpace()) {
4789     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4790         << TL.getType() << T;
4791     return QualType();
4792   }
4793 
4794   // C++ [dcl.fct]p7:
4795   //   [When] adding cv-qualifications on top of the function type [...] the
4796   //   cv-qualifiers are ignored.
4797   if (T->isFunctionType()) {
4798     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4799                                                      Quals.getAddressSpace());
4800     return T;
4801   }
4802 
4803   // C++ [dcl.ref]p1:
4804   //   when the cv-qualifiers are introduced through the use of a typedef-name
4805   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4806   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4807   // applied to a reference type.
4808   if (T->isReferenceType()) {
4809     // The only qualifier that applies to a reference type is restrict.
4810     if (!Quals.hasRestrict())
4811       return T;
4812     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4813   }
4814 
4815   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4816   // resulting type.
4817   if (Quals.hasObjCLifetime()) {
4818     if (!T->isObjCLifetimeType() && !T->isDependentType())
4819       Quals.removeObjCLifetime();
4820     else if (T.getObjCLifetime()) {
4821       // Objective-C ARC:
4822       //   A lifetime qualifier applied to a substituted template parameter
4823       //   overrides the lifetime qualifier from the template argument.
4824       const AutoType *AutoTy;
4825       if (const SubstTemplateTypeParmType *SubstTypeParam
4826                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4827         QualType Replacement = SubstTypeParam->getReplacementType();
4828         Qualifiers Qs = Replacement.getQualifiers();
4829         Qs.removeObjCLifetime();
4830         Replacement = SemaRef.Context.getQualifiedType(
4831             Replacement.getUnqualifiedType(), Qs);
4832         T = SemaRef.Context.getSubstTemplateTypeParmType(
4833             SubstTypeParam->getReplacedParameter(), Replacement);
4834       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4835         // 'auto' types behave the same way as template parameters.
4836         QualType Deduced = AutoTy->getDeducedType();
4837         Qualifiers Qs = Deduced.getQualifiers();
4838         Qs.removeObjCLifetime();
4839         Deduced =
4840             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4841         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4842                                         AutoTy->isDependentType(),
4843                                         /*isPack=*/false,
4844                                         AutoTy->getTypeConstraintConcept(),
4845                                         AutoTy->getTypeConstraintArguments());
4846       } else {
4847         // Otherwise, complain about the addition of a qualifier to an
4848         // already-qualified type.
4849         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4850         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4851         Quals.removeObjCLifetime();
4852       }
4853     }
4854   }
4855 
4856   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4857 }
4858 
4859 template<typename Derived>
4860 TypeLoc
4861 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4862                                                    QualType ObjectType,
4863                                                    NamedDecl *UnqualLookup,
4864                                                    CXXScopeSpec &SS) {
4865   if (getDerived().AlreadyTransformed(TL.getType()))
4866     return TL;
4867 
4868   TypeSourceInfo *TSI =
4869       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4870   if (TSI)
4871     return TSI->getTypeLoc();
4872   return TypeLoc();
4873 }
4874 
4875 template<typename Derived>
4876 TypeSourceInfo *
4877 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4878                                                    QualType ObjectType,
4879                                                    NamedDecl *UnqualLookup,
4880                                                    CXXScopeSpec &SS) {
4881   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4882     return TSInfo;
4883 
4884   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4885                                    UnqualLookup, SS);
4886 }
4887 
4888 template <typename Derived>
4889 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4890     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4891     CXXScopeSpec &SS) {
4892   QualType T = TL.getType();
4893   assert(!getDerived().AlreadyTransformed(T));
4894 
4895   TypeLocBuilder TLB;
4896   QualType Result;
4897 
4898   if (isa<TemplateSpecializationType>(T)) {
4899     TemplateSpecializationTypeLoc SpecTL =
4900         TL.castAs<TemplateSpecializationTypeLoc>();
4901 
4902     TemplateName Template = getDerived().TransformTemplateName(
4903         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4904         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4905     if (Template.isNull())
4906       return nullptr;
4907 
4908     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4909                                                               Template);
4910   } else if (isa<DependentTemplateSpecializationType>(T)) {
4911     DependentTemplateSpecializationTypeLoc SpecTL =
4912         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4913 
4914     TemplateName Template
4915       = getDerived().RebuildTemplateName(SS,
4916                                          SpecTL.getTemplateKeywordLoc(),
4917                                          *SpecTL.getTypePtr()->getIdentifier(),
4918                                          SpecTL.getTemplateNameLoc(),
4919                                          ObjectType, UnqualLookup,
4920                                          /*AllowInjectedClassName*/true);
4921     if (Template.isNull())
4922       return nullptr;
4923 
4924     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4925                                                                        SpecTL,
4926                                                                        Template,
4927                                                                        SS);
4928   } else {
4929     // Nothing special needs to be done for these.
4930     Result = getDerived().TransformType(TLB, TL);
4931   }
4932 
4933   if (Result.isNull())
4934     return nullptr;
4935 
4936   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4937 }
4938 
4939 template <class TyLoc> static inline
4940 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4941   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4942   NewT.setNameLoc(T.getNameLoc());
4943   return T.getType();
4944 }
4945 
4946 template<typename Derived>
4947 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4948                                                       BuiltinTypeLoc T) {
4949   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4950   NewT.setBuiltinLoc(T.getBuiltinLoc());
4951   if (T.needsExtraLocalData())
4952     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4953   return T.getType();
4954 }
4955 
4956 template<typename Derived>
4957 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4958                                                       ComplexTypeLoc T) {
4959   // FIXME: recurse?
4960   return TransformTypeSpecType(TLB, T);
4961 }
4962 
4963 template <typename Derived>
4964 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4965                                                        AdjustedTypeLoc TL) {
4966   // Adjustments applied during transformation are handled elsewhere.
4967   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4968 }
4969 
4970 template<typename Derived>
4971 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4972                                                       DecayedTypeLoc TL) {
4973   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4974   if (OriginalType.isNull())
4975     return QualType();
4976 
4977   QualType Result = TL.getType();
4978   if (getDerived().AlwaysRebuild() ||
4979       OriginalType != TL.getOriginalLoc().getType())
4980     Result = SemaRef.Context.getDecayedType(OriginalType);
4981   TLB.push<DecayedTypeLoc>(Result);
4982   // Nothing to set for DecayedTypeLoc.
4983   return Result;
4984 }
4985 
4986 template<typename Derived>
4987 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4988                                                       PointerTypeLoc TL) {
4989   QualType PointeeType
4990     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4991   if (PointeeType.isNull())
4992     return QualType();
4993 
4994   QualType Result = TL.getType();
4995   if (PointeeType->getAs<ObjCObjectType>()) {
4996     // A dependent pointer type 'T *' has is being transformed such
4997     // that an Objective-C class type is being replaced for 'T'. The
4998     // resulting pointer type is an ObjCObjectPointerType, not a
4999     // PointerType.
5000     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5001 
5002     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5003     NewT.setStarLoc(TL.getStarLoc());
5004     return Result;
5005   }
5006 
5007   if (getDerived().AlwaysRebuild() ||
5008       PointeeType != TL.getPointeeLoc().getType()) {
5009     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5010     if (Result.isNull())
5011       return QualType();
5012   }
5013 
5014   // Objective-C ARC can add lifetime qualifiers to the type that we're
5015   // pointing to.
5016   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5017 
5018   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5019   NewT.setSigilLoc(TL.getSigilLoc());
5020   return Result;
5021 }
5022 
5023 template<typename Derived>
5024 QualType
5025 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5026                                                   BlockPointerTypeLoc TL) {
5027   QualType PointeeType
5028     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5029   if (PointeeType.isNull())
5030     return QualType();
5031 
5032   QualType Result = TL.getType();
5033   if (getDerived().AlwaysRebuild() ||
5034       PointeeType != TL.getPointeeLoc().getType()) {
5035     Result = getDerived().RebuildBlockPointerType(PointeeType,
5036                                                   TL.getSigilLoc());
5037     if (Result.isNull())
5038       return QualType();
5039   }
5040 
5041   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5042   NewT.setSigilLoc(TL.getSigilLoc());
5043   return Result;
5044 }
5045 
5046 /// Transforms a reference type.  Note that somewhat paradoxically we
5047 /// don't care whether the type itself is an l-value type or an r-value
5048 /// type;  we only care if the type was *written* as an l-value type
5049 /// or an r-value type.
5050 template<typename Derived>
5051 QualType
5052 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5053                                                ReferenceTypeLoc TL) {
5054   const ReferenceType *T = TL.getTypePtr();
5055 
5056   // Note that this works with the pointee-as-written.
5057   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5058   if (PointeeType.isNull())
5059     return QualType();
5060 
5061   QualType Result = TL.getType();
5062   if (getDerived().AlwaysRebuild() ||
5063       PointeeType != T->getPointeeTypeAsWritten()) {
5064     Result = getDerived().RebuildReferenceType(PointeeType,
5065                                                T->isSpelledAsLValue(),
5066                                                TL.getSigilLoc());
5067     if (Result.isNull())
5068       return QualType();
5069   }
5070 
5071   // Objective-C ARC can add lifetime qualifiers to the type that we're
5072   // referring to.
5073   TLB.TypeWasModifiedSafely(
5074       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5075 
5076   // r-value references can be rebuilt as l-value references.
5077   ReferenceTypeLoc NewTL;
5078   if (isa<LValueReferenceType>(Result))
5079     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5080   else
5081     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5082   NewTL.setSigilLoc(TL.getSigilLoc());
5083 
5084   return Result;
5085 }
5086 
5087 template<typename Derived>
5088 QualType
5089 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5090                                                  LValueReferenceTypeLoc TL) {
5091   return TransformReferenceType(TLB, TL);
5092 }
5093 
5094 template<typename Derived>
5095 QualType
5096 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5097                                                  RValueReferenceTypeLoc TL) {
5098   return TransformReferenceType(TLB, TL);
5099 }
5100 
5101 template<typename Derived>
5102 QualType
5103 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5104                                                    MemberPointerTypeLoc TL) {
5105   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5106   if (PointeeType.isNull())
5107     return QualType();
5108 
5109   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5110   TypeSourceInfo *NewClsTInfo = nullptr;
5111   if (OldClsTInfo) {
5112     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5113     if (!NewClsTInfo)
5114       return QualType();
5115   }
5116 
5117   const MemberPointerType *T = TL.getTypePtr();
5118   QualType OldClsType = QualType(T->getClass(), 0);
5119   QualType NewClsType;
5120   if (NewClsTInfo)
5121     NewClsType = NewClsTInfo->getType();
5122   else {
5123     NewClsType = getDerived().TransformType(OldClsType);
5124     if (NewClsType.isNull())
5125       return QualType();
5126   }
5127 
5128   QualType Result = TL.getType();
5129   if (getDerived().AlwaysRebuild() ||
5130       PointeeType != T->getPointeeType() ||
5131       NewClsType != OldClsType) {
5132     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5133                                                    TL.getStarLoc());
5134     if (Result.isNull())
5135       return QualType();
5136   }
5137 
5138   // If we had to adjust the pointee type when building a member pointer, make
5139   // sure to push TypeLoc info for it.
5140   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5141   if (MPT && PointeeType != MPT->getPointeeType()) {
5142     assert(isa<AdjustedType>(MPT->getPointeeType()));
5143     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5144   }
5145 
5146   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5147   NewTL.setSigilLoc(TL.getSigilLoc());
5148   NewTL.setClassTInfo(NewClsTInfo);
5149 
5150   return Result;
5151 }
5152 
5153 template<typename Derived>
5154 QualType
5155 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5156                                                    ConstantArrayTypeLoc TL) {
5157   const ConstantArrayType *T = TL.getTypePtr();
5158   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5159   if (ElementType.isNull())
5160     return QualType();
5161 
5162   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5163   Expr *OldSize = TL.getSizeExpr();
5164   if (!OldSize)
5165     OldSize = const_cast<Expr*>(T->getSizeExpr());
5166   Expr *NewSize = nullptr;
5167   if (OldSize) {
5168     EnterExpressionEvaluationContext Unevaluated(
5169         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5170     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5171     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5172   }
5173 
5174   QualType Result = TL.getType();
5175   if (getDerived().AlwaysRebuild() ||
5176       ElementType != T->getElementType() ||
5177       (T->getSizeExpr() && NewSize != OldSize)) {
5178     Result = getDerived().RebuildConstantArrayType(ElementType,
5179                                                    T->getSizeModifier(),
5180                                                    T->getSize(), NewSize,
5181                                              T->getIndexTypeCVRQualifiers(),
5182                                                    TL.getBracketsRange());
5183     if (Result.isNull())
5184       return QualType();
5185   }
5186 
5187   // We might have either a ConstantArrayType or a VariableArrayType now:
5188   // a ConstantArrayType is allowed to have an element type which is a
5189   // VariableArrayType if the type is dependent.  Fortunately, all array
5190   // types have the same location layout.
5191   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5192   NewTL.setLBracketLoc(TL.getLBracketLoc());
5193   NewTL.setRBracketLoc(TL.getRBracketLoc());
5194   NewTL.setSizeExpr(NewSize);
5195 
5196   return Result;
5197 }
5198 
5199 template<typename Derived>
5200 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5201                                               TypeLocBuilder &TLB,
5202                                               IncompleteArrayTypeLoc TL) {
5203   const IncompleteArrayType *T = TL.getTypePtr();
5204   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5205   if (ElementType.isNull())
5206     return QualType();
5207 
5208   QualType Result = TL.getType();
5209   if (getDerived().AlwaysRebuild() ||
5210       ElementType != T->getElementType()) {
5211     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5212                                                      T->getSizeModifier(),
5213                                            T->getIndexTypeCVRQualifiers(),
5214                                                      TL.getBracketsRange());
5215     if (Result.isNull())
5216       return QualType();
5217   }
5218 
5219   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5220   NewTL.setLBracketLoc(TL.getLBracketLoc());
5221   NewTL.setRBracketLoc(TL.getRBracketLoc());
5222   NewTL.setSizeExpr(nullptr);
5223 
5224   return Result;
5225 }
5226 
5227 template<typename Derived>
5228 QualType
5229 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5230                                                    VariableArrayTypeLoc TL) {
5231   const VariableArrayType *T = TL.getTypePtr();
5232   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5233   if (ElementType.isNull())
5234     return QualType();
5235 
5236   ExprResult SizeResult;
5237   {
5238     EnterExpressionEvaluationContext Context(
5239         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5240     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5241   }
5242   if (SizeResult.isInvalid())
5243     return QualType();
5244   SizeResult =
5245       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5246   if (SizeResult.isInvalid())
5247     return QualType();
5248 
5249   Expr *Size = SizeResult.get();
5250 
5251   QualType Result = TL.getType();
5252   if (getDerived().AlwaysRebuild() ||
5253       ElementType != T->getElementType() ||
5254       Size != T->getSizeExpr()) {
5255     Result = getDerived().RebuildVariableArrayType(ElementType,
5256                                                    T->getSizeModifier(),
5257                                                    Size,
5258                                              T->getIndexTypeCVRQualifiers(),
5259                                                    TL.getBracketsRange());
5260     if (Result.isNull())
5261       return QualType();
5262   }
5263 
5264   // We might have constant size array now, but fortunately it has the same
5265   // location layout.
5266   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5267   NewTL.setLBracketLoc(TL.getLBracketLoc());
5268   NewTL.setRBracketLoc(TL.getRBracketLoc());
5269   NewTL.setSizeExpr(Size);
5270 
5271   return Result;
5272 }
5273 
5274 template<typename Derived>
5275 QualType
5276 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5277                                              DependentSizedArrayTypeLoc TL) {
5278   const DependentSizedArrayType *T = TL.getTypePtr();
5279   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5280   if (ElementType.isNull())
5281     return QualType();
5282 
5283   // Array bounds are constant expressions.
5284   EnterExpressionEvaluationContext Unevaluated(
5285       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5286 
5287   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5288   Expr *origSize = TL.getSizeExpr();
5289   if (!origSize) origSize = T->getSizeExpr();
5290 
5291   ExprResult sizeResult
5292     = getDerived().TransformExpr(origSize);
5293   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5294   if (sizeResult.isInvalid())
5295     return QualType();
5296 
5297   Expr *size = sizeResult.get();
5298 
5299   QualType Result = TL.getType();
5300   if (getDerived().AlwaysRebuild() ||
5301       ElementType != T->getElementType() ||
5302       size != origSize) {
5303     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5304                                                          T->getSizeModifier(),
5305                                                          size,
5306                                                 T->getIndexTypeCVRQualifiers(),
5307                                                         TL.getBracketsRange());
5308     if (Result.isNull())
5309       return QualType();
5310   }
5311 
5312   // We might have any sort of array type now, but fortunately they
5313   // all have the same location layout.
5314   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5315   NewTL.setLBracketLoc(TL.getLBracketLoc());
5316   NewTL.setRBracketLoc(TL.getRBracketLoc());
5317   NewTL.setSizeExpr(size);
5318 
5319   return Result;
5320 }
5321 
5322 template <typename Derived>
5323 QualType TreeTransform<Derived>::TransformDependentVectorType(
5324     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5325   const DependentVectorType *T = TL.getTypePtr();
5326   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5327   if (ElementType.isNull())
5328     return QualType();
5329 
5330   EnterExpressionEvaluationContext Unevaluated(
5331       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5332 
5333   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5334   Size = SemaRef.ActOnConstantExpression(Size);
5335   if (Size.isInvalid())
5336     return QualType();
5337 
5338   QualType Result = TL.getType();
5339   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5340       Size.get() != T->getSizeExpr()) {
5341     Result = getDerived().RebuildDependentVectorType(
5342         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5343     if (Result.isNull())
5344       return QualType();
5345   }
5346 
5347   // Result might be dependent or not.
5348   if (isa<DependentVectorType>(Result)) {
5349     DependentVectorTypeLoc NewTL =
5350         TLB.push<DependentVectorTypeLoc>(Result);
5351     NewTL.setNameLoc(TL.getNameLoc());
5352   } else {
5353     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5354     NewTL.setNameLoc(TL.getNameLoc());
5355   }
5356 
5357   return Result;
5358 }
5359 
5360 template<typename Derived>
5361 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5362                                       TypeLocBuilder &TLB,
5363                                       DependentSizedExtVectorTypeLoc TL) {
5364   const DependentSizedExtVectorType *T = TL.getTypePtr();
5365 
5366   // FIXME: ext vector locs should be nested
5367   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5368   if (ElementType.isNull())
5369     return QualType();
5370 
5371   // Vector sizes are constant expressions.
5372   EnterExpressionEvaluationContext Unevaluated(
5373       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5374 
5375   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5376   Size = SemaRef.ActOnConstantExpression(Size);
5377   if (Size.isInvalid())
5378     return QualType();
5379 
5380   QualType Result = TL.getType();
5381   if (getDerived().AlwaysRebuild() ||
5382       ElementType != T->getElementType() ||
5383       Size.get() != T->getSizeExpr()) {
5384     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5385                                                              Size.get(),
5386                                                          T->getAttributeLoc());
5387     if (Result.isNull())
5388       return QualType();
5389   }
5390 
5391   // Result might be dependent or not.
5392   if (isa<DependentSizedExtVectorType>(Result)) {
5393     DependentSizedExtVectorTypeLoc NewTL
5394       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5395     NewTL.setNameLoc(TL.getNameLoc());
5396   } else {
5397     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5398     NewTL.setNameLoc(TL.getNameLoc());
5399   }
5400 
5401   return Result;
5402 }
5403 
5404 template <typename Derived>
5405 QualType
5406 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5407                                                     ConstantMatrixTypeLoc TL) {
5408   const ConstantMatrixType *T = TL.getTypePtr();
5409   QualType ElementType = getDerived().TransformType(T->getElementType());
5410   if (ElementType.isNull())
5411     return QualType();
5412 
5413   QualType Result = TL.getType();
5414   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5415     Result = getDerived().RebuildConstantMatrixType(
5416         ElementType, T->getNumRows(), T->getNumColumns());
5417     if (Result.isNull())
5418       return QualType();
5419   }
5420 
5421   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5422   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5423   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5424   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5425   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5426 
5427   return Result;
5428 }
5429 
5430 template <typename Derived>
5431 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5432     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5433   const DependentSizedMatrixType *T = TL.getTypePtr();
5434 
5435   QualType ElementType = getDerived().TransformType(T->getElementType());
5436   if (ElementType.isNull()) {
5437     return QualType();
5438   }
5439 
5440   // Matrix dimensions are constant expressions.
5441   EnterExpressionEvaluationContext Unevaluated(
5442       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5443 
5444   Expr *origRows = TL.getAttrRowOperand();
5445   if (!origRows)
5446     origRows = T->getRowExpr();
5447   Expr *origColumns = TL.getAttrColumnOperand();
5448   if (!origColumns)
5449     origColumns = T->getColumnExpr();
5450 
5451   ExprResult rowResult = getDerived().TransformExpr(origRows);
5452   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5453   if (rowResult.isInvalid())
5454     return QualType();
5455 
5456   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5457   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5458   if (columnResult.isInvalid())
5459     return QualType();
5460 
5461   Expr *rows = rowResult.get();
5462   Expr *columns = columnResult.get();
5463 
5464   QualType Result = TL.getType();
5465   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5466       rows != origRows || columns != origColumns) {
5467     Result = getDerived().RebuildDependentSizedMatrixType(
5468         ElementType, rows, columns, T->getAttributeLoc());
5469 
5470     if (Result.isNull())
5471       return QualType();
5472   }
5473 
5474   // We might have any sort of matrix type now, but fortunately they
5475   // all have the same location layout.
5476   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5477   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5478   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5479   NewTL.setAttrRowOperand(rows);
5480   NewTL.setAttrColumnOperand(columns);
5481   return Result;
5482 }
5483 
5484 template <typename Derived>
5485 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5486     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5487   const DependentAddressSpaceType *T = TL.getTypePtr();
5488 
5489   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5490 
5491   if (pointeeType.isNull())
5492     return QualType();
5493 
5494   // Address spaces are constant expressions.
5495   EnterExpressionEvaluationContext Unevaluated(
5496       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5497 
5498   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5499   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5500   if (AddrSpace.isInvalid())
5501     return QualType();
5502 
5503   QualType Result = TL.getType();
5504   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5505       AddrSpace.get() != T->getAddrSpaceExpr()) {
5506     Result = getDerived().RebuildDependentAddressSpaceType(
5507         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5508     if (Result.isNull())
5509       return QualType();
5510   }
5511 
5512   // Result might be dependent or not.
5513   if (isa<DependentAddressSpaceType>(Result)) {
5514     DependentAddressSpaceTypeLoc NewTL =
5515         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5516 
5517     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5518     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5519     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5520 
5521   } else {
5522     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5523         Result, getDerived().getBaseLocation());
5524     TransformType(TLB, DI->getTypeLoc());
5525   }
5526 
5527   return Result;
5528 }
5529 
5530 template <typename Derived>
5531 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5532                                                      VectorTypeLoc TL) {
5533   const VectorType *T = TL.getTypePtr();
5534   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5535   if (ElementType.isNull())
5536     return QualType();
5537 
5538   QualType Result = TL.getType();
5539   if (getDerived().AlwaysRebuild() ||
5540       ElementType != T->getElementType()) {
5541     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5542                                             T->getVectorKind());
5543     if (Result.isNull())
5544       return QualType();
5545   }
5546 
5547   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5548   NewTL.setNameLoc(TL.getNameLoc());
5549 
5550   return Result;
5551 }
5552 
5553 template<typename Derived>
5554 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5555                                                         ExtVectorTypeLoc TL) {
5556   const VectorType *T = TL.getTypePtr();
5557   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5558   if (ElementType.isNull())
5559     return QualType();
5560 
5561   QualType Result = TL.getType();
5562   if (getDerived().AlwaysRebuild() ||
5563       ElementType != T->getElementType()) {
5564     Result = getDerived().RebuildExtVectorType(ElementType,
5565                                                T->getNumElements(),
5566                                                /*FIXME*/ SourceLocation());
5567     if (Result.isNull())
5568       return QualType();
5569   }
5570 
5571   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5572   NewTL.setNameLoc(TL.getNameLoc());
5573 
5574   return Result;
5575 }
5576 
5577 template <typename Derived>
5578 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5579     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5580     bool ExpectParameterPack) {
5581   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5582   TypeSourceInfo *NewDI = nullptr;
5583 
5584   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5585     // If we're substituting into a pack expansion type and we know the
5586     // length we want to expand to, just substitute for the pattern.
5587     TypeLoc OldTL = OldDI->getTypeLoc();
5588     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5589 
5590     TypeLocBuilder TLB;
5591     TypeLoc NewTL = OldDI->getTypeLoc();
5592     TLB.reserve(NewTL.getFullDataSize());
5593 
5594     QualType Result = getDerived().TransformType(TLB,
5595                                                OldExpansionTL.getPatternLoc());
5596     if (Result.isNull())
5597       return nullptr;
5598 
5599     Result = RebuildPackExpansionType(Result,
5600                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5601                                       OldExpansionTL.getEllipsisLoc(),
5602                                       NumExpansions);
5603     if (Result.isNull())
5604       return nullptr;
5605 
5606     PackExpansionTypeLoc NewExpansionTL
5607       = TLB.push<PackExpansionTypeLoc>(Result);
5608     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5609     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5610   } else
5611     NewDI = getDerived().TransformType(OldDI);
5612   if (!NewDI)
5613     return nullptr;
5614 
5615   if (NewDI == OldDI && indexAdjustment == 0)
5616     return OldParm;
5617 
5618   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5619                                              OldParm->getDeclContext(),
5620                                              OldParm->getInnerLocStart(),
5621                                              OldParm->getLocation(),
5622                                              OldParm->getIdentifier(),
5623                                              NewDI->getType(),
5624                                              NewDI,
5625                                              OldParm->getStorageClass(),
5626                                              /* DefArg */ nullptr);
5627   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5628                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5629   transformedLocalDecl(OldParm, {newParm});
5630   return newParm;
5631 }
5632 
5633 template <typename Derived>
5634 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5635     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5636     const QualType *ParamTypes,
5637     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5638     SmallVectorImpl<QualType> &OutParamTypes,
5639     SmallVectorImpl<ParmVarDecl *> *PVars,
5640     Sema::ExtParameterInfoBuilder &PInfos) {
5641   int indexAdjustment = 0;
5642 
5643   unsigned NumParams = Params.size();
5644   for (unsigned i = 0; i != NumParams; ++i) {
5645     if (ParmVarDecl *OldParm = Params[i]) {
5646       assert(OldParm->getFunctionScopeIndex() == i);
5647 
5648       Optional<unsigned> NumExpansions;
5649       ParmVarDecl *NewParm = nullptr;
5650       if (OldParm->isParameterPack()) {
5651         // We have a function parameter pack that may need to be expanded.
5652         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5653 
5654         // Find the parameter packs that could be expanded.
5655         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5656         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5657         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5658         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5659 
5660         // Determine whether we should expand the parameter packs.
5661         bool ShouldExpand = false;
5662         bool RetainExpansion = false;
5663         Optional<unsigned> OrigNumExpansions;
5664         if (Unexpanded.size() > 0) {
5665           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5666           NumExpansions = OrigNumExpansions;
5667           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5668                                                    Pattern.getSourceRange(),
5669                                                    Unexpanded,
5670                                                    ShouldExpand,
5671                                                    RetainExpansion,
5672                                                    NumExpansions)) {
5673             return true;
5674           }
5675         } else {
5676 #ifndef NDEBUG
5677           const AutoType *AT =
5678               Pattern.getType().getTypePtr()->getContainedAutoType();
5679           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5680                  "Could not find parameter packs or undeduced auto type!");
5681 #endif
5682         }
5683 
5684         if (ShouldExpand) {
5685           // Expand the function parameter pack into multiple, separate
5686           // parameters.
5687           getDerived().ExpandingFunctionParameterPack(OldParm);
5688           for (unsigned I = 0; I != *NumExpansions; ++I) {
5689             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5690             ParmVarDecl *NewParm
5691               = getDerived().TransformFunctionTypeParam(OldParm,
5692                                                         indexAdjustment++,
5693                                                         OrigNumExpansions,
5694                                                 /*ExpectParameterPack=*/false);
5695             if (!NewParm)
5696               return true;
5697 
5698             if (ParamInfos)
5699               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5700             OutParamTypes.push_back(NewParm->getType());
5701             if (PVars)
5702               PVars->push_back(NewParm);
5703           }
5704 
5705           // If we're supposed to retain a pack expansion, do so by temporarily
5706           // forgetting the partially-substituted parameter pack.
5707           if (RetainExpansion) {
5708             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5709             ParmVarDecl *NewParm
5710               = getDerived().TransformFunctionTypeParam(OldParm,
5711                                                         indexAdjustment++,
5712                                                         OrigNumExpansions,
5713                                                 /*ExpectParameterPack=*/false);
5714             if (!NewParm)
5715               return true;
5716 
5717             if (ParamInfos)
5718               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5719             OutParamTypes.push_back(NewParm->getType());
5720             if (PVars)
5721               PVars->push_back(NewParm);
5722           }
5723 
5724           // The next parameter should have the same adjustment as the
5725           // last thing we pushed, but we post-incremented indexAdjustment
5726           // on every push.  Also, if we push nothing, the adjustment should
5727           // go down by one.
5728           indexAdjustment--;
5729 
5730           // We're done with the pack expansion.
5731           continue;
5732         }
5733 
5734         // We'll substitute the parameter now without expanding the pack
5735         // expansion.
5736         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5737         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5738                                                           indexAdjustment,
5739                                                           NumExpansions,
5740                                                   /*ExpectParameterPack=*/true);
5741         assert(NewParm->isParameterPack() &&
5742                "Parameter pack no longer a parameter pack after "
5743                "transformation.");
5744       } else {
5745         NewParm = getDerived().TransformFunctionTypeParam(
5746             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5747       }
5748 
5749       if (!NewParm)
5750         return true;
5751 
5752       if (ParamInfos)
5753         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5754       OutParamTypes.push_back(NewParm->getType());
5755       if (PVars)
5756         PVars->push_back(NewParm);
5757       continue;
5758     }
5759 
5760     // Deal with the possibility that we don't have a parameter
5761     // declaration for this parameter.
5762     QualType OldType = ParamTypes[i];
5763     bool IsPackExpansion = false;
5764     Optional<unsigned> NumExpansions;
5765     QualType NewType;
5766     if (const PackExpansionType *Expansion
5767                                        = dyn_cast<PackExpansionType>(OldType)) {
5768       // We have a function parameter pack that may need to be expanded.
5769       QualType Pattern = Expansion->getPattern();
5770       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5771       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5772 
5773       // Determine whether we should expand the parameter packs.
5774       bool ShouldExpand = false;
5775       bool RetainExpansion = false;
5776       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5777                                                Unexpanded,
5778                                                ShouldExpand,
5779                                                RetainExpansion,
5780                                                NumExpansions)) {
5781         return true;
5782       }
5783 
5784       if (ShouldExpand) {
5785         // Expand the function parameter pack into multiple, separate
5786         // parameters.
5787         for (unsigned I = 0; I != *NumExpansions; ++I) {
5788           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5789           QualType NewType = getDerived().TransformType(Pattern);
5790           if (NewType.isNull())
5791             return true;
5792 
5793           if (NewType->containsUnexpandedParameterPack()) {
5794             NewType =
5795                 getSema().getASTContext().getPackExpansionType(NewType, None);
5796 
5797             if (NewType.isNull())
5798               return true;
5799           }
5800 
5801           if (ParamInfos)
5802             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5803           OutParamTypes.push_back(NewType);
5804           if (PVars)
5805             PVars->push_back(nullptr);
5806         }
5807 
5808         // We're done with the pack expansion.
5809         continue;
5810       }
5811 
5812       // If we're supposed to retain a pack expansion, do so by temporarily
5813       // forgetting the partially-substituted parameter pack.
5814       if (RetainExpansion) {
5815         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5816         QualType NewType = getDerived().TransformType(Pattern);
5817         if (NewType.isNull())
5818           return true;
5819 
5820         if (ParamInfos)
5821           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5822         OutParamTypes.push_back(NewType);
5823         if (PVars)
5824           PVars->push_back(nullptr);
5825       }
5826 
5827       // We'll substitute the parameter now without expanding the pack
5828       // expansion.
5829       OldType = Expansion->getPattern();
5830       IsPackExpansion = true;
5831       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5832       NewType = getDerived().TransformType(OldType);
5833     } else {
5834       NewType = getDerived().TransformType(OldType);
5835     }
5836 
5837     if (NewType.isNull())
5838       return true;
5839 
5840     if (IsPackExpansion)
5841       NewType = getSema().Context.getPackExpansionType(NewType,
5842                                                        NumExpansions);
5843 
5844     if (ParamInfos)
5845       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5846     OutParamTypes.push_back(NewType);
5847     if (PVars)
5848       PVars->push_back(nullptr);
5849   }
5850 
5851 #ifndef NDEBUG
5852   if (PVars) {
5853     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5854       if (ParmVarDecl *parm = (*PVars)[i])
5855         assert(parm->getFunctionScopeIndex() == i);
5856   }
5857 #endif
5858 
5859   return false;
5860 }
5861 
5862 template<typename Derived>
5863 QualType
5864 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5865                                                    FunctionProtoTypeLoc TL) {
5866   SmallVector<QualType, 4> ExceptionStorage;
5867   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5868   return getDerived().TransformFunctionProtoType(
5869       TLB, TL, nullptr, Qualifiers(),
5870       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5871         return This->getDerived().TransformExceptionSpec(
5872             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
5873       });
5874 }
5875 
5876 template<typename Derived> template<typename Fn>
5877 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5878     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5879     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5880 
5881   // Transform the parameters and return type.
5882   //
5883   // We are required to instantiate the params and return type in source order.
5884   // When the function has a trailing return type, we instantiate the
5885   // parameters before the return type,  since the return type can then refer
5886   // to the parameters themselves (via decltype, sizeof, etc.).
5887   //
5888   SmallVector<QualType, 4> ParamTypes;
5889   SmallVector<ParmVarDecl*, 4> ParamDecls;
5890   Sema::ExtParameterInfoBuilder ExtParamInfos;
5891   const FunctionProtoType *T = TL.getTypePtr();
5892 
5893   QualType ResultType;
5894 
5895   if (T->hasTrailingReturn()) {
5896     if (getDerived().TransformFunctionTypeParams(
5897             TL.getBeginLoc(), TL.getParams(),
5898             TL.getTypePtr()->param_type_begin(),
5899             T->getExtParameterInfosOrNull(),
5900             ParamTypes, &ParamDecls, ExtParamInfos))
5901       return QualType();
5902 
5903     {
5904       // C++11 [expr.prim.general]p3:
5905       //   If a declaration declares a member function or member function
5906       //   template of a class X, the expression this is a prvalue of type
5907       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5908       //   and the end of the function-definition, member-declarator, or
5909       //   declarator.
5910       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5911 
5912       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5913       if (ResultType.isNull())
5914         return QualType();
5915     }
5916   }
5917   else {
5918     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5919     if (ResultType.isNull())
5920       return QualType();
5921 
5922     if (getDerived().TransformFunctionTypeParams(
5923             TL.getBeginLoc(), TL.getParams(),
5924             TL.getTypePtr()->param_type_begin(),
5925             T->getExtParameterInfosOrNull(),
5926             ParamTypes, &ParamDecls, ExtParamInfos))
5927       return QualType();
5928   }
5929 
5930   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5931 
5932   bool EPIChanged = false;
5933   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5934     return QualType();
5935 
5936   // Handle extended parameter information.
5937   if (auto NewExtParamInfos =
5938         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5939     if (!EPI.ExtParameterInfos ||
5940         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5941           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5942       EPIChanged = true;
5943     }
5944     EPI.ExtParameterInfos = NewExtParamInfos;
5945   } else if (EPI.ExtParameterInfos) {
5946     EPIChanged = true;
5947     EPI.ExtParameterInfos = nullptr;
5948   }
5949 
5950   QualType Result = TL.getType();
5951   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5952       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5953     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5954     if (Result.isNull())
5955       return QualType();
5956   }
5957 
5958   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5959   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5960   NewTL.setLParenLoc(TL.getLParenLoc());
5961   NewTL.setRParenLoc(TL.getRParenLoc());
5962   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5963   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5964   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5965     NewTL.setParam(i, ParamDecls[i]);
5966 
5967   return Result;
5968 }
5969 
5970 template<typename Derived>
5971 bool TreeTransform<Derived>::TransformExceptionSpec(
5972     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5973     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5974   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5975 
5976   // Instantiate a dynamic noexcept expression, if any.
5977   if (isComputedNoexcept(ESI.Type)) {
5978     EnterExpressionEvaluationContext Unevaluated(
5979         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5980     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5981     if (NoexceptExpr.isInvalid())
5982       return true;
5983 
5984     ExceptionSpecificationType EST = ESI.Type;
5985     NoexceptExpr =
5986         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
5987     if (NoexceptExpr.isInvalid())
5988       return true;
5989 
5990     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5991       Changed = true;
5992     ESI.NoexceptExpr = NoexceptExpr.get();
5993     ESI.Type = EST;
5994   }
5995 
5996   if (ESI.Type != EST_Dynamic)
5997     return false;
5998 
5999   // Instantiate a dynamic exception specification's type.
6000   for (QualType T : ESI.Exceptions) {
6001     if (const PackExpansionType *PackExpansion =
6002             T->getAs<PackExpansionType>()) {
6003       Changed = true;
6004 
6005       // We have a pack expansion. Instantiate it.
6006       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6007       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6008                                               Unexpanded);
6009       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6010 
6011       // Determine whether the set of unexpanded parameter packs can and
6012       // should
6013       // be expanded.
6014       bool Expand = false;
6015       bool RetainExpansion = false;
6016       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6017       // FIXME: Track the location of the ellipsis (and track source location
6018       // information for the types in the exception specification in general).
6019       if (getDerived().TryExpandParameterPacks(
6020               Loc, SourceRange(), Unexpanded, Expand,
6021               RetainExpansion, NumExpansions))
6022         return true;
6023 
6024       if (!Expand) {
6025         // We can't expand this pack expansion into separate arguments yet;
6026         // just substitute into the pattern and create a new pack expansion
6027         // type.
6028         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6029         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6030         if (U.isNull())
6031           return true;
6032 
6033         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6034         Exceptions.push_back(U);
6035         continue;
6036       }
6037 
6038       // Substitute into the pack expansion pattern for each slice of the
6039       // pack.
6040       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6041         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6042 
6043         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6044         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6045           return true;
6046 
6047         Exceptions.push_back(U);
6048       }
6049     } else {
6050       QualType U = getDerived().TransformType(T);
6051       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6052         return true;
6053       if (T != U)
6054         Changed = true;
6055 
6056       Exceptions.push_back(U);
6057     }
6058   }
6059 
6060   ESI.Exceptions = Exceptions;
6061   if (ESI.Exceptions.empty())
6062     ESI.Type = EST_DynamicNone;
6063   return false;
6064 }
6065 
6066 template<typename Derived>
6067 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6068                                                  TypeLocBuilder &TLB,
6069                                                  FunctionNoProtoTypeLoc TL) {
6070   const FunctionNoProtoType *T = TL.getTypePtr();
6071   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6072   if (ResultType.isNull())
6073     return QualType();
6074 
6075   QualType Result = TL.getType();
6076   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6077     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6078 
6079   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6080   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6081   NewTL.setLParenLoc(TL.getLParenLoc());
6082   NewTL.setRParenLoc(TL.getRParenLoc());
6083   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6084 
6085   return Result;
6086 }
6087 
6088 template <typename Derived>
6089 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6090     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6091   const UnresolvedUsingType *T = TL.getTypePtr();
6092   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6093   if (!D)
6094     return QualType();
6095 
6096   QualType Result = TL.getType();
6097   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6098     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6099     if (Result.isNull())
6100       return QualType();
6101   }
6102 
6103   // We might get an arbitrary type spec type back.  We should at
6104   // least always get a type spec type, though.
6105   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6106   NewTL.setNameLoc(TL.getNameLoc());
6107 
6108   return Result;
6109 }
6110 
6111 template <typename Derived>
6112 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6113                                                     UsingTypeLoc TL) {
6114   const UsingType *T = TL.getTypePtr();
6115 
6116   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6117       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6118   if (!Found)
6119     return QualType();
6120 
6121   QualType Underlying = getDerived().TransformType(T->desugar());
6122   if (Underlying.isNull())
6123     return QualType();
6124 
6125   QualType Result = TL.getType();
6126   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6127       Underlying != T->getUnderlyingType()) {
6128     Result = getDerived().RebuildUsingType(Found, Underlying);
6129     if (Result.isNull())
6130       return QualType();
6131   }
6132 
6133   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6134   return Result;
6135 }
6136 
6137 template<typename Derived>
6138 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6139                                                       TypedefTypeLoc TL) {
6140   const TypedefType *T = TL.getTypePtr();
6141   TypedefNameDecl *Typedef
6142     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6143                                                                T->getDecl()));
6144   if (!Typedef)
6145     return QualType();
6146 
6147   QualType Result = TL.getType();
6148   if (getDerived().AlwaysRebuild() ||
6149       Typedef != T->getDecl()) {
6150     Result = getDerived().RebuildTypedefType(Typedef);
6151     if (Result.isNull())
6152       return QualType();
6153   }
6154 
6155   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6156   NewTL.setNameLoc(TL.getNameLoc());
6157 
6158   return Result;
6159 }
6160 
6161 template<typename Derived>
6162 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6163                                                       TypeOfExprTypeLoc TL) {
6164   // typeof expressions are not potentially evaluated contexts
6165   EnterExpressionEvaluationContext Unevaluated(
6166       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6167       Sema::ReuseLambdaContextDecl);
6168 
6169   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6170   if (E.isInvalid())
6171     return QualType();
6172 
6173   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6174   if (E.isInvalid())
6175     return QualType();
6176 
6177   QualType Result = TL.getType();
6178   if (getDerived().AlwaysRebuild() ||
6179       E.get() != TL.getUnderlyingExpr()) {
6180     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6181     if (Result.isNull())
6182       return QualType();
6183   }
6184   else E.get();
6185 
6186   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6187   NewTL.setTypeofLoc(TL.getTypeofLoc());
6188   NewTL.setLParenLoc(TL.getLParenLoc());
6189   NewTL.setRParenLoc(TL.getRParenLoc());
6190 
6191   return Result;
6192 }
6193 
6194 template<typename Derived>
6195 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6196                                                      TypeOfTypeLoc TL) {
6197   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6198   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6199   if (!New_Under_TI)
6200     return QualType();
6201 
6202   QualType Result = TL.getType();
6203   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6204     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6205     if (Result.isNull())
6206       return QualType();
6207   }
6208 
6209   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6210   NewTL.setTypeofLoc(TL.getTypeofLoc());
6211   NewTL.setLParenLoc(TL.getLParenLoc());
6212   NewTL.setRParenLoc(TL.getRParenLoc());
6213   NewTL.setUnderlyingTInfo(New_Under_TI);
6214 
6215   return Result;
6216 }
6217 
6218 template<typename Derived>
6219 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6220                                                        DecltypeTypeLoc TL) {
6221   const DecltypeType *T = TL.getTypePtr();
6222 
6223   // decltype expressions are not potentially evaluated contexts
6224   EnterExpressionEvaluationContext Unevaluated(
6225       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6226       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6227 
6228   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6229   if (E.isInvalid())
6230     return QualType();
6231 
6232   E = getSema().ActOnDecltypeExpression(E.get());
6233   if (E.isInvalid())
6234     return QualType();
6235 
6236   QualType Result = TL.getType();
6237   if (getDerived().AlwaysRebuild() ||
6238       E.get() != T->getUnderlyingExpr()) {
6239     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6240     if (Result.isNull())
6241       return QualType();
6242   }
6243   else E.get();
6244 
6245   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6246   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6247   NewTL.setRParenLoc(TL.getRParenLoc());
6248   return Result;
6249 }
6250 
6251 template<typename Derived>
6252 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6253                                                             TypeLocBuilder &TLB,
6254                                                      UnaryTransformTypeLoc TL) {
6255   QualType Result = TL.getType();
6256   if (Result->isDependentType()) {
6257     const UnaryTransformType *T = TL.getTypePtr();
6258     QualType NewBase =
6259       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6260     Result = getDerived().RebuildUnaryTransformType(NewBase,
6261                                                     T->getUTTKind(),
6262                                                     TL.getKWLoc());
6263     if (Result.isNull())
6264       return QualType();
6265   }
6266 
6267   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6268   NewTL.setKWLoc(TL.getKWLoc());
6269   NewTL.setParensRange(TL.getParensRange());
6270   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6271   return Result;
6272 }
6273 
6274 template<typename Derived>
6275 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6276     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6277   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6278 
6279   CXXScopeSpec SS;
6280   TemplateName TemplateName = getDerived().TransformTemplateName(
6281       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6282   if (TemplateName.isNull())
6283     return QualType();
6284 
6285   QualType OldDeduced = T->getDeducedType();
6286   QualType NewDeduced;
6287   if (!OldDeduced.isNull()) {
6288     NewDeduced = getDerived().TransformType(OldDeduced);
6289     if (NewDeduced.isNull())
6290       return QualType();
6291   }
6292 
6293   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6294       TemplateName, NewDeduced);
6295   if (Result.isNull())
6296     return QualType();
6297 
6298   DeducedTemplateSpecializationTypeLoc NewTL =
6299       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6300   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6301 
6302   return Result;
6303 }
6304 
6305 template<typename Derived>
6306 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6307                                                      RecordTypeLoc TL) {
6308   const RecordType *T = TL.getTypePtr();
6309   RecordDecl *Record
6310     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6311                                                           T->getDecl()));
6312   if (!Record)
6313     return QualType();
6314 
6315   QualType Result = TL.getType();
6316   if (getDerived().AlwaysRebuild() ||
6317       Record != T->getDecl()) {
6318     Result = getDerived().RebuildRecordType(Record);
6319     if (Result.isNull())
6320       return QualType();
6321   }
6322 
6323   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6324   NewTL.setNameLoc(TL.getNameLoc());
6325 
6326   return Result;
6327 }
6328 
6329 template<typename Derived>
6330 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6331                                                    EnumTypeLoc TL) {
6332   const EnumType *T = TL.getTypePtr();
6333   EnumDecl *Enum
6334     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6335                                                         T->getDecl()));
6336   if (!Enum)
6337     return QualType();
6338 
6339   QualType Result = TL.getType();
6340   if (getDerived().AlwaysRebuild() ||
6341       Enum != T->getDecl()) {
6342     Result = getDerived().RebuildEnumType(Enum);
6343     if (Result.isNull())
6344       return QualType();
6345   }
6346 
6347   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6348   NewTL.setNameLoc(TL.getNameLoc());
6349 
6350   return Result;
6351 }
6352 
6353 template<typename Derived>
6354 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6355                                          TypeLocBuilder &TLB,
6356                                          InjectedClassNameTypeLoc TL) {
6357   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6358                                        TL.getTypePtr()->getDecl());
6359   if (!D) return QualType();
6360 
6361   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6362   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6363   return T;
6364 }
6365 
6366 template<typename Derived>
6367 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6368                                                 TypeLocBuilder &TLB,
6369                                                 TemplateTypeParmTypeLoc TL) {
6370   return TransformTypeSpecType(TLB, TL);
6371 }
6372 
6373 template<typename Derived>
6374 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6375                                          TypeLocBuilder &TLB,
6376                                          SubstTemplateTypeParmTypeLoc TL) {
6377   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6378 
6379   // Substitute into the replacement type, which itself might involve something
6380   // that needs to be transformed. This only tends to occur with default
6381   // template arguments of template template parameters.
6382   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6383   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6384   if (Replacement.isNull())
6385     return QualType();
6386 
6387   // Always canonicalize the replacement type.
6388   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6389   QualType Result
6390     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6391                                                    Replacement);
6392 
6393   // Propagate type-source information.
6394   SubstTemplateTypeParmTypeLoc NewTL
6395     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6396   NewTL.setNameLoc(TL.getNameLoc());
6397   return Result;
6398 
6399 }
6400 
6401 template<typename Derived>
6402 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6403                                           TypeLocBuilder &TLB,
6404                                           SubstTemplateTypeParmPackTypeLoc TL) {
6405   return TransformTypeSpecType(TLB, TL);
6406 }
6407 
6408 template<typename Derived>
6409 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6410                                                         TypeLocBuilder &TLB,
6411                                            TemplateSpecializationTypeLoc TL) {
6412   const TemplateSpecializationType *T = TL.getTypePtr();
6413 
6414   // The nested-name-specifier never matters in a TemplateSpecializationType,
6415   // because we can't have a dependent nested-name-specifier anyway.
6416   CXXScopeSpec SS;
6417   TemplateName Template
6418     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6419                                          TL.getTemplateNameLoc());
6420   if (Template.isNull())
6421     return QualType();
6422 
6423   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6424 }
6425 
6426 template<typename Derived>
6427 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6428                                                      AtomicTypeLoc TL) {
6429   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6430   if (ValueType.isNull())
6431     return QualType();
6432 
6433   QualType Result = TL.getType();
6434   if (getDerived().AlwaysRebuild() ||
6435       ValueType != TL.getValueLoc().getType()) {
6436     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6437     if (Result.isNull())
6438       return QualType();
6439   }
6440 
6441   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6442   NewTL.setKWLoc(TL.getKWLoc());
6443   NewTL.setLParenLoc(TL.getLParenLoc());
6444   NewTL.setRParenLoc(TL.getRParenLoc());
6445 
6446   return Result;
6447 }
6448 
6449 template <typename Derived>
6450 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6451                                                    PipeTypeLoc TL) {
6452   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6453   if (ValueType.isNull())
6454     return QualType();
6455 
6456   QualType Result = TL.getType();
6457   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6458     const PipeType *PT = Result->castAs<PipeType>();
6459     bool isReadPipe = PT->isReadOnly();
6460     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6461     if (Result.isNull())
6462       return QualType();
6463   }
6464 
6465   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6466   NewTL.setKWLoc(TL.getKWLoc());
6467 
6468   return Result;
6469 }
6470 
6471 template <typename Derived>
6472 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6473                                                      BitIntTypeLoc TL) {
6474   const BitIntType *EIT = TL.getTypePtr();
6475   QualType Result = TL.getType();
6476 
6477   if (getDerived().AlwaysRebuild()) {
6478     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6479                                             EIT->getNumBits(), TL.getNameLoc());
6480     if (Result.isNull())
6481       return QualType();
6482   }
6483 
6484   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6485   NewTL.setNameLoc(TL.getNameLoc());
6486   return Result;
6487 }
6488 
6489 template <typename Derived>
6490 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6491     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6492   const DependentBitIntType *EIT = TL.getTypePtr();
6493 
6494   EnterExpressionEvaluationContext Unevaluated(
6495       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6496   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6497   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6498 
6499   if (BitsExpr.isInvalid())
6500     return QualType();
6501 
6502   QualType Result = TL.getType();
6503 
6504   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6505     Result = getDerived().RebuildDependentBitIntType(
6506         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6507 
6508     if (Result.isNull())
6509       return QualType();
6510   }
6511 
6512   if (isa<DependentBitIntType>(Result)) {
6513     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6514     NewTL.setNameLoc(TL.getNameLoc());
6515   } else {
6516     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6517     NewTL.setNameLoc(TL.getNameLoc());
6518   }
6519   return Result;
6520 }
6521 
6522   /// Simple iterator that traverses the template arguments in a
6523   /// container that provides a \c getArgLoc() member function.
6524   ///
6525   /// This iterator is intended to be used with the iterator form of
6526   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6527   template<typename ArgLocContainer>
6528   class TemplateArgumentLocContainerIterator {
6529     ArgLocContainer *Container;
6530     unsigned Index;
6531 
6532   public:
6533     typedef TemplateArgumentLoc value_type;
6534     typedef TemplateArgumentLoc reference;
6535     typedef int difference_type;
6536     typedef std::input_iterator_tag iterator_category;
6537 
6538     class pointer {
6539       TemplateArgumentLoc Arg;
6540 
6541     public:
6542       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6543 
6544       const TemplateArgumentLoc *operator->() const {
6545         return &Arg;
6546       }
6547     };
6548 
6549 
6550     TemplateArgumentLocContainerIterator() {}
6551 
6552     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6553                                  unsigned Index)
6554       : Container(&Container), Index(Index) { }
6555 
6556     TemplateArgumentLocContainerIterator &operator++() {
6557       ++Index;
6558       return *this;
6559     }
6560 
6561     TemplateArgumentLocContainerIterator operator++(int) {
6562       TemplateArgumentLocContainerIterator Old(*this);
6563       ++(*this);
6564       return Old;
6565     }
6566 
6567     TemplateArgumentLoc operator*() const {
6568       return Container->getArgLoc(Index);
6569     }
6570 
6571     pointer operator->() const {
6572       return pointer(Container->getArgLoc(Index));
6573     }
6574 
6575     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6576                            const TemplateArgumentLocContainerIterator &Y) {
6577       return X.Container == Y.Container && X.Index == Y.Index;
6578     }
6579 
6580     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6581                            const TemplateArgumentLocContainerIterator &Y) {
6582       return !(X == Y);
6583     }
6584   };
6585 
6586 template<typename Derived>
6587 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6588                                                    AutoTypeLoc TL) {
6589   const AutoType *T = TL.getTypePtr();
6590   QualType OldDeduced = T->getDeducedType();
6591   QualType NewDeduced;
6592   if (!OldDeduced.isNull()) {
6593     NewDeduced = getDerived().TransformType(OldDeduced);
6594     if (NewDeduced.isNull())
6595       return QualType();
6596   }
6597 
6598   ConceptDecl *NewCD = nullptr;
6599   TemplateArgumentListInfo NewTemplateArgs;
6600   NestedNameSpecifierLoc NewNestedNameSpec;
6601   if (T->isConstrained()) {
6602     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6603         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6604 
6605     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6606     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6607     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6608     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6609                                                 ArgIterator(TL,
6610                                                             TL.getNumArgs()),
6611                                                 NewTemplateArgs))
6612       return QualType();
6613 
6614     if (TL.getNestedNameSpecifierLoc()) {
6615       NewNestedNameSpec
6616         = getDerived().TransformNestedNameSpecifierLoc(
6617             TL.getNestedNameSpecifierLoc());
6618       if (!NewNestedNameSpec)
6619         return QualType();
6620     }
6621   }
6622 
6623   QualType Result = TL.getType();
6624   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6625       T->isDependentType() || T->isConstrained()) {
6626     // FIXME: Maybe don't rebuild if all template arguments are the same.
6627     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6628     NewArgList.reserve(NewTemplateArgs.size());
6629     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6630       NewArgList.push_back(ArgLoc.getArgument());
6631     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6632                                           NewArgList);
6633     if (Result.isNull())
6634       return QualType();
6635   }
6636 
6637   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6638   NewTL.setNameLoc(TL.getNameLoc());
6639   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6640   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6641   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6642   NewTL.setFoundDecl(TL.getFoundDecl());
6643   NewTL.setLAngleLoc(TL.getLAngleLoc());
6644   NewTL.setRAngleLoc(TL.getRAngleLoc());
6645   NewTL.setRParenLoc(TL.getRParenLoc());
6646   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6647     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6648 
6649   return Result;
6650 }
6651 
6652 template <typename Derived>
6653 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6654                                                         TypeLocBuilder &TLB,
6655                                            TemplateSpecializationTypeLoc TL,
6656                                                       TemplateName Template) {
6657   TemplateArgumentListInfo NewTemplateArgs;
6658   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6659   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6660   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6661     ArgIterator;
6662   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6663                                               ArgIterator(TL, TL.getNumArgs()),
6664                                               NewTemplateArgs))
6665     return QualType();
6666 
6667   // FIXME: maybe don't rebuild if all the template arguments are the same.
6668 
6669   QualType Result =
6670     getDerived().RebuildTemplateSpecializationType(Template,
6671                                                    TL.getTemplateNameLoc(),
6672                                                    NewTemplateArgs);
6673 
6674   if (!Result.isNull()) {
6675     // Specializations of template template parameters are represented as
6676     // TemplateSpecializationTypes, and substitution of type alias templates
6677     // within a dependent context can transform them into
6678     // DependentTemplateSpecializationTypes.
6679     if (isa<DependentTemplateSpecializationType>(Result)) {
6680       DependentTemplateSpecializationTypeLoc NewTL
6681         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6682       NewTL.setElaboratedKeywordLoc(SourceLocation());
6683       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6684       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6685       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6686       NewTL.setLAngleLoc(TL.getLAngleLoc());
6687       NewTL.setRAngleLoc(TL.getRAngleLoc());
6688       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6689         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6690       return Result;
6691     }
6692 
6693     TemplateSpecializationTypeLoc NewTL
6694       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6695     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6696     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6697     NewTL.setLAngleLoc(TL.getLAngleLoc());
6698     NewTL.setRAngleLoc(TL.getRAngleLoc());
6699     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6700       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6701   }
6702 
6703   return Result;
6704 }
6705 
6706 template <typename Derived>
6707 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6708                                      TypeLocBuilder &TLB,
6709                                      DependentTemplateSpecializationTypeLoc TL,
6710                                      TemplateName Template,
6711                                      CXXScopeSpec &SS) {
6712   TemplateArgumentListInfo NewTemplateArgs;
6713   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6714   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6715   typedef TemplateArgumentLocContainerIterator<
6716             DependentTemplateSpecializationTypeLoc> ArgIterator;
6717   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6718                                               ArgIterator(TL, TL.getNumArgs()),
6719                                               NewTemplateArgs))
6720     return QualType();
6721 
6722   // FIXME: maybe don't rebuild if all the template arguments are the same.
6723 
6724   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6725     QualType Result
6726       = getSema().Context.getDependentTemplateSpecializationType(
6727                                                 TL.getTypePtr()->getKeyword(),
6728                                                          DTN->getQualifier(),
6729                                                          DTN->getIdentifier(),
6730                                                                NewTemplateArgs);
6731 
6732     DependentTemplateSpecializationTypeLoc NewTL
6733       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6734     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6735     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6736     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6737     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6738     NewTL.setLAngleLoc(TL.getLAngleLoc());
6739     NewTL.setRAngleLoc(TL.getRAngleLoc());
6740     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6741       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6742     return Result;
6743   }
6744 
6745   QualType Result
6746     = getDerived().RebuildTemplateSpecializationType(Template,
6747                                                      TL.getTemplateNameLoc(),
6748                                                      NewTemplateArgs);
6749 
6750   if (!Result.isNull()) {
6751     /// FIXME: Wrap this in an elaborated-type-specifier?
6752     TemplateSpecializationTypeLoc NewTL
6753       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6754     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6755     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6756     NewTL.setLAngleLoc(TL.getLAngleLoc());
6757     NewTL.setRAngleLoc(TL.getRAngleLoc());
6758     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6759       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6760   }
6761 
6762   return Result;
6763 }
6764 
6765 template<typename Derived>
6766 QualType
6767 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6768                                                 ElaboratedTypeLoc TL) {
6769   const ElaboratedType *T = TL.getTypePtr();
6770 
6771   NestedNameSpecifierLoc QualifierLoc;
6772   // NOTE: the qualifier in an ElaboratedType is optional.
6773   if (TL.getQualifierLoc()) {
6774     QualifierLoc
6775       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6776     if (!QualifierLoc)
6777       return QualType();
6778   }
6779 
6780   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6781   if (NamedT.isNull())
6782     return QualType();
6783 
6784   // C++0x [dcl.type.elab]p2:
6785   //   If the identifier resolves to a typedef-name or the simple-template-id
6786   //   resolves to an alias template specialization, the
6787   //   elaborated-type-specifier is ill-formed.
6788   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6789     if (const TemplateSpecializationType *TST =
6790           NamedT->getAs<TemplateSpecializationType>()) {
6791       TemplateName Template = TST->getTemplateName();
6792       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6793               Template.getAsTemplateDecl())) {
6794         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6795                      diag::err_tag_reference_non_tag)
6796             << TAT << Sema::NTK_TypeAliasTemplate
6797             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6798         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6799       }
6800     }
6801   }
6802 
6803   QualType Result = TL.getType();
6804   if (getDerived().AlwaysRebuild() ||
6805       QualifierLoc != TL.getQualifierLoc() ||
6806       NamedT != T->getNamedType()) {
6807     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6808                                                 T->getKeyword(),
6809                                                 QualifierLoc, NamedT);
6810     if (Result.isNull())
6811       return QualType();
6812   }
6813 
6814   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6815   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6816   NewTL.setQualifierLoc(QualifierLoc);
6817   return Result;
6818 }
6819 
6820 template<typename Derived>
6821 QualType TreeTransform<Derived>::TransformAttributedType(
6822                                                 TypeLocBuilder &TLB,
6823                                                 AttributedTypeLoc TL) {
6824   const AttributedType *oldType = TL.getTypePtr();
6825   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6826   if (modifiedType.isNull())
6827     return QualType();
6828 
6829   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6830   const Attr *oldAttr = TL.getAttr();
6831   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6832   if (oldAttr && !newAttr)
6833     return QualType();
6834 
6835   QualType result = TL.getType();
6836 
6837   // FIXME: dependent operand expressions?
6838   if (getDerived().AlwaysRebuild() ||
6839       modifiedType != oldType->getModifiedType()) {
6840     // TODO: this is really lame; we should really be rebuilding the
6841     // equivalent type from first principles.
6842     QualType equivalentType
6843       = getDerived().TransformType(oldType->getEquivalentType());
6844     if (equivalentType.isNull())
6845       return QualType();
6846 
6847     // Check whether we can add nullability; it is only represented as
6848     // type sugar, and therefore cannot be diagnosed in any other way.
6849     if (auto nullability = oldType->getImmediateNullability()) {
6850       if (!modifiedType->canHaveNullability()) {
6851         SemaRef.Diag(TL.getAttr()->getLocation(),
6852                      diag::err_nullability_nonpointer)
6853             << DiagNullabilityKind(*nullability, false) << modifiedType;
6854         return QualType();
6855       }
6856     }
6857 
6858     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6859                                                modifiedType,
6860                                                equivalentType);
6861   }
6862 
6863   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6864   newTL.setAttr(newAttr);
6865   return result;
6866 }
6867 
6868 template <typename Derived>
6869 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
6870     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
6871   // The BTFTagAttributedType is available for C only.
6872   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
6873 }
6874 
6875 template<typename Derived>
6876 QualType
6877 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6878                                            ParenTypeLoc TL) {
6879   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6880   if (Inner.isNull())
6881     return QualType();
6882 
6883   QualType Result = TL.getType();
6884   if (getDerived().AlwaysRebuild() ||
6885       Inner != TL.getInnerLoc().getType()) {
6886     Result = getDerived().RebuildParenType(Inner);
6887     if (Result.isNull())
6888       return QualType();
6889   }
6890 
6891   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6892   NewTL.setLParenLoc(TL.getLParenLoc());
6893   NewTL.setRParenLoc(TL.getRParenLoc());
6894   return Result;
6895 }
6896 
6897 template <typename Derived>
6898 QualType
6899 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6900                                                     MacroQualifiedTypeLoc TL) {
6901   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6902   if (Inner.isNull())
6903     return QualType();
6904 
6905   QualType Result = TL.getType();
6906   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6907     Result =
6908         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6909     if (Result.isNull())
6910       return QualType();
6911   }
6912 
6913   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6914   NewTL.setExpansionLoc(TL.getExpansionLoc());
6915   return Result;
6916 }
6917 
6918 template<typename Derived>
6919 QualType TreeTransform<Derived>::TransformDependentNameType(
6920     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6921   return TransformDependentNameType(TLB, TL, false);
6922 }
6923 
6924 template<typename Derived>
6925 QualType TreeTransform<Derived>::TransformDependentNameType(
6926     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6927   const DependentNameType *T = TL.getTypePtr();
6928 
6929   NestedNameSpecifierLoc QualifierLoc
6930     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6931   if (!QualifierLoc)
6932     return QualType();
6933 
6934   QualType Result
6935     = getDerived().RebuildDependentNameType(T->getKeyword(),
6936                                             TL.getElaboratedKeywordLoc(),
6937                                             QualifierLoc,
6938                                             T->getIdentifier(),
6939                                             TL.getNameLoc(),
6940                                             DeducedTSTContext);
6941   if (Result.isNull())
6942     return QualType();
6943 
6944   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6945     QualType NamedT = ElabT->getNamedType();
6946     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6947 
6948     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6949     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6950     NewTL.setQualifierLoc(QualifierLoc);
6951   } else {
6952     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6953     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6954     NewTL.setQualifierLoc(QualifierLoc);
6955     NewTL.setNameLoc(TL.getNameLoc());
6956   }
6957   return Result;
6958 }
6959 
6960 template<typename Derived>
6961 QualType TreeTransform<Derived>::
6962           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6963                                  DependentTemplateSpecializationTypeLoc TL) {
6964   NestedNameSpecifierLoc QualifierLoc;
6965   if (TL.getQualifierLoc()) {
6966     QualifierLoc
6967       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6968     if (!QualifierLoc)
6969       return QualType();
6970   }
6971 
6972   return getDerived()
6973            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6974 }
6975 
6976 template<typename Derived>
6977 QualType TreeTransform<Derived>::
6978 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6979                                    DependentTemplateSpecializationTypeLoc TL,
6980                                        NestedNameSpecifierLoc QualifierLoc) {
6981   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6982 
6983   TemplateArgumentListInfo NewTemplateArgs;
6984   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6985   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6986 
6987   typedef TemplateArgumentLocContainerIterator<
6988   DependentTemplateSpecializationTypeLoc> ArgIterator;
6989   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6990                                               ArgIterator(TL, TL.getNumArgs()),
6991                                               NewTemplateArgs))
6992     return QualType();
6993 
6994   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6995       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6996       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6997       /*AllowInjectedClassName*/ false);
6998   if (Result.isNull())
6999     return QualType();
7000 
7001   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7002     QualType NamedT = ElabT->getNamedType();
7003 
7004     // Copy information relevant to the template specialization.
7005     TemplateSpecializationTypeLoc NamedTL
7006       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7007     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7008     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7009     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7010     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7011     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7012       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7013 
7014     // Copy information relevant to the elaborated type.
7015     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7016     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7017     NewTL.setQualifierLoc(QualifierLoc);
7018   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7019     DependentTemplateSpecializationTypeLoc SpecTL
7020       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7021     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7022     SpecTL.setQualifierLoc(QualifierLoc);
7023     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7024     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7025     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7026     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7027     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7028       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7029   } else {
7030     TemplateSpecializationTypeLoc SpecTL
7031       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7032     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7033     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7034     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7035     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7036     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7037       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7038   }
7039   return Result;
7040 }
7041 
7042 template<typename Derived>
7043 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7044                                                       PackExpansionTypeLoc TL) {
7045   QualType Pattern
7046     = getDerived().TransformType(TLB, TL.getPatternLoc());
7047   if (Pattern.isNull())
7048     return QualType();
7049 
7050   QualType Result = TL.getType();
7051   if (getDerived().AlwaysRebuild() ||
7052       Pattern != TL.getPatternLoc().getType()) {
7053     Result = getDerived().RebuildPackExpansionType(Pattern,
7054                                            TL.getPatternLoc().getSourceRange(),
7055                                                    TL.getEllipsisLoc(),
7056                                            TL.getTypePtr()->getNumExpansions());
7057     if (Result.isNull())
7058       return QualType();
7059   }
7060 
7061   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7062   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7063   return Result;
7064 }
7065 
7066 template<typename Derived>
7067 QualType
7068 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7069                                                    ObjCInterfaceTypeLoc TL) {
7070   // ObjCInterfaceType is never dependent.
7071   TLB.pushFullCopy(TL);
7072   return TL.getType();
7073 }
7074 
7075 template<typename Derived>
7076 QualType
7077 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7078                                                    ObjCTypeParamTypeLoc TL) {
7079   const ObjCTypeParamType *T = TL.getTypePtr();
7080   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7081       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7082   if (!OTP)
7083     return QualType();
7084 
7085   QualType Result = TL.getType();
7086   if (getDerived().AlwaysRebuild() ||
7087       OTP != T->getDecl()) {
7088     Result = getDerived().RebuildObjCTypeParamType(OTP,
7089                  TL.getProtocolLAngleLoc(),
7090                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7091                                     TL.getNumProtocols()),
7092                  TL.getProtocolLocs(),
7093                  TL.getProtocolRAngleLoc());
7094     if (Result.isNull())
7095       return QualType();
7096   }
7097 
7098   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7099   if (TL.getNumProtocols()) {
7100     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7101     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7102       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7103     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7104   }
7105   return Result;
7106 }
7107 
7108 template<typename Derived>
7109 QualType
7110 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7111                                                 ObjCObjectTypeLoc TL) {
7112   // Transform base type.
7113   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7114   if (BaseType.isNull())
7115     return QualType();
7116 
7117   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7118 
7119   // Transform type arguments.
7120   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7121   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7122     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7123     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7124     QualType TypeArg = TypeArgInfo->getType();
7125     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7126       AnyChanged = true;
7127 
7128       // We have a pack expansion. Instantiate it.
7129       const auto *PackExpansion = PackExpansionLoc.getType()
7130                                     ->castAs<PackExpansionType>();
7131       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7132       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7133                                               Unexpanded);
7134       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7135 
7136       // Determine whether the set of unexpanded parameter packs can
7137       // and should be expanded.
7138       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7139       bool Expand = false;
7140       bool RetainExpansion = false;
7141       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7142       if (getDerived().TryExpandParameterPacks(
7143             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7144             Unexpanded, Expand, RetainExpansion, NumExpansions))
7145         return QualType();
7146 
7147       if (!Expand) {
7148         // We can't expand this pack expansion into separate arguments yet;
7149         // just substitute into the pattern and create a new pack expansion
7150         // type.
7151         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7152 
7153         TypeLocBuilder TypeArgBuilder;
7154         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7155         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7156                                                              PatternLoc);
7157         if (NewPatternType.isNull())
7158           return QualType();
7159 
7160         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7161                                       NewPatternType, NumExpansions);
7162         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7163         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7164         NewTypeArgInfos.push_back(
7165           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7166         continue;
7167       }
7168 
7169       // Substitute into the pack expansion pattern for each slice of the
7170       // pack.
7171       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7172         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7173 
7174         TypeLocBuilder TypeArgBuilder;
7175         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7176 
7177         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7178                                                          PatternLoc);
7179         if (NewTypeArg.isNull())
7180           return QualType();
7181 
7182         NewTypeArgInfos.push_back(
7183           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7184       }
7185 
7186       continue;
7187     }
7188 
7189     TypeLocBuilder TypeArgBuilder;
7190     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7191     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7192     if (NewTypeArg.isNull())
7193       return QualType();
7194 
7195     // If nothing changed, just keep the old TypeSourceInfo.
7196     if (NewTypeArg == TypeArg) {
7197       NewTypeArgInfos.push_back(TypeArgInfo);
7198       continue;
7199     }
7200 
7201     NewTypeArgInfos.push_back(
7202       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7203     AnyChanged = true;
7204   }
7205 
7206   QualType Result = TL.getType();
7207   if (getDerived().AlwaysRebuild() || AnyChanged) {
7208     // Rebuild the type.
7209     Result = getDerived().RebuildObjCObjectType(
7210         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7211         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7212         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7213         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7214 
7215     if (Result.isNull())
7216       return QualType();
7217   }
7218 
7219   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7220   NewT.setHasBaseTypeAsWritten(true);
7221   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7222   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7223     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7224   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7225   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7226   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7227     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7228   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7229   return Result;
7230 }
7231 
7232 template<typename Derived>
7233 QualType
7234 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7235                                                ObjCObjectPointerTypeLoc TL) {
7236   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7237   if (PointeeType.isNull())
7238     return QualType();
7239 
7240   QualType Result = TL.getType();
7241   if (getDerived().AlwaysRebuild() ||
7242       PointeeType != TL.getPointeeLoc().getType()) {
7243     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7244                                                        TL.getStarLoc());
7245     if (Result.isNull())
7246       return QualType();
7247   }
7248 
7249   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7250   NewT.setStarLoc(TL.getStarLoc());
7251   return Result;
7252 }
7253 
7254 //===----------------------------------------------------------------------===//
7255 // Statement transformation
7256 //===----------------------------------------------------------------------===//
7257 template<typename Derived>
7258 StmtResult
7259 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7260   return S;
7261 }
7262 
7263 template<typename Derived>
7264 StmtResult
7265 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7266   return getDerived().TransformCompoundStmt(S, false);
7267 }
7268 
7269 template<typename Derived>
7270 StmtResult
7271 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7272                                               bool IsStmtExpr) {
7273   Sema::CompoundScopeRAII CompoundScope(getSema());
7274 
7275   const Stmt *ExprResult = S->getStmtExprResult();
7276   bool SubStmtInvalid = false;
7277   bool SubStmtChanged = false;
7278   SmallVector<Stmt*, 8> Statements;
7279   for (auto *B : S->body()) {
7280     StmtResult Result = getDerived().TransformStmt(
7281         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7282 
7283     if (Result.isInvalid()) {
7284       // Immediately fail if this was a DeclStmt, since it's very
7285       // likely that this will cause problems for future statements.
7286       if (isa<DeclStmt>(B))
7287         return StmtError();
7288 
7289       // Otherwise, just keep processing substatements and fail later.
7290       SubStmtInvalid = true;
7291       continue;
7292     }
7293 
7294     SubStmtChanged = SubStmtChanged || Result.get() != B;
7295     Statements.push_back(Result.getAs<Stmt>());
7296   }
7297 
7298   if (SubStmtInvalid)
7299     return StmtError();
7300 
7301   if (!getDerived().AlwaysRebuild() &&
7302       !SubStmtChanged)
7303     return S;
7304 
7305   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7306                                           Statements,
7307                                           S->getRBracLoc(),
7308                                           IsStmtExpr);
7309 }
7310 
7311 template<typename Derived>
7312 StmtResult
7313 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7314   ExprResult LHS, RHS;
7315   {
7316     EnterExpressionEvaluationContext Unevaluated(
7317         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7318 
7319     // Transform the left-hand case value.
7320     LHS = getDerived().TransformExpr(S->getLHS());
7321     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7322     if (LHS.isInvalid())
7323       return StmtError();
7324 
7325     // Transform the right-hand case value (for the GNU case-range extension).
7326     RHS = getDerived().TransformExpr(S->getRHS());
7327     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7328     if (RHS.isInvalid())
7329       return StmtError();
7330   }
7331 
7332   // Build the case statement.
7333   // Case statements are always rebuilt so that they will attached to their
7334   // transformed switch statement.
7335   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7336                                                        LHS.get(),
7337                                                        S->getEllipsisLoc(),
7338                                                        RHS.get(),
7339                                                        S->getColonLoc());
7340   if (Case.isInvalid())
7341     return StmtError();
7342 
7343   // Transform the statement following the case
7344   StmtResult SubStmt =
7345       getDerived().TransformStmt(S->getSubStmt());
7346   if (SubStmt.isInvalid())
7347     return StmtError();
7348 
7349   // Attach the body to the case statement
7350   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7351 }
7352 
7353 template <typename Derived>
7354 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7355   // Transform the statement following the default case
7356   StmtResult SubStmt =
7357       getDerived().TransformStmt(S->getSubStmt());
7358   if (SubStmt.isInvalid())
7359     return StmtError();
7360 
7361   // Default statements are always rebuilt
7362   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7363                                          SubStmt.get());
7364 }
7365 
7366 template<typename Derived>
7367 StmtResult
7368 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7369   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7370   if (SubStmt.isInvalid())
7371     return StmtError();
7372 
7373   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7374                                         S->getDecl());
7375   if (!LD)
7376     return StmtError();
7377 
7378   // If we're transforming "in-place" (we're not creating new local
7379   // declarations), assume we're replacing the old label statement
7380   // and clear out the reference to it.
7381   if (LD == S->getDecl())
7382     S->getDecl()->setStmt(nullptr);
7383 
7384   // FIXME: Pass the real colon location in.
7385   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7386                                        cast<LabelDecl>(LD), SourceLocation(),
7387                                        SubStmt.get());
7388 }
7389 
7390 template <typename Derived>
7391 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7392   if (!R)
7393     return R;
7394 
7395   switch (R->getKind()) {
7396 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7397 #define ATTR(X)
7398 #define PRAGMA_SPELLING_ATTR(X)                                                \
7399   case attr::X:                                                                \
7400     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7401 #include "clang/Basic/AttrList.inc"
7402   default:
7403     return R;
7404   }
7405 }
7406 
7407 template <typename Derived>
7408 StmtResult
7409 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7410                                                 StmtDiscardKind SDK) {
7411   bool AttrsChanged = false;
7412   SmallVector<const Attr *, 1> Attrs;
7413 
7414   // Visit attributes and keep track if any are transformed.
7415   for (const auto *I : S->getAttrs()) {
7416     const Attr *R = getDerived().TransformAttr(I);
7417     AttrsChanged |= (I != R);
7418     if (R)
7419       Attrs.push_back(R);
7420   }
7421 
7422   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7423   if (SubStmt.isInvalid())
7424     return StmtError();
7425 
7426   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7427     return S;
7428 
7429   // If transforming the attributes failed for all of the attributes in the
7430   // statement, don't make an AttributedStmt without attributes.
7431   if (Attrs.empty())
7432     return SubStmt;
7433 
7434   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7435                                             SubStmt.get());
7436 }
7437 
7438 template<typename Derived>
7439 StmtResult
7440 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7441   // Transform the initialization statement
7442   StmtResult Init = getDerived().TransformStmt(S->getInit());
7443   if (Init.isInvalid())
7444     return StmtError();
7445 
7446   Sema::ConditionResult Cond;
7447   if (!S->isConsteval()) {
7448     // Transform the condition
7449     Cond = getDerived().TransformCondition(
7450         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7451         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7452                          : Sema::ConditionKind::Boolean);
7453     if (Cond.isInvalid())
7454       return StmtError();
7455   }
7456 
7457   // If this is a constexpr if, determine which arm we should instantiate.
7458   llvm::Optional<bool> ConstexprConditionValue;
7459   if (S->isConstexpr())
7460     ConstexprConditionValue = Cond.getKnownValue();
7461 
7462   // Transform the "then" branch.
7463   StmtResult Then;
7464   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7465     Then = getDerived().TransformStmt(S->getThen());
7466     if (Then.isInvalid())
7467       return StmtError();
7468   } else {
7469     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7470   }
7471 
7472   // Transform the "else" branch.
7473   StmtResult Else;
7474   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7475     Else = getDerived().TransformStmt(S->getElse());
7476     if (Else.isInvalid())
7477       return StmtError();
7478   }
7479 
7480   if (!getDerived().AlwaysRebuild() &&
7481       Init.get() == S->getInit() &&
7482       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7483       Then.get() == S->getThen() &&
7484       Else.get() == S->getElse())
7485     return S;
7486 
7487   return getDerived().RebuildIfStmt(
7488       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7489       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7490 }
7491 
7492 template<typename Derived>
7493 StmtResult
7494 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7495   // Transform the initialization statement
7496   StmtResult Init = getDerived().TransformStmt(S->getInit());
7497   if (Init.isInvalid())
7498     return StmtError();
7499 
7500   // Transform the condition.
7501   Sema::ConditionResult Cond = getDerived().TransformCondition(
7502       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7503       Sema::ConditionKind::Switch);
7504   if (Cond.isInvalid())
7505     return StmtError();
7506 
7507   // Rebuild the switch statement.
7508   StmtResult Switch =
7509       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7510                                           Init.get(), Cond, S->getRParenLoc());
7511   if (Switch.isInvalid())
7512     return StmtError();
7513 
7514   // Transform the body of the switch statement.
7515   StmtResult Body = getDerived().TransformStmt(S->getBody());
7516   if (Body.isInvalid())
7517     return StmtError();
7518 
7519   // Complete the switch statement.
7520   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7521                                             Body.get());
7522 }
7523 
7524 template<typename Derived>
7525 StmtResult
7526 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7527   // Transform the condition
7528   Sema::ConditionResult Cond = getDerived().TransformCondition(
7529       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7530       Sema::ConditionKind::Boolean);
7531   if (Cond.isInvalid())
7532     return StmtError();
7533 
7534   // Transform the body
7535   StmtResult Body = getDerived().TransformStmt(S->getBody());
7536   if (Body.isInvalid())
7537     return StmtError();
7538 
7539   if (!getDerived().AlwaysRebuild() &&
7540       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7541       Body.get() == S->getBody())
7542     return Owned(S);
7543 
7544   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7545                                        Cond, S->getRParenLoc(), Body.get());
7546 }
7547 
7548 template<typename Derived>
7549 StmtResult
7550 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7551   // Transform the body
7552   StmtResult Body = getDerived().TransformStmt(S->getBody());
7553   if (Body.isInvalid())
7554     return StmtError();
7555 
7556   // Transform the condition
7557   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7558   if (Cond.isInvalid())
7559     return StmtError();
7560 
7561   if (!getDerived().AlwaysRebuild() &&
7562       Cond.get() == S->getCond() &&
7563       Body.get() == S->getBody())
7564     return S;
7565 
7566   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7567                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7568                                     S->getRParenLoc());
7569 }
7570 
7571 template<typename Derived>
7572 StmtResult
7573 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7574   if (getSema().getLangOpts().OpenMP)
7575     getSema().startOpenMPLoop();
7576 
7577   // Transform the initialization statement
7578   StmtResult Init = getDerived().TransformStmt(S->getInit());
7579   if (Init.isInvalid())
7580     return StmtError();
7581 
7582   // In OpenMP loop region loop control variable must be captured and be
7583   // private. Perform analysis of first part (if any).
7584   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7585     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7586 
7587   // Transform the condition
7588   Sema::ConditionResult Cond = getDerived().TransformCondition(
7589       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7590       Sema::ConditionKind::Boolean);
7591   if (Cond.isInvalid())
7592     return StmtError();
7593 
7594   // Transform the increment
7595   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7596   if (Inc.isInvalid())
7597     return StmtError();
7598 
7599   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7600   if (S->getInc() && !FullInc.get())
7601     return StmtError();
7602 
7603   // Transform the body
7604   StmtResult Body = getDerived().TransformStmt(S->getBody());
7605   if (Body.isInvalid())
7606     return StmtError();
7607 
7608   if (!getDerived().AlwaysRebuild() &&
7609       Init.get() == S->getInit() &&
7610       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7611       Inc.get() == S->getInc() &&
7612       Body.get() == S->getBody())
7613     return S;
7614 
7615   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7616                                      Init.get(), Cond, FullInc,
7617                                      S->getRParenLoc(), Body.get());
7618 }
7619 
7620 template<typename Derived>
7621 StmtResult
7622 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7623   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7624                                         S->getLabel());
7625   if (!LD)
7626     return StmtError();
7627 
7628   // Goto statements must always be rebuilt, to resolve the label.
7629   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7630                                       cast<LabelDecl>(LD));
7631 }
7632 
7633 template<typename Derived>
7634 StmtResult
7635 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7636   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7637   if (Target.isInvalid())
7638     return StmtError();
7639   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7640 
7641   if (!getDerived().AlwaysRebuild() &&
7642       Target.get() == S->getTarget())
7643     return S;
7644 
7645   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7646                                               Target.get());
7647 }
7648 
7649 template<typename Derived>
7650 StmtResult
7651 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7652   return S;
7653 }
7654 
7655 template<typename Derived>
7656 StmtResult
7657 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7658   return S;
7659 }
7660 
7661 template<typename Derived>
7662 StmtResult
7663 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7664   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7665                                                         /*NotCopyInit*/false);
7666   if (Result.isInvalid())
7667     return StmtError();
7668 
7669   // FIXME: We always rebuild the return statement because there is no way
7670   // to tell whether the return type of the function has changed.
7671   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7672 }
7673 
7674 template<typename Derived>
7675 StmtResult
7676 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7677   bool DeclChanged = false;
7678   SmallVector<Decl *, 4> Decls;
7679   for (auto *D : S->decls()) {
7680     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7681     if (!Transformed)
7682       return StmtError();
7683 
7684     if (Transformed != D)
7685       DeclChanged = true;
7686 
7687     Decls.push_back(Transformed);
7688   }
7689 
7690   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7691     return S;
7692 
7693   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7694 }
7695 
7696 template<typename Derived>
7697 StmtResult
7698 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7699 
7700   SmallVector<Expr*, 8> Constraints;
7701   SmallVector<Expr*, 8> Exprs;
7702   SmallVector<IdentifierInfo *, 4> Names;
7703 
7704   ExprResult AsmString;
7705   SmallVector<Expr*, 8> Clobbers;
7706 
7707   bool ExprsChanged = false;
7708 
7709   // Go through the outputs.
7710   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7711     Names.push_back(S->getOutputIdentifier(I));
7712 
7713     // No need to transform the constraint literal.
7714     Constraints.push_back(S->getOutputConstraintLiteral(I));
7715 
7716     // Transform the output expr.
7717     Expr *OutputExpr = S->getOutputExpr(I);
7718     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7719     if (Result.isInvalid())
7720       return StmtError();
7721 
7722     ExprsChanged |= Result.get() != OutputExpr;
7723 
7724     Exprs.push_back(Result.get());
7725   }
7726 
7727   // Go through the inputs.
7728   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7729     Names.push_back(S->getInputIdentifier(I));
7730 
7731     // No need to transform the constraint literal.
7732     Constraints.push_back(S->getInputConstraintLiteral(I));
7733 
7734     // Transform the input expr.
7735     Expr *InputExpr = S->getInputExpr(I);
7736     ExprResult Result = getDerived().TransformExpr(InputExpr);
7737     if (Result.isInvalid())
7738       return StmtError();
7739 
7740     ExprsChanged |= Result.get() != InputExpr;
7741 
7742     Exprs.push_back(Result.get());
7743   }
7744 
7745   // Go through the Labels.
7746   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7747     Names.push_back(S->getLabelIdentifier(I));
7748 
7749     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7750     if (Result.isInvalid())
7751       return StmtError();
7752     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7753     Exprs.push_back(Result.get());
7754   }
7755   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7756     return S;
7757 
7758   // Go through the clobbers.
7759   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7760     Clobbers.push_back(S->getClobberStringLiteral(I));
7761 
7762   // No need to transform the asm string literal.
7763   AsmString = S->getAsmString();
7764   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7765                                         S->isVolatile(), S->getNumOutputs(),
7766                                         S->getNumInputs(), Names.data(),
7767                                         Constraints, Exprs, AsmString.get(),
7768                                         Clobbers, S->getNumLabels(),
7769                                         S->getRParenLoc());
7770 }
7771 
7772 template<typename Derived>
7773 StmtResult
7774 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7775   ArrayRef<Token> AsmToks =
7776     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7777 
7778   bool HadError = false, HadChange = false;
7779 
7780   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7781   SmallVector<Expr*, 8> TransformedExprs;
7782   TransformedExprs.reserve(SrcExprs.size());
7783   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7784     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7785     if (!Result.isUsable()) {
7786       HadError = true;
7787     } else {
7788       HadChange |= (Result.get() != SrcExprs[i]);
7789       TransformedExprs.push_back(Result.get());
7790     }
7791   }
7792 
7793   if (HadError) return StmtError();
7794   if (!HadChange && !getDerived().AlwaysRebuild())
7795     return Owned(S);
7796 
7797   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7798                                        AsmToks, S->getAsmString(),
7799                                        S->getNumOutputs(), S->getNumInputs(),
7800                                        S->getAllConstraints(), S->getClobbers(),
7801                                        TransformedExprs, S->getEndLoc());
7802 }
7803 
7804 // C++ Coroutines TS
7805 
7806 template<typename Derived>
7807 StmtResult
7808 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7809   auto *ScopeInfo = SemaRef.getCurFunction();
7810   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7811   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7812          ScopeInfo->NeedsCoroutineSuspends &&
7813          ScopeInfo->CoroutineSuspends.first == nullptr &&
7814          ScopeInfo->CoroutineSuspends.second == nullptr &&
7815          "expected clean scope info");
7816 
7817   // Set that we have (possibly-invalid) suspend points before we do anything
7818   // that may fail.
7819   ScopeInfo->setNeedsCoroutineSuspends(false);
7820 
7821   // We re-build the coroutine promise object (and the coroutine parameters its
7822   // type and constructor depend on) based on the types used in our current
7823   // function. We must do so, and set it on the current FunctionScopeInfo,
7824   // before attempting to transform the other parts of the coroutine body
7825   // statement, such as the implicit suspend statements (because those
7826   // statements reference the FunctionScopeInfo::CoroutinePromise).
7827   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7828     return StmtError();
7829   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7830   if (!Promise)
7831     return StmtError();
7832   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7833   ScopeInfo->CoroutinePromise = Promise;
7834 
7835   // Transform the implicit coroutine statements constructed using dependent
7836   // types during the previous parse: initial and final suspensions, the return
7837   // object, and others. We also transform the coroutine function's body.
7838   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7839   if (InitSuspend.isInvalid())
7840     return StmtError();
7841   StmtResult FinalSuspend =
7842       getDerived().TransformStmt(S->getFinalSuspendStmt());
7843   if (FinalSuspend.isInvalid() ||
7844       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7845     return StmtError();
7846   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7847   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7848 
7849   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7850   if (BodyRes.isInvalid())
7851     return StmtError();
7852 
7853   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7854   if (Builder.isInvalid())
7855     return StmtError();
7856 
7857   Expr *ReturnObject = S->getReturnValueInit();
7858   assert(ReturnObject && "the return object is expected to be valid");
7859   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7860                                                      /*NoCopyInit*/ false);
7861   if (Res.isInvalid())
7862     return StmtError();
7863   Builder.ReturnValue = Res.get();
7864 
7865   // If during the previous parse the coroutine still had a dependent promise
7866   // statement, we may need to build some implicit coroutine statements
7867   // (such as exception and fallthrough handlers) for the first time.
7868   if (S->hasDependentPromiseType()) {
7869     // We can only build these statements, however, if the current promise type
7870     // is not dependent.
7871     if (!Promise->getType()->isDependentType()) {
7872       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7873              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7874              "these nodes should not have been built yet");
7875       if (!Builder.buildDependentStatements())
7876         return StmtError();
7877     }
7878   } else {
7879     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7880       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7881       if (Res.isInvalid())
7882         return StmtError();
7883       Builder.OnFallthrough = Res.get();
7884     }
7885 
7886     if (auto *OnException = S->getExceptionHandler()) {
7887       StmtResult Res = getDerived().TransformStmt(OnException);
7888       if (Res.isInvalid())
7889         return StmtError();
7890       Builder.OnException = Res.get();
7891     }
7892 
7893     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7894       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7895       if (Res.isInvalid())
7896         return StmtError();
7897       Builder.ReturnStmtOnAllocFailure = Res.get();
7898     }
7899 
7900     // Transform any additional statements we may have already built
7901     assert(S->getAllocate() && S->getDeallocate() &&
7902            "allocation and deallocation calls must already be built");
7903     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7904     if (AllocRes.isInvalid())
7905       return StmtError();
7906     Builder.Allocate = AllocRes.get();
7907 
7908     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7909     if (DeallocRes.isInvalid())
7910       return StmtError();
7911     Builder.Deallocate = DeallocRes.get();
7912 
7913     if (auto *ReturnStmt = S->getReturnStmt()) {
7914       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7915       if (Res.isInvalid())
7916         return StmtError();
7917       Builder.ReturnStmt = Res.get();
7918     }
7919   }
7920 
7921   return getDerived().RebuildCoroutineBodyStmt(Builder);
7922 }
7923 
7924 template<typename Derived>
7925 StmtResult
7926 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7927   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7928                                                         /*NotCopyInit*/false);
7929   if (Result.isInvalid())
7930     return StmtError();
7931 
7932   // Always rebuild; we don't know if this needs to be injected into a new
7933   // context or if the promise type has changed.
7934   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7935                                           S->isImplicit());
7936 }
7937 
7938 template<typename Derived>
7939 ExprResult
7940 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7941   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7942                                                         /*NotCopyInit*/false);
7943   if (Result.isInvalid())
7944     return ExprError();
7945 
7946   // Always rebuild; we don't know if this needs to be injected into a new
7947   // context or if the promise type has changed.
7948   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7949                                          E->isImplicit());
7950 }
7951 
7952 template <typename Derived>
7953 ExprResult
7954 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7955   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7956                                                         /*NotCopyInit*/ false);
7957   if (OperandResult.isInvalid())
7958     return ExprError();
7959 
7960   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7961           E->getOperatorCoawaitLookup());
7962 
7963   if (LookupResult.isInvalid())
7964     return ExprError();
7965 
7966   // Always rebuild; we don't know if this needs to be injected into a new
7967   // context or if the promise type has changed.
7968   return getDerived().RebuildDependentCoawaitExpr(
7969       E->getKeywordLoc(), OperandResult.get(),
7970       cast<UnresolvedLookupExpr>(LookupResult.get()));
7971 }
7972 
7973 template<typename Derived>
7974 ExprResult
7975 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7976   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7977                                                         /*NotCopyInit*/false);
7978   if (Result.isInvalid())
7979     return ExprError();
7980 
7981   // Always rebuild; we don't know if this needs to be injected into a new
7982   // context or if the promise type has changed.
7983   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7984 }
7985 
7986 // Objective-C Statements.
7987 
7988 template<typename Derived>
7989 StmtResult
7990 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7991   // Transform the body of the @try.
7992   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7993   if (TryBody.isInvalid())
7994     return StmtError();
7995 
7996   // Transform the @catch statements (if present).
7997   bool AnyCatchChanged = false;
7998   SmallVector<Stmt*, 8> CatchStmts;
7999   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8000     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8001     if (Catch.isInvalid())
8002       return StmtError();
8003     if (Catch.get() != S->getCatchStmt(I))
8004       AnyCatchChanged = true;
8005     CatchStmts.push_back(Catch.get());
8006   }
8007 
8008   // Transform the @finally statement (if present).
8009   StmtResult Finally;
8010   if (S->getFinallyStmt()) {
8011     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8012     if (Finally.isInvalid())
8013       return StmtError();
8014   }
8015 
8016   // If nothing changed, just retain this statement.
8017   if (!getDerived().AlwaysRebuild() &&
8018       TryBody.get() == S->getTryBody() &&
8019       !AnyCatchChanged &&
8020       Finally.get() == S->getFinallyStmt())
8021     return S;
8022 
8023   // Build a new statement.
8024   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8025                                            CatchStmts, Finally.get());
8026 }
8027 
8028 template<typename Derived>
8029 StmtResult
8030 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8031   // Transform the @catch parameter, if there is one.
8032   VarDecl *Var = nullptr;
8033   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8034     TypeSourceInfo *TSInfo = nullptr;
8035     if (FromVar->getTypeSourceInfo()) {
8036       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8037       if (!TSInfo)
8038         return StmtError();
8039     }
8040 
8041     QualType T;
8042     if (TSInfo)
8043       T = TSInfo->getType();
8044     else {
8045       T = getDerived().TransformType(FromVar->getType());
8046       if (T.isNull())
8047         return StmtError();
8048     }
8049 
8050     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8051     if (!Var)
8052       return StmtError();
8053   }
8054 
8055   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8056   if (Body.isInvalid())
8057     return StmtError();
8058 
8059   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8060                                              S->getRParenLoc(),
8061                                              Var, Body.get());
8062 }
8063 
8064 template<typename Derived>
8065 StmtResult
8066 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8067   // Transform the body.
8068   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8069   if (Body.isInvalid())
8070     return StmtError();
8071 
8072   // If nothing changed, just retain this statement.
8073   if (!getDerived().AlwaysRebuild() &&
8074       Body.get() == S->getFinallyBody())
8075     return S;
8076 
8077   // Build a new statement.
8078   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8079                                                Body.get());
8080 }
8081 
8082 template<typename Derived>
8083 StmtResult
8084 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8085   ExprResult Operand;
8086   if (S->getThrowExpr()) {
8087     Operand = getDerived().TransformExpr(S->getThrowExpr());
8088     if (Operand.isInvalid())
8089       return StmtError();
8090   }
8091 
8092   if (!getDerived().AlwaysRebuild() &&
8093       Operand.get() == S->getThrowExpr())
8094     return S;
8095 
8096   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8097 }
8098 
8099 template<typename Derived>
8100 StmtResult
8101 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8102                                                   ObjCAtSynchronizedStmt *S) {
8103   // Transform the object we are locking.
8104   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8105   if (Object.isInvalid())
8106     return StmtError();
8107   Object =
8108     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8109                                                   Object.get());
8110   if (Object.isInvalid())
8111     return StmtError();
8112 
8113   // Transform the body.
8114   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8115   if (Body.isInvalid())
8116     return StmtError();
8117 
8118   // If nothing change, just retain the current statement.
8119   if (!getDerived().AlwaysRebuild() &&
8120       Object.get() == S->getSynchExpr() &&
8121       Body.get() == S->getSynchBody())
8122     return S;
8123 
8124   // Build a new statement.
8125   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8126                                                     Object.get(), Body.get());
8127 }
8128 
8129 template<typename Derived>
8130 StmtResult
8131 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8132                                               ObjCAutoreleasePoolStmt *S) {
8133   // Transform the body.
8134   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8135   if (Body.isInvalid())
8136     return StmtError();
8137 
8138   // If nothing changed, just retain this statement.
8139   if (!getDerived().AlwaysRebuild() &&
8140       Body.get() == S->getSubStmt())
8141     return S;
8142 
8143   // Build a new statement.
8144   return getDerived().RebuildObjCAutoreleasePoolStmt(
8145                         S->getAtLoc(), Body.get());
8146 }
8147 
8148 template<typename Derived>
8149 StmtResult
8150 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8151                                                   ObjCForCollectionStmt *S) {
8152   // Transform the element statement.
8153   StmtResult Element =
8154       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8155   if (Element.isInvalid())
8156     return StmtError();
8157 
8158   // Transform the collection expression.
8159   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8160   if (Collection.isInvalid())
8161     return StmtError();
8162 
8163   // Transform the body.
8164   StmtResult Body = getDerived().TransformStmt(S->getBody());
8165   if (Body.isInvalid())
8166     return StmtError();
8167 
8168   // If nothing changed, just retain this statement.
8169   if (!getDerived().AlwaysRebuild() &&
8170       Element.get() == S->getElement() &&
8171       Collection.get() == S->getCollection() &&
8172       Body.get() == S->getBody())
8173     return S;
8174 
8175   // Build a new statement.
8176   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8177                                                    Element.get(),
8178                                                    Collection.get(),
8179                                                    S->getRParenLoc(),
8180                                                    Body.get());
8181 }
8182 
8183 template <typename Derived>
8184 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8185   // Transform the exception declaration, if any.
8186   VarDecl *Var = nullptr;
8187   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8188     TypeSourceInfo *T =
8189         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8190     if (!T)
8191       return StmtError();
8192 
8193     Var = getDerived().RebuildExceptionDecl(
8194         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8195         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8196     if (!Var || Var->isInvalidDecl())
8197       return StmtError();
8198   }
8199 
8200   // Transform the actual exception handler.
8201   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8202   if (Handler.isInvalid())
8203     return StmtError();
8204 
8205   if (!getDerived().AlwaysRebuild() && !Var &&
8206       Handler.get() == S->getHandlerBlock())
8207     return S;
8208 
8209   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8210 }
8211 
8212 template <typename Derived>
8213 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8214   // Transform the try block itself.
8215   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8216   if (TryBlock.isInvalid())
8217     return StmtError();
8218 
8219   // Transform the handlers.
8220   bool HandlerChanged = false;
8221   SmallVector<Stmt *, 8> Handlers;
8222   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8223     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8224     if (Handler.isInvalid())
8225       return StmtError();
8226 
8227     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8228     Handlers.push_back(Handler.getAs<Stmt>());
8229   }
8230 
8231   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8232       !HandlerChanged)
8233     return S;
8234 
8235   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8236                                         Handlers);
8237 }
8238 
8239 template<typename Derived>
8240 StmtResult
8241 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8242   StmtResult Init =
8243       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8244   if (Init.isInvalid())
8245     return StmtError();
8246 
8247   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8248   if (Range.isInvalid())
8249     return StmtError();
8250 
8251   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8252   if (Begin.isInvalid())
8253     return StmtError();
8254   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8255   if (End.isInvalid())
8256     return StmtError();
8257 
8258   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8259   if (Cond.isInvalid())
8260     return StmtError();
8261   if (Cond.get())
8262     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8263   if (Cond.isInvalid())
8264     return StmtError();
8265   if (Cond.get())
8266     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8267 
8268   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8269   if (Inc.isInvalid())
8270     return StmtError();
8271   if (Inc.get())
8272     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8273 
8274   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8275   if (LoopVar.isInvalid())
8276     return StmtError();
8277 
8278   StmtResult NewStmt = S;
8279   if (getDerived().AlwaysRebuild() ||
8280       Init.get() != S->getInit() ||
8281       Range.get() != S->getRangeStmt() ||
8282       Begin.get() != S->getBeginStmt() ||
8283       End.get() != S->getEndStmt() ||
8284       Cond.get() != S->getCond() ||
8285       Inc.get() != S->getInc() ||
8286       LoopVar.get() != S->getLoopVarStmt()) {
8287     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8288                                                   S->getCoawaitLoc(), Init.get(),
8289                                                   S->getColonLoc(), Range.get(),
8290                                                   Begin.get(), End.get(),
8291                                                   Cond.get(),
8292                                                   Inc.get(), LoopVar.get(),
8293                                                   S->getRParenLoc());
8294     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8295       // Might not have attached any initializer to the loop variable.
8296       getSema().ActOnInitializerError(
8297           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8298       return StmtError();
8299     }
8300   }
8301 
8302   StmtResult Body = getDerived().TransformStmt(S->getBody());
8303   if (Body.isInvalid())
8304     return StmtError();
8305 
8306   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8307   // it now so we have a new statement to attach the body to.
8308   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8309     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8310                                                   S->getCoawaitLoc(), Init.get(),
8311                                                   S->getColonLoc(), Range.get(),
8312                                                   Begin.get(), End.get(),
8313                                                   Cond.get(),
8314                                                   Inc.get(), LoopVar.get(),
8315                                                   S->getRParenLoc());
8316     if (NewStmt.isInvalid())
8317       return StmtError();
8318   }
8319 
8320   if (NewStmt.get() == S)
8321     return S;
8322 
8323   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8324 }
8325 
8326 template<typename Derived>
8327 StmtResult
8328 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8329                                                     MSDependentExistsStmt *S) {
8330   // Transform the nested-name-specifier, if any.
8331   NestedNameSpecifierLoc QualifierLoc;
8332   if (S->getQualifierLoc()) {
8333     QualifierLoc
8334       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8335     if (!QualifierLoc)
8336       return StmtError();
8337   }
8338 
8339   // Transform the declaration name.
8340   DeclarationNameInfo NameInfo = S->getNameInfo();
8341   if (NameInfo.getName()) {
8342     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8343     if (!NameInfo.getName())
8344       return StmtError();
8345   }
8346 
8347   // Check whether anything changed.
8348   if (!getDerived().AlwaysRebuild() &&
8349       QualifierLoc == S->getQualifierLoc() &&
8350       NameInfo.getName() == S->getNameInfo().getName())
8351     return S;
8352 
8353   // Determine whether this name exists, if we can.
8354   CXXScopeSpec SS;
8355   SS.Adopt(QualifierLoc);
8356   bool Dependent = false;
8357   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8358   case Sema::IER_Exists:
8359     if (S->isIfExists())
8360       break;
8361 
8362     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8363 
8364   case Sema::IER_DoesNotExist:
8365     if (S->isIfNotExists())
8366       break;
8367 
8368     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8369 
8370   case Sema::IER_Dependent:
8371     Dependent = true;
8372     break;
8373 
8374   case Sema::IER_Error:
8375     return StmtError();
8376   }
8377 
8378   // We need to continue with the instantiation, so do so now.
8379   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8380   if (SubStmt.isInvalid())
8381     return StmtError();
8382 
8383   // If we have resolved the name, just transform to the substatement.
8384   if (!Dependent)
8385     return SubStmt;
8386 
8387   // The name is still dependent, so build a dependent expression again.
8388   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8389                                                    S->isIfExists(),
8390                                                    QualifierLoc,
8391                                                    NameInfo,
8392                                                    SubStmt.get());
8393 }
8394 
8395 template<typename Derived>
8396 ExprResult
8397 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8398   NestedNameSpecifierLoc QualifierLoc;
8399   if (E->getQualifierLoc()) {
8400     QualifierLoc
8401     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8402     if (!QualifierLoc)
8403       return ExprError();
8404   }
8405 
8406   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8407     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8408   if (!PD)
8409     return ExprError();
8410 
8411   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8412   if (Base.isInvalid())
8413     return ExprError();
8414 
8415   return new (SemaRef.getASTContext())
8416       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8417                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8418                         QualifierLoc, E->getMemberLoc());
8419 }
8420 
8421 template <typename Derived>
8422 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8423     MSPropertySubscriptExpr *E) {
8424   auto BaseRes = getDerived().TransformExpr(E->getBase());
8425   if (BaseRes.isInvalid())
8426     return ExprError();
8427   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8428   if (IdxRes.isInvalid())
8429     return ExprError();
8430 
8431   if (!getDerived().AlwaysRebuild() &&
8432       BaseRes.get() == E->getBase() &&
8433       IdxRes.get() == E->getIdx())
8434     return E;
8435 
8436   return getDerived().RebuildArraySubscriptExpr(
8437       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8438 }
8439 
8440 template <typename Derived>
8441 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8442   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8443   if (TryBlock.isInvalid())
8444     return StmtError();
8445 
8446   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8447   if (Handler.isInvalid())
8448     return StmtError();
8449 
8450   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8451       Handler.get() == S->getHandler())
8452     return S;
8453 
8454   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8455                                         TryBlock.get(), Handler.get());
8456 }
8457 
8458 template <typename Derived>
8459 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8460   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8461   if (Block.isInvalid())
8462     return StmtError();
8463 
8464   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8465 }
8466 
8467 template <typename Derived>
8468 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8469   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8470   if (FilterExpr.isInvalid())
8471     return StmtError();
8472 
8473   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8474   if (Block.isInvalid())
8475     return StmtError();
8476 
8477   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8478                                            Block.get());
8479 }
8480 
8481 template <typename Derived>
8482 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8483   if (isa<SEHFinallyStmt>(Handler))
8484     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8485   else
8486     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8487 }
8488 
8489 template<typename Derived>
8490 StmtResult
8491 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8492   return S;
8493 }
8494 
8495 //===----------------------------------------------------------------------===//
8496 // OpenMP directive transformation
8497 //===----------------------------------------------------------------------===//
8498 
8499 template <typename Derived>
8500 StmtResult
8501 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8502   // OMPCanonicalLoops are eliminated during transformation, since they will be
8503   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8504   // after transformation.
8505   return getDerived().TransformStmt(L->getLoopStmt());
8506 }
8507 
8508 template <typename Derived>
8509 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8510     OMPExecutableDirective *D) {
8511 
8512   // Transform the clauses
8513   llvm::SmallVector<OMPClause *, 16> TClauses;
8514   ArrayRef<OMPClause *> Clauses = D->clauses();
8515   TClauses.reserve(Clauses.size());
8516   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8517        I != E; ++I) {
8518     if (*I) {
8519       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8520       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8521       getDerived().getSema().EndOpenMPClause();
8522       if (Clause)
8523         TClauses.push_back(Clause);
8524     } else {
8525       TClauses.push_back(nullptr);
8526     }
8527   }
8528   StmtResult AssociatedStmt;
8529   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8530     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8531                                                   /*CurScope=*/nullptr);
8532     StmtResult Body;
8533     {
8534       Sema::CompoundScopeRAII CompoundScope(getSema());
8535       Stmt *CS;
8536       if (D->getDirectiveKind() == OMPD_atomic ||
8537           D->getDirectiveKind() == OMPD_critical ||
8538           D->getDirectiveKind() == OMPD_section ||
8539           D->getDirectiveKind() == OMPD_master)
8540         CS = D->getAssociatedStmt();
8541       else
8542         CS = D->getRawStmt();
8543       Body = getDerived().TransformStmt(CS);
8544       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8545           getSema().getLangOpts().OpenMPIRBuilder)
8546         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8547     }
8548     AssociatedStmt =
8549         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8550     if (AssociatedStmt.isInvalid()) {
8551       return StmtError();
8552     }
8553   }
8554   if (TClauses.size() != Clauses.size()) {
8555     return StmtError();
8556   }
8557 
8558   // Transform directive name for 'omp critical' directive.
8559   DeclarationNameInfo DirName;
8560   if (D->getDirectiveKind() == OMPD_critical) {
8561     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8562     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8563   }
8564   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8565   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8566     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8567   } else if (D->getDirectiveKind() == OMPD_cancel) {
8568     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8569   }
8570 
8571   return getDerived().RebuildOMPExecutableDirective(
8572       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8573       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8574 }
8575 
8576 template <typename Derived>
8577 StmtResult
8578 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8579   // TODO: Fix This
8580   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8581       << getOpenMPDirectiveName(D->getDirectiveKind());
8582   return StmtError();
8583 }
8584 
8585 template <typename Derived>
8586 StmtResult
8587 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8588   DeclarationNameInfo DirName;
8589   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8590                                              D->getBeginLoc());
8591   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8592   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8593   return Res;
8594 }
8595 
8596 template <typename Derived>
8597 StmtResult
8598 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8599   DeclarationNameInfo DirName;
8600   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8601                                              D->getBeginLoc());
8602   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8603   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8604   return Res;
8605 }
8606 
8607 template <typename Derived>
8608 StmtResult
8609 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8610   DeclarationNameInfo DirName;
8611   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8612                                              nullptr, D->getBeginLoc());
8613   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8614   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8615   return Res;
8616 }
8617 
8618 template <typename Derived>
8619 StmtResult
8620 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8621   DeclarationNameInfo DirName;
8622   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8623                                              nullptr, D->getBeginLoc());
8624   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8625   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8626   return Res;
8627 }
8628 
8629 template <typename Derived>
8630 StmtResult
8631 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8632   DeclarationNameInfo DirName;
8633   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8634                                              D->getBeginLoc());
8635   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8636   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8637   return Res;
8638 }
8639 
8640 template <typename Derived>
8641 StmtResult
8642 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8643   DeclarationNameInfo DirName;
8644   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8645                                              D->getBeginLoc());
8646   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8647   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8648   return Res;
8649 }
8650 
8651 template <typename Derived>
8652 StmtResult
8653 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8654   DeclarationNameInfo DirName;
8655   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8656                                              D->getBeginLoc());
8657   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8658   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8659   return Res;
8660 }
8661 
8662 template <typename Derived>
8663 StmtResult
8664 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8665   DeclarationNameInfo DirName;
8666   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8667                                              D->getBeginLoc());
8668   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8669   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8670   return Res;
8671 }
8672 
8673 template <typename Derived>
8674 StmtResult
8675 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8676   DeclarationNameInfo DirName;
8677   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8678                                              D->getBeginLoc());
8679   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8680   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8681   return Res;
8682 }
8683 
8684 template <typename Derived>
8685 StmtResult
8686 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8687   DeclarationNameInfo DirName;
8688   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8689                                              D->getBeginLoc());
8690   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8691   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8692   return Res;
8693 }
8694 
8695 template <typename Derived>
8696 StmtResult
8697 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8698   getDerived().getSema().StartOpenMPDSABlock(
8699       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8700   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8701   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8702   return Res;
8703 }
8704 
8705 template <typename Derived>
8706 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8707     OMPParallelForDirective *D) {
8708   DeclarationNameInfo DirName;
8709   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8710                                              nullptr, D->getBeginLoc());
8711   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8712   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8713   return Res;
8714 }
8715 
8716 template <typename Derived>
8717 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8718     OMPParallelForSimdDirective *D) {
8719   DeclarationNameInfo DirName;
8720   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8721                                              nullptr, D->getBeginLoc());
8722   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8723   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8724   return Res;
8725 }
8726 
8727 template <typename Derived>
8728 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8729     OMPParallelMasterDirective *D) {
8730   DeclarationNameInfo DirName;
8731   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8732                                              nullptr, D->getBeginLoc());
8733   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8734   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8735   return Res;
8736 }
8737 
8738 template <typename Derived>
8739 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8740     OMPParallelSectionsDirective *D) {
8741   DeclarationNameInfo DirName;
8742   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8743                                              nullptr, D->getBeginLoc());
8744   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8745   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8746   return Res;
8747 }
8748 
8749 template <typename Derived>
8750 StmtResult
8751 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8752   DeclarationNameInfo DirName;
8753   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8754                                              D->getBeginLoc());
8755   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8756   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8757   return Res;
8758 }
8759 
8760 template <typename Derived>
8761 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8762     OMPTaskyieldDirective *D) {
8763   DeclarationNameInfo DirName;
8764   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8765                                              D->getBeginLoc());
8766   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8767   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8768   return Res;
8769 }
8770 
8771 template <typename Derived>
8772 StmtResult
8773 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8774   DeclarationNameInfo DirName;
8775   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8776                                              D->getBeginLoc());
8777   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8778   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8779   return Res;
8780 }
8781 
8782 template <typename Derived>
8783 StmtResult
8784 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8785   DeclarationNameInfo DirName;
8786   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8787                                              D->getBeginLoc());
8788   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8789   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8790   return Res;
8791 }
8792 
8793 template <typename Derived>
8794 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8795     OMPTaskgroupDirective *D) {
8796   DeclarationNameInfo DirName;
8797   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8798                                              D->getBeginLoc());
8799   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8800   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8801   return Res;
8802 }
8803 
8804 template <typename Derived>
8805 StmtResult
8806 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8807   DeclarationNameInfo DirName;
8808   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8809                                              D->getBeginLoc());
8810   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8811   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8812   return Res;
8813 }
8814 
8815 template <typename Derived>
8816 StmtResult
8817 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8818   DeclarationNameInfo DirName;
8819   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8820                                              D->getBeginLoc());
8821   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8822   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8823   return Res;
8824 }
8825 
8826 template <typename Derived>
8827 StmtResult
8828 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8829   DeclarationNameInfo DirName;
8830   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8831                                              D->getBeginLoc());
8832   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8833   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8834   return Res;
8835 }
8836 
8837 template <typename Derived>
8838 StmtResult
8839 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8840   DeclarationNameInfo DirName;
8841   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8842                                              D->getBeginLoc());
8843   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8844   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8845   return Res;
8846 }
8847 
8848 template <typename Derived>
8849 StmtResult
8850 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8851   DeclarationNameInfo DirName;
8852   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8853                                              D->getBeginLoc());
8854   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8855   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8856   return Res;
8857 }
8858 
8859 template <typename Derived>
8860 StmtResult
8861 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8862   DeclarationNameInfo DirName;
8863   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8864                                              D->getBeginLoc());
8865   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8866   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8867   return Res;
8868 }
8869 
8870 template <typename Derived>
8871 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8872     OMPTargetDataDirective *D) {
8873   DeclarationNameInfo DirName;
8874   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8875                                              D->getBeginLoc());
8876   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8877   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8878   return Res;
8879 }
8880 
8881 template <typename Derived>
8882 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8883     OMPTargetEnterDataDirective *D) {
8884   DeclarationNameInfo DirName;
8885   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8886                                              nullptr, D->getBeginLoc());
8887   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8888   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8889   return Res;
8890 }
8891 
8892 template <typename Derived>
8893 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8894     OMPTargetExitDataDirective *D) {
8895   DeclarationNameInfo DirName;
8896   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8897                                              nullptr, D->getBeginLoc());
8898   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8899   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8900   return Res;
8901 }
8902 
8903 template <typename Derived>
8904 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8905     OMPTargetParallelDirective *D) {
8906   DeclarationNameInfo DirName;
8907   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8908                                              nullptr, D->getBeginLoc());
8909   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8910   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8911   return Res;
8912 }
8913 
8914 template <typename Derived>
8915 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8916     OMPTargetParallelForDirective *D) {
8917   DeclarationNameInfo DirName;
8918   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8919                                              nullptr, D->getBeginLoc());
8920   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8921   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8922   return Res;
8923 }
8924 
8925 template <typename Derived>
8926 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8927     OMPTargetUpdateDirective *D) {
8928   DeclarationNameInfo DirName;
8929   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8930                                              nullptr, D->getBeginLoc());
8931   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8932   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8933   return Res;
8934 }
8935 
8936 template <typename Derived>
8937 StmtResult
8938 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8939   DeclarationNameInfo DirName;
8940   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8941                                              D->getBeginLoc());
8942   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8943   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8944   return Res;
8945 }
8946 
8947 template <typename Derived>
8948 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8949     OMPCancellationPointDirective *D) {
8950   DeclarationNameInfo DirName;
8951   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8952                                              nullptr, D->getBeginLoc());
8953   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8954   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8955   return Res;
8956 }
8957 
8958 template <typename Derived>
8959 StmtResult
8960 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8961   DeclarationNameInfo DirName;
8962   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8963                                              D->getBeginLoc());
8964   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8965   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8966   return Res;
8967 }
8968 
8969 template <typename Derived>
8970 StmtResult
8971 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8972   DeclarationNameInfo DirName;
8973   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8974                                              D->getBeginLoc());
8975   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8976   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8977   return Res;
8978 }
8979 
8980 template <typename Derived>
8981 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8982     OMPTaskLoopSimdDirective *D) {
8983   DeclarationNameInfo DirName;
8984   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8985                                              nullptr, D->getBeginLoc());
8986   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8987   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8988   return Res;
8989 }
8990 
8991 template <typename Derived>
8992 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8993     OMPMasterTaskLoopDirective *D) {
8994   DeclarationNameInfo DirName;
8995   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8996                                              nullptr, D->getBeginLoc());
8997   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8998   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8999   return Res;
9000 }
9001 
9002 template <typename Derived>
9003 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9004     OMPMasterTaskLoopSimdDirective *D) {
9005   DeclarationNameInfo DirName;
9006   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9007                                              nullptr, D->getBeginLoc());
9008   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9009   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9010   return Res;
9011 }
9012 
9013 template <typename Derived>
9014 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9015     OMPParallelMasterTaskLoopDirective *D) {
9016   DeclarationNameInfo DirName;
9017   getDerived().getSema().StartOpenMPDSABlock(
9018       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9019   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9020   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9021   return Res;
9022 }
9023 
9024 template <typename Derived>
9025 StmtResult
9026 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9027     OMPParallelMasterTaskLoopSimdDirective *D) {
9028   DeclarationNameInfo DirName;
9029   getDerived().getSema().StartOpenMPDSABlock(
9030       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9031   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9032   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9033   return Res;
9034 }
9035 
9036 template <typename Derived>
9037 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9038     OMPDistributeDirective *D) {
9039   DeclarationNameInfo DirName;
9040   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9041                                              D->getBeginLoc());
9042   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9043   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9044   return Res;
9045 }
9046 
9047 template <typename Derived>
9048 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9049     OMPDistributeParallelForDirective *D) {
9050   DeclarationNameInfo DirName;
9051   getDerived().getSema().StartOpenMPDSABlock(
9052       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9053   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9054   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9055   return Res;
9056 }
9057 
9058 template <typename Derived>
9059 StmtResult
9060 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9061     OMPDistributeParallelForSimdDirective *D) {
9062   DeclarationNameInfo DirName;
9063   getDerived().getSema().StartOpenMPDSABlock(
9064       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9065   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9066   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9067   return Res;
9068 }
9069 
9070 template <typename Derived>
9071 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9072     OMPDistributeSimdDirective *D) {
9073   DeclarationNameInfo DirName;
9074   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9075                                              nullptr, D->getBeginLoc());
9076   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9077   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9078   return Res;
9079 }
9080 
9081 template <typename Derived>
9082 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9083     OMPTargetParallelForSimdDirective *D) {
9084   DeclarationNameInfo DirName;
9085   getDerived().getSema().StartOpenMPDSABlock(
9086       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9087   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9088   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9089   return Res;
9090 }
9091 
9092 template <typename Derived>
9093 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9094     OMPTargetSimdDirective *D) {
9095   DeclarationNameInfo DirName;
9096   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9097                                              D->getBeginLoc());
9098   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9099   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9100   return Res;
9101 }
9102 
9103 template <typename Derived>
9104 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9105     OMPTeamsDistributeDirective *D) {
9106   DeclarationNameInfo DirName;
9107   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9108                                              nullptr, D->getBeginLoc());
9109   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9110   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9111   return Res;
9112 }
9113 
9114 template <typename Derived>
9115 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9116     OMPTeamsDistributeSimdDirective *D) {
9117   DeclarationNameInfo DirName;
9118   getDerived().getSema().StartOpenMPDSABlock(
9119       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9120   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9121   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9122   return Res;
9123 }
9124 
9125 template <typename Derived>
9126 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9127     OMPTeamsDistributeParallelForSimdDirective *D) {
9128   DeclarationNameInfo DirName;
9129   getDerived().getSema().StartOpenMPDSABlock(
9130       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9131       D->getBeginLoc());
9132   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9133   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9134   return Res;
9135 }
9136 
9137 template <typename Derived>
9138 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9139     OMPTeamsDistributeParallelForDirective *D) {
9140   DeclarationNameInfo DirName;
9141   getDerived().getSema().StartOpenMPDSABlock(
9142       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9143   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9144   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9145   return Res;
9146 }
9147 
9148 template <typename Derived>
9149 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9150     OMPTargetTeamsDirective *D) {
9151   DeclarationNameInfo DirName;
9152   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9153                                              nullptr, D->getBeginLoc());
9154   auto Res = getDerived().TransformOMPExecutableDirective(D);
9155   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9156   return Res;
9157 }
9158 
9159 template <typename Derived>
9160 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9161     OMPTargetTeamsDistributeDirective *D) {
9162   DeclarationNameInfo DirName;
9163   getDerived().getSema().StartOpenMPDSABlock(
9164       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9165   auto Res = getDerived().TransformOMPExecutableDirective(D);
9166   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9167   return Res;
9168 }
9169 
9170 template <typename Derived>
9171 StmtResult
9172 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9173     OMPTargetTeamsDistributeParallelForDirective *D) {
9174   DeclarationNameInfo DirName;
9175   getDerived().getSema().StartOpenMPDSABlock(
9176       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9177       D->getBeginLoc());
9178   auto Res = getDerived().TransformOMPExecutableDirective(D);
9179   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9180   return Res;
9181 }
9182 
9183 template <typename Derived>
9184 StmtResult TreeTransform<Derived>::
9185     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9186         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9187   DeclarationNameInfo DirName;
9188   getDerived().getSema().StartOpenMPDSABlock(
9189       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9190       D->getBeginLoc());
9191   auto Res = getDerived().TransformOMPExecutableDirective(D);
9192   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9193   return Res;
9194 }
9195 
9196 template <typename Derived>
9197 StmtResult
9198 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9199     OMPTargetTeamsDistributeSimdDirective *D) {
9200   DeclarationNameInfo DirName;
9201   getDerived().getSema().StartOpenMPDSABlock(
9202       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9203   auto Res = getDerived().TransformOMPExecutableDirective(D);
9204   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9205   return Res;
9206 }
9207 
9208 template <typename Derived>
9209 StmtResult
9210 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9211   DeclarationNameInfo DirName;
9212   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9213                                              D->getBeginLoc());
9214   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9215   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9216   return Res;
9217 }
9218 
9219 template <typename Derived>
9220 StmtResult
9221 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9222   DeclarationNameInfo DirName;
9223   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9224                                              D->getBeginLoc());
9225   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9226   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9227   return Res;
9228 }
9229 
9230 template <typename Derived>
9231 StmtResult
9232 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9233   DeclarationNameInfo DirName;
9234   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9235                                              D->getBeginLoc());
9236   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9237   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9238   return Res;
9239 }
9240 
9241 template <typename Derived>
9242 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9243     OMPGenericLoopDirective *D) {
9244   DeclarationNameInfo DirName;
9245   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9246                                              D->getBeginLoc());
9247   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9248   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9249   return Res;
9250 }
9251 
9252 template <typename Derived>
9253 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
9254     OMPTeamsGenericLoopDirective *D) {
9255   DeclarationNameInfo DirName;
9256   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr,
9257                                              D->getBeginLoc());
9258   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9259   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9260   return Res;
9261 }
9262 
9263 //===----------------------------------------------------------------------===//
9264 // OpenMP clause transformation
9265 //===----------------------------------------------------------------------===//
9266 template <typename Derived>
9267 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9268   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9269   if (Cond.isInvalid())
9270     return nullptr;
9271   return getDerived().RebuildOMPIfClause(
9272       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9273       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9274 }
9275 
9276 template <typename Derived>
9277 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9278   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9279   if (Cond.isInvalid())
9280     return nullptr;
9281   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9282                                             C->getLParenLoc(), C->getEndLoc());
9283 }
9284 
9285 template <typename Derived>
9286 OMPClause *
9287 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9288   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9289   if (NumThreads.isInvalid())
9290     return nullptr;
9291   return getDerived().RebuildOMPNumThreadsClause(
9292       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9293 }
9294 
9295 template <typename Derived>
9296 OMPClause *
9297 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9298   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9299   if (E.isInvalid())
9300     return nullptr;
9301   return getDerived().RebuildOMPSafelenClause(
9302       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9303 }
9304 
9305 template <typename Derived>
9306 OMPClause *
9307 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9308   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9309   if (E.isInvalid())
9310     return nullptr;
9311   return getDerived().RebuildOMPAllocatorClause(
9312       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9313 }
9314 
9315 template <typename Derived>
9316 OMPClause *
9317 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9318   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9319   if (E.isInvalid())
9320     return nullptr;
9321   return getDerived().RebuildOMPSimdlenClause(
9322       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9323 }
9324 
9325 template <typename Derived>
9326 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9327   SmallVector<Expr *, 4> TransformedSizes;
9328   TransformedSizes.reserve(C->getNumSizes());
9329   bool Changed = false;
9330   for (Expr *E : C->getSizesRefs()) {
9331     if (!E) {
9332       TransformedSizes.push_back(nullptr);
9333       continue;
9334     }
9335 
9336     ExprResult T = getDerived().TransformExpr(E);
9337     if (T.isInvalid())
9338       return nullptr;
9339     if (E != T.get())
9340       Changed = true;
9341     TransformedSizes.push_back(T.get());
9342   }
9343 
9344   if (!Changed && !getDerived().AlwaysRebuild())
9345     return C;
9346   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9347                                C->getLParenLoc(), C->getEndLoc());
9348 }
9349 
9350 template <typename Derived>
9351 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9352   if (!getDerived().AlwaysRebuild())
9353     return C;
9354   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9355 }
9356 
9357 template <typename Derived>
9358 OMPClause *
9359 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9360   ExprResult T = getDerived().TransformExpr(C->getFactor());
9361   if (T.isInvalid())
9362     return nullptr;
9363   Expr *Factor = T.get();
9364   bool Changed = Factor != C->getFactor();
9365 
9366   if (!Changed && !getDerived().AlwaysRebuild())
9367     return C;
9368   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9369                                  C->getEndLoc());
9370 }
9371 
9372 template <typename Derived>
9373 OMPClause *
9374 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9375   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9376   if (E.isInvalid())
9377     return nullptr;
9378   return getDerived().RebuildOMPCollapseClause(
9379       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9380 }
9381 
9382 template <typename Derived>
9383 OMPClause *
9384 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9385   return getDerived().RebuildOMPDefaultClause(
9386       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9387       C->getLParenLoc(), C->getEndLoc());
9388 }
9389 
9390 template <typename Derived>
9391 OMPClause *
9392 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9393   return getDerived().RebuildOMPProcBindClause(
9394       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9395       C->getLParenLoc(), C->getEndLoc());
9396 }
9397 
9398 template <typename Derived>
9399 OMPClause *
9400 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9401   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9402   if (E.isInvalid())
9403     return nullptr;
9404   return getDerived().RebuildOMPScheduleClause(
9405       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9406       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9407       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9408       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9409 }
9410 
9411 template <typename Derived>
9412 OMPClause *
9413 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9414   ExprResult E;
9415   if (auto *Num = C->getNumForLoops()) {
9416     E = getDerived().TransformExpr(Num);
9417     if (E.isInvalid())
9418       return nullptr;
9419   }
9420   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9421                                               C->getLParenLoc(), E.get());
9422 }
9423 
9424 template <typename Derived>
9425 OMPClause *
9426 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9427   ExprResult E;
9428   if (Expr *Evt = C->getEventHandler()) {
9429     E = getDerived().TransformExpr(Evt);
9430     if (E.isInvalid())
9431       return nullptr;
9432   }
9433   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9434                                              C->getLParenLoc(), C->getEndLoc());
9435 }
9436 
9437 template <typename Derived>
9438 OMPClause *
9439 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9440   // No need to rebuild this clause, no template-dependent parameters.
9441   return C;
9442 }
9443 
9444 template <typename Derived>
9445 OMPClause *
9446 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9447   // No need to rebuild this clause, no template-dependent parameters.
9448   return C;
9449 }
9450 
9451 template <typename Derived>
9452 OMPClause *
9453 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9454   // No need to rebuild this clause, no template-dependent parameters.
9455   return C;
9456 }
9457 
9458 template <typename Derived>
9459 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9460   // No need to rebuild this clause, no template-dependent parameters.
9461   return C;
9462 }
9463 
9464 template <typename Derived>
9465 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9466   // No need to rebuild this clause, no template-dependent parameters.
9467   return C;
9468 }
9469 
9470 template <typename Derived>
9471 OMPClause *
9472 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9473   // No need to rebuild this clause, no template-dependent parameters.
9474   return C;
9475 }
9476 
9477 template <typename Derived>
9478 OMPClause *
9479 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9480   // No need to rebuild this clause, no template-dependent parameters.
9481   return C;
9482 }
9483 
9484 template <typename Derived>
9485 OMPClause *
9486 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9487   // No need to rebuild this clause, no template-dependent parameters.
9488   return C;
9489 }
9490 
9491 template <typename Derived>
9492 OMPClause *
9493 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9494   // No need to rebuild this clause, no template-dependent parameters.
9495   return C;
9496 }
9497 
9498 template <typename Derived>
9499 OMPClause *
9500 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9501   // No need to rebuild this clause, no template-dependent parameters.
9502   return C;
9503 }
9504 
9505 template <typename Derived>
9506 OMPClause *
9507 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9508   // No need to rebuild this clause, no template-dependent parameters.
9509   return C;
9510 }
9511 
9512 template <typename Derived>
9513 OMPClause *
9514 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9515   // No need to rebuild this clause, no template-dependent parameters.
9516   return C;
9517 }
9518 
9519 template <typename Derived>
9520 OMPClause *
9521 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9522   // No need to rebuild this clause, no template-dependent parameters.
9523   return C;
9524 }
9525 
9526 template <typename Derived>
9527 OMPClause *
9528 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9529   // No need to rebuild this clause, no template-dependent parameters.
9530   return C;
9531 }
9532 
9533 template <typename Derived>
9534 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9535   // No need to rebuild this clause, no template-dependent parameters.
9536   return C;
9537 }
9538 
9539 template <typename Derived>
9540 OMPClause *
9541 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9542   // No need to rebuild this clause, no template-dependent parameters.
9543   return C;
9544 }
9545 
9546 template <typename Derived>
9547 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9548   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9549   if (IVR.isInvalid())
9550     return nullptr;
9551 
9552   llvm::SmallVector<Expr *, 8> PrefExprs;
9553   PrefExprs.reserve(C->varlist_size() - 1);
9554   for (Expr *E : llvm::drop_begin(C->varlists())) {
9555     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9556     if (ER.isInvalid())
9557       return nullptr;
9558     PrefExprs.push_back(ER.get());
9559   }
9560   return getDerived().RebuildOMPInitClause(
9561       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9562       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9563 }
9564 
9565 template <typename Derived>
9566 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9567   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9568   if (ER.isInvalid())
9569     return nullptr;
9570   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9571                                           C->getLParenLoc(), C->getVarLoc(),
9572                                           C->getEndLoc());
9573 }
9574 
9575 template <typename Derived>
9576 OMPClause *
9577 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9578   ExprResult ER;
9579   if (Expr *IV = C->getInteropVar()) {
9580     ER = getDerived().TransformExpr(IV);
9581     if (ER.isInvalid())
9582       return nullptr;
9583   }
9584   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9585                                               C->getLParenLoc(), C->getVarLoc(),
9586                                               C->getEndLoc());
9587 }
9588 
9589 template <typename Derived>
9590 OMPClause *
9591 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9592   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9593   if (Cond.isInvalid())
9594     return nullptr;
9595   return getDerived().RebuildOMPNovariantsClause(
9596       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9597 }
9598 
9599 template <typename Derived>
9600 OMPClause *
9601 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9602   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9603   if (Cond.isInvalid())
9604     return nullptr;
9605   return getDerived().RebuildOMPNocontextClause(
9606       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9607 }
9608 
9609 template <typename Derived>
9610 OMPClause *
9611 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9612   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9613   if (ThreadID.isInvalid())
9614     return nullptr;
9615   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9616                                              C->getLParenLoc(), C->getEndLoc());
9617 }
9618 
9619 template <typename Derived>
9620 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9621   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9622   if (E.isInvalid())
9623     return nullptr;
9624   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9625                                             C->getLParenLoc(), C->getEndLoc());
9626 }
9627 
9628 template <typename Derived>
9629 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9630     OMPUnifiedAddressClause *C) {
9631   llvm_unreachable("unified_address clause cannot appear in dependent context");
9632 }
9633 
9634 template <typename Derived>
9635 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9636     OMPUnifiedSharedMemoryClause *C) {
9637   llvm_unreachable(
9638       "unified_shared_memory clause cannot appear in dependent context");
9639 }
9640 
9641 template <typename Derived>
9642 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9643     OMPReverseOffloadClause *C) {
9644   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9645 }
9646 
9647 template <typename Derived>
9648 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9649     OMPDynamicAllocatorsClause *C) {
9650   llvm_unreachable(
9651       "dynamic_allocators clause cannot appear in dependent context");
9652 }
9653 
9654 template <typename Derived>
9655 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9656     OMPAtomicDefaultMemOrderClause *C) {
9657   llvm_unreachable(
9658       "atomic_default_mem_order clause cannot appear in dependent context");
9659 }
9660 
9661 template <typename Derived>
9662 OMPClause *
9663 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9664   llvm::SmallVector<Expr *, 16> Vars;
9665   Vars.reserve(C->varlist_size());
9666   for (auto *VE : C->varlists()) {
9667     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9668     if (EVar.isInvalid())
9669       return nullptr;
9670     Vars.push_back(EVar.get());
9671   }
9672   return getDerived().RebuildOMPPrivateClause(
9673       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9674 }
9675 
9676 template <typename Derived>
9677 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9678     OMPFirstprivateClause *C) {
9679   llvm::SmallVector<Expr *, 16> Vars;
9680   Vars.reserve(C->varlist_size());
9681   for (auto *VE : C->varlists()) {
9682     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9683     if (EVar.isInvalid())
9684       return nullptr;
9685     Vars.push_back(EVar.get());
9686   }
9687   return getDerived().RebuildOMPFirstprivateClause(
9688       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9689 }
9690 
9691 template <typename Derived>
9692 OMPClause *
9693 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9694   llvm::SmallVector<Expr *, 16> Vars;
9695   Vars.reserve(C->varlist_size());
9696   for (auto *VE : C->varlists()) {
9697     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9698     if (EVar.isInvalid())
9699       return nullptr;
9700     Vars.push_back(EVar.get());
9701   }
9702   return getDerived().RebuildOMPLastprivateClause(
9703       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9704       C->getLParenLoc(), C->getEndLoc());
9705 }
9706 
9707 template <typename Derived>
9708 OMPClause *
9709 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9710   llvm::SmallVector<Expr *, 16> Vars;
9711   Vars.reserve(C->varlist_size());
9712   for (auto *VE : C->varlists()) {
9713     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9714     if (EVar.isInvalid())
9715       return nullptr;
9716     Vars.push_back(EVar.get());
9717   }
9718   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9719                                              C->getLParenLoc(), C->getEndLoc());
9720 }
9721 
9722 template <typename Derived>
9723 OMPClause *
9724 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9725   llvm::SmallVector<Expr *, 16> Vars;
9726   Vars.reserve(C->varlist_size());
9727   for (auto *VE : C->varlists()) {
9728     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9729     if (EVar.isInvalid())
9730       return nullptr;
9731     Vars.push_back(EVar.get());
9732   }
9733   CXXScopeSpec ReductionIdScopeSpec;
9734   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9735 
9736   DeclarationNameInfo NameInfo = C->getNameInfo();
9737   if (NameInfo.getName()) {
9738     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9739     if (!NameInfo.getName())
9740       return nullptr;
9741   }
9742   // Build a list of all UDR decls with the same names ranged by the Scopes.
9743   // The Scope boundary is a duplication of the previous decl.
9744   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9745   for (auto *E : C->reduction_ops()) {
9746     // Transform all the decls.
9747     if (E) {
9748       auto *ULE = cast<UnresolvedLookupExpr>(E);
9749       UnresolvedSet<8> Decls;
9750       for (auto *D : ULE->decls()) {
9751         NamedDecl *InstD =
9752             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9753         Decls.addDecl(InstD, InstD->getAccess());
9754       }
9755       UnresolvedReductions.push_back(
9756        UnresolvedLookupExpr::Create(
9757           SemaRef.Context, /*NamingClass=*/nullptr,
9758           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9759           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9760           Decls.begin(), Decls.end()));
9761     } else
9762       UnresolvedReductions.push_back(nullptr);
9763   }
9764   return getDerived().RebuildOMPReductionClause(
9765       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9766       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9767       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9768 }
9769 
9770 template <typename Derived>
9771 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9772     OMPTaskReductionClause *C) {
9773   llvm::SmallVector<Expr *, 16> Vars;
9774   Vars.reserve(C->varlist_size());
9775   for (auto *VE : C->varlists()) {
9776     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9777     if (EVar.isInvalid())
9778       return nullptr;
9779     Vars.push_back(EVar.get());
9780   }
9781   CXXScopeSpec ReductionIdScopeSpec;
9782   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9783 
9784   DeclarationNameInfo NameInfo = C->getNameInfo();
9785   if (NameInfo.getName()) {
9786     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9787     if (!NameInfo.getName())
9788       return nullptr;
9789   }
9790   // Build a list of all UDR decls with the same names ranged by the Scopes.
9791   // The Scope boundary is a duplication of the previous decl.
9792   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9793   for (auto *E : C->reduction_ops()) {
9794     // Transform all the decls.
9795     if (E) {
9796       auto *ULE = cast<UnresolvedLookupExpr>(E);
9797       UnresolvedSet<8> Decls;
9798       for (auto *D : ULE->decls()) {
9799         NamedDecl *InstD =
9800             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9801         Decls.addDecl(InstD, InstD->getAccess());
9802       }
9803       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9804           SemaRef.Context, /*NamingClass=*/nullptr,
9805           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9806           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9807     } else
9808       UnresolvedReductions.push_back(nullptr);
9809   }
9810   return getDerived().RebuildOMPTaskReductionClause(
9811       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9812       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9813 }
9814 
9815 template <typename Derived>
9816 OMPClause *
9817 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9818   llvm::SmallVector<Expr *, 16> Vars;
9819   Vars.reserve(C->varlist_size());
9820   for (auto *VE : C->varlists()) {
9821     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9822     if (EVar.isInvalid())
9823       return nullptr;
9824     Vars.push_back(EVar.get());
9825   }
9826   CXXScopeSpec ReductionIdScopeSpec;
9827   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9828 
9829   DeclarationNameInfo NameInfo = C->getNameInfo();
9830   if (NameInfo.getName()) {
9831     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9832     if (!NameInfo.getName())
9833       return nullptr;
9834   }
9835   // Build a list of all UDR decls with the same names ranged by the Scopes.
9836   // The Scope boundary is a duplication of the previous decl.
9837   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9838   for (auto *E : C->reduction_ops()) {
9839     // Transform all the decls.
9840     if (E) {
9841       auto *ULE = cast<UnresolvedLookupExpr>(E);
9842       UnresolvedSet<8> Decls;
9843       for (auto *D : ULE->decls()) {
9844         NamedDecl *InstD =
9845             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9846         Decls.addDecl(InstD, InstD->getAccess());
9847       }
9848       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9849           SemaRef.Context, /*NamingClass=*/nullptr,
9850           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9851           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9852     } else
9853       UnresolvedReductions.push_back(nullptr);
9854   }
9855   return getDerived().RebuildOMPInReductionClause(
9856       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9857       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9858 }
9859 
9860 template <typename Derived>
9861 OMPClause *
9862 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9863   llvm::SmallVector<Expr *, 16> Vars;
9864   Vars.reserve(C->varlist_size());
9865   for (auto *VE : C->varlists()) {
9866     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9867     if (EVar.isInvalid())
9868       return nullptr;
9869     Vars.push_back(EVar.get());
9870   }
9871   ExprResult Step = getDerived().TransformExpr(C->getStep());
9872   if (Step.isInvalid())
9873     return nullptr;
9874   return getDerived().RebuildOMPLinearClause(
9875       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9876       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9877 }
9878 
9879 template <typename Derived>
9880 OMPClause *
9881 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9882   llvm::SmallVector<Expr *, 16> Vars;
9883   Vars.reserve(C->varlist_size());
9884   for (auto *VE : C->varlists()) {
9885     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9886     if (EVar.isInvalid())
9887       return nullptr;
9888     Vars.push_back(EVar.get());
9889   }
9890   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9891   if (Alignment.isInvalid())
9892     return nullptr;
9893   return getDerived().RebuildOMPAlignedClause(
9894       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9895       C->getColonLoc(), C->getEndLoc());
9896 }
9897 
9898 template <typename Derived>
9899 OMPClause *
9900 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9901   llvm::SmallVector<Expr *, 16> Vars;
9902   Vars.reserve(C->varlist_size());
9903   for (auto *VE : C->varlists()) {
9904     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9905     if (EVar.isInvalid())
9906       return nullptr;
9907     Vars.push_back(EVar.get());
9908   }
9909   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9910                                              C->getLParenLoc(), C->getEndLoc());
9911 }
9912 
9913 template <typename Derived>
9914 OMPClause *
9915 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9916   llvm::SmallVector<Expr *, 16> Vars;
9917   Vars.reserve(C->varlist_size());
9918   for (auto *VE : C->varlists()) {
9919     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9920     if (EVar.isInvalid())
9921       return nullptr;
9922     Vars.push_back(EVar.get());
9923   }
9924   return getDerived().RebuildOMPCopyprivateClause(
9925       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9926 }
9927 
9928 template <typename Derived>
9929 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9930   llvm::SmallVector<Expr *, 16> Vars;
9931   Vars.reserve(C->varlist_size());
9932   for (auto *VE : C->varlists()) {
9933     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9934     if (EVar.isInvalid())
9935       return nullptr;
9936     Vars.push_back(EVar.get());
9937   }
9938   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9939                                             C->getLParenLoc(), C->getEndLoc());
9940 }
9941 
9942 template <typename Derived>
9943 OMPClause *
9944 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9945   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9946   if (E.isInvalid())
9947     return nullptr;
9948   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9949                                              C->getLParenLoc(), C->getEndLoc());
9950 }
9951 
9952 template <typename Derived>
9953 OMPClause *
9954 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9955   llvm::SmallVector<Expr *, 16> Vars;
9956   Expr *DepModifier = C->getModifier();
9957   if (DepModifier) {
9958     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9959     if (DepModRes.isInvalid())
9960       return nullptr;
9961     DepModifier = DepModRes.get();
9962   }
9963   Vars.reserve(C->varlist_size());
9964   for (auto *VE : C->varlists()) {
9965     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9966     if (EVar.isInvalid())
9967       return nullptr;
9968     Vars.push_back(EVar.get());
9969   }
9970   return getDerived().RebuildOMPDependClause(
9971       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9972       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9973       C->getEndLoc());
9974 }
9975 
9976 template <typename Derived>
9977 OMPClause *
9978 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9979   ExprResult E = getDerived().TransformExpr(C->getDevice());
9980   if (E.isInvalid())
9981     return nullptr;
9982   return getDerived().RebuildOMPDeviceClause(
9983       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9984       C->getModifierLoc(), C->getEndLoc());
9985 }
9986 
9987 template <typename Derived, class T>
9988 bool transformOMPMappableExprListClause(
9989     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9990     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9991     DeclarationNameInfo &MapperIdInfo,
9992     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9993   // Transform expressions in the list.
9994   Vars.reserve(C->varlist_size());
9995   for (auto *VE : C->varlists()) {
9996     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9997     if (EVar.isInvalid())
9998       return true;
9999     Vars.push_back(EVar.get());
10000   }
10001   // Transform mapper scope specifier and identifier.
10002   NestedNameSpecifierLoc QualifierLoc;
10003   if (C->getMapperQualifierLoc()) {
10004     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
10005         C->getMapperQualifierLoc());
10006     if (!QualifierLoc)
10007       return true;
10008   }
10009   MapperIdScopeSpec.Adopt(QualifierLoc);
10010   MapperIdInfo = C->getMapperIdInfo();
10011   if (MapperIdInfo.getName()) {
10012     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10013     if (!MapperIdInfo.getName())
10014       return true;
10015   }
10016   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10017   // the previous user-defined mapper lookup in dependent environment.
10018   for (auto *E : C->mapperlists()) {
10019     // Transform all the decls.
10020     if (E) {
10021       auto *ULE = cast<UnresolvedLookupExpr>(E);
10022       UnresolvedSet<8> Decls;
10023       for (auto *D : ULE->decls()) {
10024         NamedDecl *InstD =
10025             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10026         Decls.addDecl(InstD, InstD->getAccess());
10027       }
10028       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10029           TT.getSema().Context, /*NamingClass=*/nullptr,
10030           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10031           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10032           Decls.end()));
10033     } else {
10034       UnresolvedMappers.push_back(nullptr);
10035     }
10036   }
10037   return false;
10038 }
10039 
10040 template <typename Derived>
10041 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10042   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10043   llvm::SmallVector<Expr *, 16> Vars;
10044   CXXScopeSpec MapperIdScopeSpec;
10045   DeclarationNameInfo MapperIdInfo;
10046   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10047   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10048           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10049     return nullptr;
10050   return getDerived().RebuildOMPMapClause(
10051       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
10052       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
10053       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10054 }
10055 
10056 template <typename Derived>
10057 OMPClause *
10058 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10059   Expr *Allocator = C->getAllocator();
10060   if (Allocator) {
10061     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10062     if (AllocatorRes.isInvalid())
10063       return nullptr;
10064     Allocator = AllocatorRes.get();
10065   }
10066   llvm::SmallVector<Expr *, 16> Vars;
10067   Vars.reserve(C->varlist_size());
10068   for (auto *VE : C->varlists()) {
10069     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10070     if (EVar.isInvalid())
10071       return nullptr;
10072     Vars.push_back(EVar.get());
10073   }
10074   return getDerived().RebuildOMPAllocateClause(
10075       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10076       C->getEndLoc());
10077 }
10078 
10079 template <typename Derived>
10080 OMPClause *
10081 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10082   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10083   if (E.isInvalid())
10084     return nullptr;
10085   return getDerived().RebuildOMPNumTeamsClause(
10086       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10087 }
10088 
10089 template <typename Derived>
10090 OMPClause *
10091 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10092   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10093   if (E.isInvalid())
10094     return nullptr;
10095   return getDerived().RebuildOMPThreadLimitClause(
10096       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10097 }
10098 
10099 template <typename Derived>
10100 OMPClause *
10101 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10102   ExprResult E = getDerived().TransformExpr(C->getPriority());
10103   if (E.isInvalid())
10104     return nullptr;
10105   return getDerived().RebuildOMPPriorityClause(
10106       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10107 }
10108 
10109 template <typename Derived>
10110 OMPClause *
10111 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10112   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10113   if (E.isInvalid())
10114     return nullptr;
10115   return getDerived().RebuildOMPGrainsizeClause(
10116       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10117 }
10118 
10119 template <typename Derived>
10120 OMPClause *
10121 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10122   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10123   if (E.isInvalid())
10124     return nullptr;
10125   return getDerived().RebuildOMPNumTasksClause(
10126       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10127 }
10128 
10129 template <typename Derived>
10130 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10131   ExprResult E = getDerived().TransformExpr(C->getHint());
10132   if (E.isInvalid())
10133     return nullptr;
10134   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10135                                            C->getLParenLoc(), C->getEndLoc());
10136 }
10137 
10138 template <typename Derived>
10139 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10140     OMPDistScheduleClause *C) {
10141   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10142   if (E.isInvalid())
10143     return nullptr;
10144   return getDerived().RebuildOMPDistScheduleClause(
10145       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10146       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10147 }
10148 
10149 template <typename Derived>
10150 OMPClause *
10151 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10152   // Rebuild Defaultmap Clause since we need to invoke the checking of
10153   // defaultmap(none:variable-category) after template initialization.
10154   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10155                                                  C->getDefaultmapKind(),
10156                                                  C->getBeginLoc(),
10157                                                  C->getLParenLoc(),
10158                                                  C->getDefaultmapModifierLoc(),
10159                                                  C->getDefaultmapKindLoc(),
10160                                                  C->getEndLoc());
10161 }
10162 
10163 template <typename Derived>
10164 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10165   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10166   llvm::SmallVector<Expr *, 16> Vars;
10167   CXXScopeSpec MapperIdScopeSpec;
10168   DeclarationNameInfo MapperIdInfo;
10169   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10170   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10171           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10172     return nullptr;
10173   return getDerived().RebuildOMPToClause(
10174       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10175       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10176 }
10177 
10178 template <typename Derived>
10179 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10180   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10181   llvm::SmallVector<Expr *, 16> Vars;
10182   CXXScopeSpec MapperIdScopeSpec;
10183   DeclarationNameInfo MapperIdInfo;
10184   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10185   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10186           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10187     return nullptr;
10188   return getDerived().RebuildOMPFromClause(
10189       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10190       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10191 }
10192 
10193 template <typename Derived>
10194 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10195     OMPUseDevicePtrClause *C) {
10196   llvm::SmallVector<Expr *, 16> Vars;
10197   Vars.reserve(C->varlist_size());
10198   for (auto *VE : C->varlists()) {
10199     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10200     if (EVar.isInvalid())
10201       return nullptr;
10202     Vars.push_back(EVar.get());
10203   }
10204   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10205   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10206 }
10207 
10208 template <typename Derived>
10209 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10210     OMPUseDeviceAddrClause *C) {
10211   llvm::SmallVector<Expr *, 16> Vars;
10212   Vars.reserve(C->varlist_size());
10213   for (auto *VE : C->varlists()) {
10214     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10215     if (EVar.isInvalid())
10216       return nullptr;
10217     Vars.push_back(EVar.get());
10218   }
10219   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10220   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10221 }
10222 
10223 template <typename Derived>
10224 OMPClause *
10225 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10226   llvm::SmallVector<Expr *, 16> Vars;
10227   Vars.reserve(C->varlist_size());
10228   for (auto *VE : C->varlists()) {
10229     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10230     if (EVar.isInvalid())
10231       return nullptr;
10232     Vars.push_back(EVar.get());
10233   }
10234   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10235   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10236 }
10237 
10238 template <typename Derived>
10239 OMPClause *
10240 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10241   llvm::SmallVector<Expr *, 16> Vars;
10242   Vars.reserve(C->varlist_size());
10243   for (auto *VE : C->varlists()) {
10244     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10245     if (EVar.isInvalid())
10246       return nullptr;
10247     Vars.push_back(EVar.get());
10248   }
10249   return getDerived().RebuildOMPNontemporalClause(
10250       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10251 }
10252 
10253 template <typename Derived>
10254 OMPClause *
10255 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10256   llvm::SmallVector<Expr *, 16> Vars;
10257   Vars.reserve(C->varlist_size());
10258   for (auto *VE : C->varlists()) {
10259     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10260     if (EVar.isInvalid())
10261       return nullptr;
10262     Vars.push_back(EVar.get());
10263   }
10264   return getDerived().RebuildOMPInclusiveClause(
10265       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10266 }
10267 
10268 template <typename Derived>
10269 OMPClause *
10270 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10271   llvm::SmallVector<Expr *, 16> Vars;
10272   Vars.reserve(C->varlist_size());
10273   for (auto *VE : C->varlists()) {
10274     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10275     if (EVar.isInvalid())
10276       return nullptr;
10277     Vars.push_back(EVar.get());
10278   }
10279   return getDerived().RebuildOMPExclusiveClause(
10280       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10281 }
10282 
10283 template <typename Derived>
10284 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10285     OMPUsesAllocatorsClause *C) {
10286   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10287   Data.reserve(C->getNumberOfAllocators());
10288   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10289     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10290     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10291     if (Allocator.isInvalid())
10292       continue;
10293     ExprResult AllocatorTraits;
10294     if (Expr *AT = D.AllocatorTraits) {
10295       AllocatorTraits = getDerived().TransformExpr(AT);
10296       if (AllocatorTraits.isInvalid())
10297         continue;
10298     }
10299     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10300     NewD.Allocator = Allocator.get();
10301     NewD.AllocatorTraits = AllocatorTraits.get();
10302     NewD.LParenLoc = D.LParenLoc;
10303     NewD.RParenLoc = D.RParenLoc;
10304   }
10305   return getDerived().RebuildOMPUsesAllocatorsClause(
10306       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10307 }
10308 
10309 template <typename Derived>
10310 OMPClause *
10311 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10312   SmallVector<Expr *, 4> Locators;
10313   Locators.reserve(C->varlist_size());
10314   ExprResult ModifierRes;
10315   if (Expr *Modifier = C->getModifier()) {
10316     ModifierRes = getDerived().TransformExpr(Modifier);
10317     if (ModifierRes.isInvalid())
10318       return nullptr;
10319   }
10320   for (Expr *E : C->varlists()) {
10321     ExprResult Locator = getDerived().TransformExpr(E);
10322     if (Locator.isInvalid())
10323       continue;
10324     Locators.push_back(Locator.get());
10325   }
10326   return getDerived().RebuildOMPAffinityClause(
10327       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10328       ModifierRes.get(), Locators);
10329 }
10330 
10331 template <typename Derived>
10332 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10333   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10334                                             C->getBeginLoc(), C->getLParenLoc(),
10335                                             C->getEndLoc());
10336 }
10337 
10338 template <typename Derived>
10339 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10340   return getDerived().RebuildOMPBindClause(
10341       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10342       C->getLParenLoc(), C->getEndLoc());
10343 }
10344 
10345 //===----------------------------------------------------------------------===//
10346 // Expression transformation
10347 //===----------------------------------------------------------------------===//
10348 template<typename Derived>
10349 ExprResult
10350 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10351   return TransformExpr(E->getSubExpr());
10352 }
10353 
10354 template <typename Derived>
10355 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10356     SYCLUniqueStableNameExpr *E) {
10357   if (!E->isTypeDependent())
10358     return E;
10359 
10360   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10361 
10362   if (!NewT)
10363     return ExprError();
10364 
10365   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10366     return E;
10367 
10368   return getDerived().RebuildSYCLUniqueStableNameExpr(
10369       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10370 }
10371 
10372 template<typename Derived>
10373 ExprResult
10374 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10375   if (!E->isTypeDependent())
10376     return E;
10377 
10378   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10379                                             E->getIdentKind());
10380 }
10381 
10382 template<typename Derived>
10383 ExprResult
10384 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10385   NestedNameSpecifierLoc QualifierLoc;
10386   if (E->getQualifierLoc()) {
10387     QualifierLoc
10388       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10389     if (!QualifierLoc)
10390       return ExprError();
10391   }
10392 
10393   ValueDecl *ND
10394     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10395                                                          E->getDecl()));
10396   if (!ND)
10397     return ExprError();
10398 
10399   NamedDecl *Found = ND;
10400   if (E->getFoundDecl() != E->getDecl()) {
10401     Found = cast_or_null<NamedDecl>(
10402         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10403     if (!Found)
10404       return ExprError();
10405   }
10406 
10407   DeclarationNameInfo NameInfo = E->getNameInfo();
10408   if (NameInfo.getName()) {
10409     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10410     if (!NameInfo.getName())
10411       return ExprError();
10412   }
10413 
10414   if (!getDerived().AlwaysRebuild() &&
10415       QualifierLoc == E->getQualifierLoc() &&
10416       ND == E->getDecl() &&
10417       Found == E->getFoundDecl() &&
10418       NameInfo.getName() == E->getDecl()->getDeclName() &&
10419       !E->hasExplicitTemplateArgs()) {
10420 
10421     // Mark it referenced in the new context regardless.
10422     // FIXME: this is a bit instantiation-specific.
10423     SemaRef.MarkDeclRefReferenced(E);
10424 
10425     return E;
10426   }
10427 
10428   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10429   if (E->hasExplicitTemplateArgs()) {
10430     TemplateArgs = &TransArgs;
10431     TransArgs.setLAngleLoc(E->getLAngleLoc());
10432     TransArgs.setRAngleLoc(E->getRAngleLoc());
10433     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10434                                                 E->getNumTemplateArgs(),
10435                                                 TransArgs))
10436       return ExprError();
10437   }
10438 
10439   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10440                                          Found, TemplateArgs);
10441 }
10442 
10443 template<typename Derived>
10444 ExprResult
10445 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10446   return E;
10447 }
10448 
10449 template <typename Derived>
10450 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10451     FixedPointLiteral *E) {
10452   return E;
10453 }
10454 
10455 template<typename Derived>
10456 ExprResult
10457 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10458   return E;
10459 }
10460 
10461 template<typename Derived>
10462 ExprResult
10463 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10464   return E;
10465 }
10466 
10467 template<typename Derived>
10468 ExprResult
10469 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10470   return E;
10471 }
10472 
10473 template<typename Derived>
10474 ExprResult
10475 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10476   return E;
10477 }
10478 
10479 template<typename Derived>
10480 ExprResult
10481 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10482   if (FunctionDecl *FD = E->getDirectCallee())
10483     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10484   return SemaRef.MaybeBindToTemporary(E);
10485 }
10486 
10487 template<typename Derived>
10488 ExprResult
10489 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10490   ExprResult ControllingExpr =
10491     getDerived().TransformExpr(E->getControllingExpr());
10492   if (ControllingExpr.isInvalid())
10493     return ExprError();
10494 
10495   SmallVector<Expr *, 4> AssocExprs;
10496   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10497   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10498     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10499     if (TSI) {
10500       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10501       if (!AssocType)
10502         return ExprError();
10503       AssocTypes.push_back(AssocType);
10504     } else {
10505       AssocTypes.push_back(nullptr);
10506     }
10507 
10508     ExprResult AssocExpr =
10509         getDerived().TransformExpr(Assoc.getAssociationExpr());
10510     if (AssocExpr.isInvalid())
10511       return ExprError();
10512     AssocExprs.push_back(AssocExpr.get());
10513   }
10514 
10515   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10516                                                   E->getDefaultLoc(),
10517                                                   E->getRParenLoc(),
10518                                                   ControllingExpr.get(),
10519                                                   AssocTypes,
10520                                                   AssocExprs);
10521 }
10522 
10523 template<typename Derived>
10524 ExprResult
10525 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10526   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10527   if (SubExpr.isInvalid())
10528     return ExprError();
10529 
10530   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10531     return E;
10532 
10533   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10534                                        E->getRParen());
10535 }
10536 
10537 /// The operand of a unary address-of operator has special rules: it's
10538 /// allowed to refer to a non-static member of a class even if there's no 'this'
10539 /// object available.
10540 template<typename Derived>
10541 ExprResult
10542 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10543   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10544     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10545   else
10546     return getDerived().TransformExpr(E);
10547 }
10548 
10549 template<typename Derived>
10550 ExprResult
10551 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10552   ExprResult SubExpr;
10553   if (E->getOpcode() == UO_AddrOf)
10554     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10555   else
10556     SubExpr = TransformExpr(E->getSubExpr());
10557   if (SubExpr.isInvalid())
10558     return ExprError();
10559 
10560   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10561     return E;
10562 
10563   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10564                                            E->getOpcode(),
10565                                            SubExpr.get());
10566 }
10567 
10568 template<typename Derived>
10569 ExprResult
10570 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10571   // Transform the type.
10572   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10573   if (!Type)
10574     return ExprError();
10575 
10576   // Transform all of the components into components similar to what the
10577   // parser uses.
10578   // FIXME: It would be slightly more efficient in the non-dependent case to
10579   // just map FieldDecls, rather than requiring the rebuilder to look for
10580   // the fields again. However, __builtin_offsetof is rare enough in
10581   // template code that we don't care.
10582   bool ExprChanged = false;
10583   typedef Sema::OffsetOfComponent Component;
10584   SmallVector<Component, 4> Components;
10585   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10586     const OffsetOfNode &ON = E->getComponent(I);
10587     Component Comp;
10588     Comp.isBrackets = true;
10589     Comp.LocStart = ON.getSourceRange().getBegin();
10590     Comp.LocEnd = ON.getSourceRange().getEnd();
10591     switch (ON.getKind()) {
10592     case OffsetOfNode::Array: {
10593       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10594       ExprResult Index = getDerived().TransformExpr(FromIndex);
10595       if (Index.isInvalid())
10596         return ExprError();
10597 
10598       ExprChanged = ExprChanged || Index.get() != FromIndex;
10599       Comp.isBrackets = true;
10600       Comp.U.E = Index.get();
10601       break;
10602     }
10603 
10604     case OffsetOfNode::Field:
10605     case OffsetOfNode::Identifier:
10606       Comp.isBrackets = false;
10607       Comp.U.IdentInfo = ON.getFieldName();
10608       if (!Comp.U.IdentInfo)
10609         continue;
10610 
10611       break;
10612 
10613     case OffsetOfNode::Base:
10614       // Will be recomputed during the rebuild.
10615       continue;
10616     }
10617 
10618     Components.push_back(Comp);
10619   }
10620 
10621   // If nothing changed, retain the existing expression.
10622   if (!getDerived().AlwaysRebuild() &&
10623       Type == E->getTypeSourceInfo() &&
10624       !ExprChanged)
10625     return E;
10626 
10627   // Build a new offsetof expression.
10628   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10629                                           Components, E->getRParenLoc());
10630 }
10631 
10632 template<typename Derived>
10633 ExprResult
10634 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10635   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10636          "opaque value expression requires transformation");
10637   return E;
10638 }
10639 
10640 template<typename Derived>
10641 ExprResult
10642 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10643   return E;
10644 }
10645 
10646 template <typename Derived>
10647 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10648   llvm::SmallVector<Expr *, 8> Children;
10649   bool Changed = false;
10650   for (Expr *C : E->subExpressions()) {
10651     ExprResult NewC = getDerived().TransformExpr(C);
10652     if (NewC.isInvalid())
10653       return ExprError();
10654     Children.push_back(NewC.get());
10655 
10656     Changed |= NewC.get() != C;
10657   }
10658   if (!getDerived().AlwaysRebuild() && !Changed)
10659     return E;
10660   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10661                                           Children, E->getType());
10662 }
10663 
10664 template<typename Derived>
10665 ExprResult
10666 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10667   // Rebuild the syntactic form.  The original syntactic form has
10668   // opaque-value expressions in it, so strip those away and rebuild
10669   // the result.  This is a really awful way of doing this, but the
10670   // better solution (rebuilding the semantic expressions and
10671   // rebinding OVEs as necessary) doesn't work; we'd need
10672   // TreeTransform to not strip away implicit conversions.
10673   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10674   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10675   if (result.isInvalid()) return ExprError();
10676 
10677   // If that gives us a pseudo-object result back, the pseudo-object
10678   // expression must have been an lvalue-to-rvalue conversion which we
10679   // should reapply.
10680   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10681     result = SemaRef.checkPseudoObjectRValue(result.get());
10682 
10683   return result;
10684 }
10685 
10686 template<typename Derived>
10687 ExprResult
10688 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10689                                                 UnaryExprOrTypeTraitExpr *E) {
10690   if (E->isArgumentType()) {
10691     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10692 
10693     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10694     if (!NewT)
10695       return ExprError();
10696 
10697     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10698       return E;
10699 
10700     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10701                                                     E->getKind(),
10702                                                     E->getSourceRange());
10703   }
10704 
10705   // C++0x [expr.sizeof]p1:
10706   //   The operand is either an expression, which is an unevaluated operand
10707   //   [...]
10708   EnterExpressionEvaluationContext Unevaluated(
10709       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10710       Sema::ReuseLambdaContextDecl);
10711 
10712   // Try to recover if we have something like sizeof(T::X) where X is a type.
10713   // Notably, there must be *exactly* one set of parens if X is a type.
10714   TypeSourceInfo *RecoveryTSI = nullptr;
10715   ExprResult SubExpr;
10716   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10717   if (auto *DRE =
10718           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10719     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10720         PE, DRE, false, &RecoveryTSI);
10721   else
10722     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10723 
10724   if (RecoveryTSI) {
10725     return getDerived().RebuildUnaryExprOrTypeTrait(
10726         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10727   } else if (SubExpr.isInvalid())
10728     return ExprError();
10729 
10730   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10731     return E;
10732 
10733   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10734                                                   E->getOperatorLoc(),
10735                                                   E->getKind(),
10736                                                   E->getSourceRange());
10737 }
10738 
10739 template<typename Derived>
10740 ExprResult
10741 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10742   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10743   if (LHS.isInvalid())
10744     return ExprError();
10745 
10746   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10747   if (RHS.isInvalid())
10748     return ExprError();
10749 
10750 
10751   if (!getDerived().AlwaysRebuild() &&
10752       LHS.get() == E->getLHS() &&
10753       RHS.get() == E->getRHS())
10754     return E;
10755 
10756   return getDerived().RebuildArraySubscriptExpr(
10757       LHS.get(),
10758       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10759 }
10760 
10761 template <typename Derived>
10762 ExprResult
10763 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10764   ExprResult Base = getDerived().TransformExpr(E->getBase());
10765   if (Base.isInvalid())
10766     return ExprError();
10767 
10768   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10769   if (RowIdx.isInvalid())
10770     return ExprError();
10771 
10772   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10773   if (ColumnIdx.isInvalid())
10774     return ExprError();
10775 
10776   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10777       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10778     return E;
10779 
10780   return getDerived().RebuildMatrixSubscriptExpr(
10781       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10782 }
10783 
10784 template <typename Derived>
10785 ExprResult
10786 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10787   ExprResult Base = getDerived().TransformExpr(E->getBase());
10788   if (Base.isInvalid())
10789     return ExprError();
10790 
10791   ExprResult LowerBound;
10792   if (E->getLowerBound()) {
10793     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10794     if (LowerBound.isInvalid())
10795       return ExprError();
10796   }
10797 
10798   ExprResult Length;
10799   if (E->getLength()) {
10800     Length = getDerived().TransformExpr(E->getLength());
10801     if (Length.isInvalid())
10802       return ExprError();
10803   }
10804 
10805   ExprResult Stride;
10806   if (Expr *Str = E->getStride()) {
10807     Stride = getDerived().TransformExpr(Str);
10808     if (Stride.isInvalid())
10809       return ExprError();
10810   }
10811 
10812   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10813       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10814     return E;
10815 
10816   return getDerived().RebuildOMPArraySectionExpr(
10817       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10818       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10819       E->getRBracketLoc());
10820 }
10821 
10822 template <typename Derived>
10823 ExprResult
10824 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10825   ExprResult Base = getDerived().TransformExpr(E->getBase());
10826   if (Base.isInvalid())
10827     return ExprError();
10828 
10829   SmallVector<Expr *, 4> Dims;
10830   bool ErrorFound = false;
10831   for (Expr *Dim : E->getDimensions()) {
10832     ExprResult DimRes = getDerived().TransformExpr(Dim);
10833     if (DimRes.isInvalid()) {
10834       ErrorFound = true;
10835       continue;
10836     }
10837     Dims.push_back(DimRes.get());
10838   }
10839 
10840   if (ErrorFound)
10841     return ExprError();
10842   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10843                                                  E->getRParenLoc(), Dims,
10844                                                  E->getBracketsRanges());
10845 }
10846 
10847 template <typename Derived>
10848 ExprResult
10849 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10850   unsigned NumIterators = E->numOfIterators();
10851   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10852 
10853   bool ErrorFound = false;
10854   bool NeedToRebuild = getDerived().AlwaysRebuild();
10855   for (unsigned I = 0; I < NumIterators; ++I) {
10856     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10857     Data[I].DeclIdent = D->getIdentifier();
10858     Data[I].DeclIdentLoc = D->getLocation();
10859     if (D->getLocation() == D->getBeginLoc()) {
10860       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10861              "Implicit type must be int.");
10862     } else {
10863       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10864       QualType DeclTy = getDerived().TransformType(D->getType());
10865       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10866     }
10867     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10868     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10869     ExprResult End = getDerived().TransformExpr(Range.End);
10870     ExprResult Step = getDerived().TransformExpr(Range.Step);
10871     ErrorFound = ErrorFound ||
10872                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10873                                                !Data[I].Type.get().isNull())) ||
10874                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10875     if (ErrorFound)
10876       continue;
10877     Data[I].Range.Begin = Begin.get();
10878     Data[I].Range.End = End.get();
10879     Data[I].Range.Step = Step.get();
10880     Data[I].AssignLoc = E->getAssignLoc(I);
10881     Data[I].ColonLoc = E->getColonLoc(I);
10882     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10883     NeedToRebuild =
10884         NeedToRebuild ||
10885         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10886                                        D->getType().getTypePtrOrNull()) ||
10887         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10888         Range.Step != Data[I].Range.Step;
10889   }
10890   if (ErrorFound)
10891     return ExprError();
10892   if (!NeedToRebuild)
10893     return E;
10894 
10895   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10896       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10897   if (!Res.isUsable())
10898     return Res;
10899   auto *IE = cast<OMPIteratorExpr>(Res.get());
10900   for (unsigned I = 0; I < NumIterators; ++I)
10901     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10902                                       IE->getIteratorDecl(I));
10903   return Res;
10904 }
10905 
10906 template<typename Derived>
10907 ExprResult
10908 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10909   // Transform the callee.
10910   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10911   if (Callee.isInvalid())
10912     return ExprError();
10913 
10914   // Transform arguments.
10915   bool ArgChanged = false;
10916   SmallVector<Expr*, 8> Args;
10917   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10918                                   &ArgChanged))
10919     return ExprError();
10920 
10921   if (!getDerived().AlwaysRebuild() &&
10922       Callee.get() == E->getCallee() &&
10923       !ArgChanged)
10924     return SemaRef.MaybeBindToTemporary(E);
10925 
10926   // FIXME: Wrong source location information for the '('.
10927   SourceLocation FakeLParenLoc
10928     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10929 
10930   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10931   if (E->hasStoredFPFeatures()) {
10932     FPOptionsOverride NewOverrides = E->getFPFeatures();
10933     getSema().CurFPFeatures =
10934         NewOverrides.applyOverrides(getSema().getLangOpts());
10935     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10936   }
10937 
10938   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10939                                       Args,
10940                                       E->getRParenLoc());
10941 }
10942 
10943 template<typename Derived>
10944 ExprResult
10945 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10946   ExprResult Base = getDerived().TransformExpr(E->getBase());
10947   if (Base.isInvalid())
10948     return ExprError();
10949 
10950   NestedNameSpecifierLoc QualifierLoc;
10951   if (E->hasQualifier()) {
10952     QualifierLoc
10953       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10954 
10955     if (!QualifierLoc)
10956       return ExprError();
10957   }
10958   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10959 
10960   ValueDecl *Member
10961     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10962                                                          E->getMemberDecl()));
10963   if (!Member)
10964     return ExprError();
10965 
10966   NamedDecl *FoundDecl = E->getFoundDecl();
10967   if (FoundDecl == E->getMemberDecl()) {
10968     FoundDecl = Member;
10969   } else {
10970     FoundDecl = cast_or_null<NamedDecl>(
10971                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10972     if (!FoundDecl)
10973       return ExprError();
10974   }
10975 
10976   if (!getDerived().AlwaysRebuild() &&
10977       Base.get() == E->getBase() &&
10978       QualifierLoc == E->getQualifierLoc() &&
10979       Member == E->getMemberDecl() &&
10980       FoundDecl == E->getFoundDecl() &&
10981       !E->hasExplicitTemplateArgs()) {
10982 
10983     // Mark it referenced in the new context regardless.
10984     // FIXME: this is a bit instantiation-specific.
10985     SemaRef.MarkMemberReferenced(E);
10986 
10987     return E;
10988   }
10989 
10990   TemplateArgumentListInfo TransArgs;
10991   if (E->hasExplicitTemplateArgs()) {
10992     TransArgs.setLAngleLoc(E->getLAngleLoc());
10993     TransArgs.setRAngleLoc(E->getRAngleLoc());
10994     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10995                                                 E->getNumTemplateArgs(),
10996                                                 TransArgs))
10997       return ExprError();
10998   }
10999 
11000   // FIXME: Bogus source location for the operator
11001   SourceLocation FakeOperatorLoc =
11002       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
11003 
11004   // FIXME: to do this check properly, we will need to preserve the
11005   // first-qualifier-in-scope here, just in case we had a dependent
11006   // base (and therefore couldn't do the check) and a
11007   // nested-name-qualifier (and therefore could do the lookup).
11008   NamedDecl *FirstQualifierInScope = nullptr;
11009   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
11010   if (MemberNameInfo.getName()) {
11011     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11012     if (!MemberNameInfo.getName())
11013       return ExprError();
11014   }
11015 
11016   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11017                                         E->isArrow(),
11018                                         QualifierLoc,
11019                                         TemplateKWLoc,
11020                                         MemberNameInfo,
11021                                         Member,
11022                                         FoundDecl,
11023                                         (E->hasExplicitTemplateArgs()
11024                                            ? &TransArgs : nullptr),
11025                                         FirstQualifierInScope);
11026 }
11027 
11028 template<typename Derived>
11029 ExprResult
11030 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11031   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11032   if (LHS.isInvalid())
11033     return ExprError();
11034 
11035   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11036   if (RHS.isInvalid())
11037     return ExprError();
11038 
11039   if (!getDerived().AlwaysRebuild() &&
11040       LHS.get() == E->getLHS() &&
11041       RHS.get() == E->getRHS())
11042     return E;
11043 
11044   if (E->isCompoundAssignmentOp())
11045     // FPFeatures has already been established from trailing storage
11046     return getDerived().RebuildBinaryOperator(
11047         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11048   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11049   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11050   getSema().CurFPFeatures =
11051       NewOverrides.applyOverrides(getSema().getLangOpts());
11052   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11053   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11054                                             LHS.get(), RHS.get());
11055 }
11056 
11057 template <typename Derived>
11058 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11059     CXXRewrittenBinaryOperator *E) {
11060   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11061 
11062   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11063   if (LHS.isInvalid())
11064     return ExprError();
11065 
11066   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11067   if (RHS.isInvalid())
11068     return ExprError();
11069 
11070   // Extract the already-resolved callee declarations so that we can restrict
11071   // ourselves to using them as the unqualified lookup results when rebuilding.
11072   UnresolvedSet<2> UnqualLookups;
11073   bool ChangedAnyLookups = false;
11074   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11075                             const_cast<Expr *>(Decomp.InnerBinOp)};
11076   for (Expr *PossibleBinOp : PossibleBinOps) {
11077     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11078     if (!Op)
11079       continue;
11080     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11081     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11082       continue;
11083 
11084     // Transform the callee in case we built a call to a local extern
11085     // declaration.
11086     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11087         E->getOperatorLoc(), Callee->getFoundDecl()));
11088     if (!Found)
11089       return ExprError();
11090     if (Found != Callee->getFoundDecl())
11091       ChangedAnyLookups = true;
11092     UnqualLookups.addDecl(Found);
11093   }
11094 
11095   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11096       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11097     // Mark all functions used in the rewrite as referenced. Note that when
11098     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11099     // function calls, and/or there might be a user-defined conversion sequence
11100     // applied to the operands of the <.
11101     // FIXME: this is a bit instantiation-specific.
11102     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11103     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11104     return E;
11105   }
11106 
11107   return getDerived().RebuildCXXRewrittenBinaryOperator(
11108       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11109 }
11110 
11111 template<typename Derived>
11112 ExprResult
11113 TreeTransform<Derived>::TransformCompoundAssignOperator(
11114                                                       CompoundAssignOperator *E) {
11115   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11116   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11117   getSema().CurFPFeatures =
11118       NewOverrides.applyOverrides(getSema().getLangOpts());
11119   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11120   return getDerived().TransformBinaryOperator(E);
11121 }
11122 
11123 template<typename Derived>
11124 ExprResult TreeTransform<Derived>::
11125 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11126   // Just rebuild the common and RHS expressions and see whether we
11127   // get any changes.
11128 
11129   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11130   if (commonExpr.isInvalid())
11131     return ExprError();
11132 
11133   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11134   if (rhs.isInvalid())
11135     return ExprError();
11136 
11137   if (!getDerived().AlwaysRebuild() &&
11138       commonExpr.get() == e->getCommon() &&
11139       rhs.get() == e->getFalseExpr())
11140     return e;
11141 
11142   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11143                                                  e->getQuestionLoc(),
11144                                                  nullptr,
11145                                                  e->getColonLoc(),
11146                                                  rhs.get());
11147 }
11148 
11149 template<typename Derived>
11150 ExprResult
11151 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11152   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11153   if (Cond.isInvalid())
11154     return ExprError();
11155 
11156   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11157   if (LHS.isInvalid())
11158     return ExprError();
11159 
11160   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11161   if (RHS.isInvalid())
11162     return ExprError();
11163 
11164   if (!getDerived().AlwaysRebuild() &&
11165       Cond.get() == E->getCond() &&
11166       LHS.get() == E->getLHS() &&
11167       RHS.get() == E->getRHS())
11168     return E;
11169 
11170   return getDerived().RebuildConditionalOperator(Cond.get(),
11171                                                  E->getQuestionLoc(),
11172                                                  LHS.get(),
11173                                                  E->getColonLoc(),
11174                                                  RHS.get());
11175 }
11176 
11177 template<typename Derived>
11178 ExprResult
11179 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11180   // Implicit casts are eliminated during transformation, since they
11181   // will be recomputed by semantic analysis after transformation.
11182   return getDerived().TransformExpr(E->getSubExprAsWritten());
11183 }
11184 
11185 template<typename Derived>
11186 ExprResult
11187 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11188   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11189   if (!Type)
11190     return ExprError();
11191 
11192   ExprResult SubExpr
11193     = getDerived().TransformExpr(E->getSubExprAsWritten());
11194   if (SubExpr.isInvalid())
11195     return ExprError();
11196 
11197   if (!getDerived().AlwaysRebuild() &&
11198       Type == E->getTypeInfoAsWritten() &&
11199       SubExpr.get() == E->getSubExpr())
11200     return E;
11201 
11202   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11203                                             Type,
11204                                             E->getRParenLoc(),
11205                                             SubExpr.get());
11206 }
11207 
11208 template<typename Derived>
11209 ExprResult
11210 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11211   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11212   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11213   if (!NewT)
11214     return ExprError();
11215 
11216   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11217   if (Init.isInvalid())
11218     return ExprError();
11219 
11220   if (!getDerived().AlwaysRebuild() &&
11221       OldT == NewT &&
11222       Init.get() == E->getInitializer())
11223     return SemaRef.MaybeBindToTemporary(E);
11224 
11225   // Note: the expression type doesn't necessarily match the
11226   // type-as-written, but that's okay, because it should always be
11227   // derivable from the initializer.
11228 
11229   return getDerived().RebuildCompoundLiteralExpr(
11230       E->getLParenLoc(), NewT,
11231       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11232 }
11233 
11234 template<typename Derived>
11235 ExprResult
11236 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11237   ExprResult Base = getDerived().TransformExpr(E->getBase());
11238   if (Base.isInvalid())
11239     return ExprError();
11240 
11241   if (!getDerived().AlwaysRebuild() &&
11242       Base.get() == E->getBase())
11243     return E;
11244 
11245   // FIXME: Bad source location
11246   SourceLocation FakeOperatorLoc =
11247       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11248   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11249                                                   E->getAccessorLoc(),
11250                                                   E->getAccessor());
11251 }
11252 
11253 template<typename Derived>
11254 ExprResult
11255 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11256   if (InitListExpr *Syntactic = E->getSyntacticForm())
11257     E = Syntactic;
11258 
11259   bool InitChanged = false;
11260 
11261   EnterExpressionEvaluationContext Context(
11262       getSema(), EnterExpressionEvaluationContext::InitList);
11263 
11264   SmallVector<Expr*, 4> Inits;
11265   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11266                                   Inits, &InitChanged))
11267     return ExprError();
11268 
11269   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11270     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11271     // in some cases. We can't reuse it in general, because the syntactic and
11272     // semantic forms are linked, and we can't know that semantic form will
11273     // match even if the syntactic form does.
11274   }
11275 
11276   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11277                                       E->getRBraceLoc());
11278 }
11279 
11280 template<typename Derived>
11281 ExprResult
11282 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11283   Designation Desig;
11284 
11285   // transform the initializer value
11286   ExprResult Init = getDerived().TransformExpr(E->getInit());
11287   if (Init.isInvalid())
11288     return ExprError();
11289 
11290   // transform the designators.
11291   SmallVector<Expr*, 4> ArrayExprs;
11292   bool ExprChanged = false;
11293   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11294     if (D.isFieldDesignator()) {
11295       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11296                                                D.getDotLoc(),
11297                                                D.getFieldLoc()));
11298       if (D.getField()) {
11299         FieldDecl *Field = cast_or_null<FieldDecl>(
11300             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11301         if (Field != D.getField())
11302           // Rebuild the expression when the transformed FieldDecl is
11303           // different to the already assigned FieldDecl.
11304           ExprChanged = true;
11305       } else {
11306         // Ensure that the designator expression is rebuilt when there isn't
11307         // a resolved FieldDecl in the designator as we don't want to assign
11308         // a FieldDecl to a pattern designator that will be instantiated again.
11309         ExprChanged = true;
11310       }
11311       continue;
11312     }
11313 
11314     if (D.isArrayDesignator()) {
11315       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11316       if (Index.isInvalid())
11317         return ExprError();
11318 
11319       Desig.AddDesignator(
11320           Designator::getArray(Index.get(), D.getLBracketLoc()));
11321 
11322       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11323       ArrayExprs.push_back(Index.get());
11324       continue;
11325     }
11326 
11327     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11328     ExprResult Start
11329       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11330     if (Start.isInvalid())
11331       return ExprError();
11332 
11333     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11334     if (End.isInvalid())
11335       return ExprError();
11336 
11337     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11338                                                   End.get(),
11339                                                   D.getLBracketLoc(),
11340                                                   D.getEllipsisLoc()));
11341 
11342     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11343                   End.get() != E->getArrayRangeEnd(D);
11344 
11345     ArrayExprs.push_back(Start.get());
11346     ArrayExprs.push_back(End.get());
11347   }
11348 
11349   if (!getDerived().AlwaysRebuild() &&
11350       Init.get() == E->getInit() &&
11351       !ExprChanged)
11352     return E;
11353 
11354   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11355                                                 E->getEqualOrColonLoc(),
11356                                                 E->usesGNUSyntax(), Init.get());
11357 }
11358 
11359 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11360 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11361 template<typename Derived>
11362 ExprResult
11363 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11364     DesignatedInitUpdateExpr *E) {
11365   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11366                    "initializer");
11367   return ExprError();
11368 }
11369 
11370 template<typename Derived>
11371 ExprResult
11372 TreeTransform<Derived>::TransformNoInitExpr(
11373     NoInitExpr *E) {
11374   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11375   return ExprError();
11376 }
11377 
11378 template<typename Derived>
11379 ExprResult
11380 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11381   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11382   return ExprError();
11383 }
11384 
11385 template<typename Derived>
11386 ExprResult
11387 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11388   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11389   return ExprError();
11390 }
11391 
11392 template<typename Derived>
11393 ExprResult
11394 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11395                                                      ImplicitValueInitExpr *E) {
11396   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11397 
11398   // FIXME: Will we ever have proper type location here? Will we actually
11399   // need to transform the type?
11400   QualType T = getDerived().TransformType(E->getType());
11401   if (T.isNull())
11402     return ExprError();
11403 
11404   if (!getDerived().AlwaysRebuild() &&
11405       T == E->getType())
11406     return E;
11407 
11408   return getDerived().RebuildImplicitValueInitExpr(T);
11409 }
11410 
11411 template<typename Derived>
11412 ExprResult
11413 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11414   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11415   if (!TInfo)
11416     return ExprError();
11417 
11418   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11419   if (SubExpr.isInvalid())
11420     return ExprError();
11421 
11422   if (!getDerived().AlwaysRebuild() &&
11423       TInfo == E->getWrittenTypeInfo() &&
11424       SubExpr.get() == E->getSubExpr())
11425     return E;
11426 
11427   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11428                                        TInfo, E->getRParenLoc());
11429 }
11430 
11431 template<typename Derived>
11432 ExprResult
11433 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11434   bool ArgumentChanged = false;
11435   SmallVector<Expr*, 4> Inits;
11436   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11437                      &ArgumentChanged))
11438     return ExprError();
11439 
11440   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11441                                            Inits,
11442                                            E->getRParenLoc());
11443 }
11444 
11445 /// Transform an address-of-label expression.
11446 ///
11447 /// By default, the transformation of an address-of-label expression always
11448 /// rebuilds the expression, so that the label identifier can be resolved to
11449 /// the corresponding label statement by semantic analysis.
11450 template<typename Derived>
11451 ExprResult
11452 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11453   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11454                                         E->getLabel());
11455   if (!LD)
11456     return ExprError();
11457 
11458   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11459                                            cast<LabelDecl>(LD));
11460 }
11461 
11462 template<typename Derived>
11463 ExprResult
11464 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11465   SemaRef.ActOnStartStmtExpr();
11466   StmtResult SubStmt
11467     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11468   if (SubStmt.isInvalid()) {
11469     SemaRef.ActOnStmtExprError();
11470     return ExprError();
11471   }
11472 
11473   unsigned OldDepth = E->getTemplateDepth();
11474   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11475 
11476   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11477       SubStmt.get() == E->getSubStmt()) {
11478     // Calling this an 'error' is unintuitive, but it does the right thing.
11479     SemaRef.ActOnStmtExprError();
11480     return SemaRef.MaybeBindToTemporary(E);
11481   }
11482 
11483   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11484                                       E->getRParenLoc(), NewDepth);
11485 }
11486 
11487 template<typename Derived>
11488 ExprResult
11489 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11490   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11491   if (Cond.isInvalid())
11492     return ExprError();
11493 
11494   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11495   if (LHS.isInvalid())
11496     return ExprError();
11497 
11498   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11499   if (RHS.isInvalid())
11500     return ExprError();
11501 
11502   if (!getDerived().AlwaysRebuild() &&
11503       Cond.get() == E->getCond() &&
11504       LHS.get() == E->getLHS() &&
11505       RHS.get() == E->getRHS())
11506     return E;
11507 
11508   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11509                                         Cond.get(), LHS.get(), RHS.get(),
11510                                         E->getRParenLoc());
11511 }
11512 
11513 template<typename Derived>
11514 ExprResult
11515 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11516   return E;
11517 }
11518 
11519 template<typename Derived>
11520 ExprResult
11521 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11522   switch (E->getOperator()) {
11523   case OO_New:
11524   case OO_Delete:
11525   case OO_Array_New:
11526   case OO_Array_Delete:
11527     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11528 
11529   case OO_Subscript:
11530   case OO_Call: {
11531     // This is a call to an object's operator().
11532     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11533 
11534     // Transform the object itself.
11535     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11536     if (Object.isInvalid())
11537       return ExprError();
11538 
11539     // FIXME: Poor location information
11540     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11541         static_cast<Expr *>(Object.get())->getEndLoc());
11542 
11543     // Transform the call arguments.
11544     SmallVector<Expr*, 8> Args;
11545     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11546                                     Args))
11547       return ExprError();
11548 
11549     if (E->getOperator() == OO_Subscript)
11550       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11551                                                   Args, E->getEndLoc());
11552 
11553     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11554                                         E->getEndLoc());
11555   }
11556 
11557 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11558   case OO_##Name:                                                              \
11559     break;
11560 
11561 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11562 #include "clang/Basic/OperatorKinds.def"
11563 
11564   case OO_Conditional:
11565     llvm_unreachable("conditional operator is not actually overloadable");
11566 
11567   case OO_None:
11568   case NUM_OVERLOADED_OPERATORS:
11569     llvm_unreachable("not an overloaded operator?");
11570   }
11571 
11572   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11573   if (Callee.isInvalid())
11574     return ExprError();
11575 
11576   ExprResult First;
11577   if (E->getOperator() == OO_Amp)
11578     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11579   else
11580     First = getDerived().TransformExpr(E->getArg(0));
11581   if (First.isInvalid())
11582     return ExprError();
11583 
11584   ExprResult Second;
11585   if (E->getNumArgs() == 2) {
11586     Second = getDerived().TransformExpr(E->getArg(1));
11587     if (Second.isInvalid())
11588       return ExprError();
11589   }
11590 
11591   if (!getDerived().AlwaysRebuild() &&
11592       Callee.get() == E->getCallee() &&
11593       First.get() == E->getArg(0) &&
11594       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11595     return SemaRef.MaybeBindToTemporary(E);
11596 
11597   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11598   FPOptionsOverride NewOverrides(E->getFPFeatures());
11599   getSema().CurFPFeatures =
11600       NewOverrides.applyOverrides(getSema().getLangOpts());
11601   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11602 
11603   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11604                                                  E->getOperatorLoc(),
11605                                                  Callee.get(),
11606                                                  First.get(),
11607                                                  Second.get());
11608 }
11609 
11610 template<typename Derived>
11611 ExprResult
11612 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11613   return getDerived().TransformCallExpr(E);
11614 }
11615 
11616 template <typename Derived>
11617 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11618   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11619                          getSema().CurContext != E->getParentContext();
11620 
11621   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11622     return E;
11623 
11624   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11625                                            E->getEndLoc(),
11626                                            getSema().CurContext);
11627 }
11628 
11629 template<typename Derived>
11630 ExprResult
11631 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11632   // Transform the callee.
11633   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11634   if (Callee.isInvalid())
11635     return ExprError();
11636 
11637   // Transform exec config.
11638   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11639   if (EC.isInvalid())
11640     return ExprError();
11641 
11642   // Transform arguments.
11643   bool ArgChanged = false;
11644   SmallVector<Expr*, 8> Args;
11645   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11646                                   &ArgChanged))
11647     return ExprError();
11648 
11649   if (!getDerived().AlwaysRebuild() &&
11650       Callee.get() == E->getCallee() &&
11651       !ArgChanged)
11652     return SemaRef.MaybeBindToTemporary(E);
11653 
11654   // FIXME: Wrong source location information for the '('.
11655   SourceLocation FakeLParenLoc
11656     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11657   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11658                                       Args,
11659                                       E->getRParenLoc(), EC.get());
11660 }
11661 
11662 template<typename Derived>
11663 ExprResult
11664 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11665   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11666   if (!Type)
11667     return ExprError();
11668 
11669   ExprResult SubExpr
11670     = getDerived().TransformExpr(E->getSubExprAsWritten());
11671   if (SubExpr.isInvalid())
11672     return ExprError();
11673 
11674   if (!getDerived().AlwaysRebuild() &&
11675       Type == E->getTypeInfoAsWritten() &&
11676       SubExpr.get() == E->getSubExpr())
11677     return E;
11678   return getDerived().RebuildCXXNamedCastExpr(
11679       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11680       Type, E->getAngleBrackets().getEnd(),
11681       // FIXME. this should be '(' location
11682       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11683 }
11684 
11685 template<typename Derived>
11686 ExprResult
11687 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11688   TypeSourceInfo *TSI =
11689       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11690   if (!TSI)
11691     return ExprError();
11692 
11693   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11694   if (Sub.isInvalid())
11695     return ExprError();
11696 
11697   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11698                                                 Sub.get(), BCE->getEndLoc());
11699 }
11700 
11701 template<typename Derived>
11702 ExprResult
11703 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11704   return getDerived().TransformCXXNamedCastExpr(E);
11705 }
11706 
11707 template<typename Derived>
11708 ExprResult
11709 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11710   return getDerived().TransformCXXNamedCastExpr(E);
11711 }
11712 
11713 template<typename Derived>
11714 ExprResult
11715 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11716                                                       CXXReinterpretCastExpr *E) {
11717   return getDerived().TransformCXXNamedCastExpr(E);
11718 }
11719 
11720 template<typename Derived>
11721 ExprResult
11722 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11723   return getDerived().TransformCXXNamedCastExpr(E);
11724 }
11725 
11726 template<typename Derived>
11727 ExprResult
11728 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11729   return getDerived().TransformCXXNamedCastExpr(E);
11730 }
11731 
11732 template<typename Derived>
11733 ExprResult
11734 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11735                                                      CXXFunctionalCastExpr *E) {
11736   TypeSourceInfo *Type =
11737       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11738   if (!Type)
11739     return ExprError();
11740 
11741   ExprResult SubExpr
11742     = getDerived().TransformExpr(E->getSubExprAsWritten());
11743   if (SubExpr.isInvalid())
11744     return ExprError();
11745 
11746   if (!getDerived().AlwaysRebuild() &&
11747       Type == E->getTypeInfoAsWritten() &&
11748       SubExpr.get() == E->getSubExpr())
11749     return E;
11750 
11751   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11752                                                    E->getLParenLoc(),
11753                                                    SubExpr.get(),
11754                                                    E->getRParenLoc(),
11755                                                    E->isListInitialization());
11756 }
11757 
11758 template<typename Derived>
11759 ExprResult
11760 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11761   if (E->isTypeOperand()) {
11762     TypeSourceInfo *TInfo
11763       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11764     if (!TInfo)
11765       return ExprError();
11766 
11767     if (!getDerived().AlwaysRebuild() &&
11768         TInfo == E->getTypeOperandSourceInfo())
11769       return E;
11770 
11771     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11772                                              TInfo, E->getEndLoc());
11773   }
11774 
11775   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11776   // type.  We must not unilaterally enter unevaluated context here, as then
11777   // semantic processing can re-transform an already transformed operand.
11778   Expr *Op = E->getExprOperand();
11779   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11780   if (E->isGLValue())
11781     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11782       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11783         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11784 
11785   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11786                                                Sema::ReuseLambdaContextDecl);
11787 
11788   ExprResult SubExpr = getDerived().TransformExpr(Op);
11789   if (SubExpr.isInvalid())
11790     return ExprError();
11791 
11792   if (!getDerived().AlwaysRebuild() &&
11793       SubExpr.get() == E->getExprOperand())
11794     return E;
11795 
11796   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11797                                            SubExpr.get(), E->getEndLoc());
11798 }
11799 
11800 template<typename Derived>
11801 ExprResult
11802 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11803   if (E->isTypeOperand()) {
11804     TypeSourceInfo *TInfo
11805       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11806     if (!TInfo)
11807       return ExprError();
11808 
11809     if (!getDerived().AlwaysRebuild() &&
11810         TInfo == E->getTypeOperandSourceInfo())
11811       return E;
11812 
11813     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11814                                              TInfo, E->getEndLoc());
11815   }
11816 
11817   EnterExpressionEvaluationContext Unevaluated(
11818       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11819 
11820   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11821   if (SubExpr.isInvalid())
11822     return ExprError();
11823 
11824   if (!getDerived().AlwaysRebuild() &&
11825       SubExpr.get() == E->getExprOperand())
11826     return E;
11827 
11828   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11829                                            SubExpr.get(), E->getEndLoc());
11830 }
11831 
11832 template<typename Derived>
11833 ExprResult
11834 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11835   return E;
11836 }
11837 
11838 template<typename Derived>
11839 ExprResult
11840 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11841                                                      CXXNullPtrLiteralExpr *E) {
11842   return E;
11843 }
11844 
11845 template<typename Derived>
11846 ExprResult
11847 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11848   QualType T = getSema().getCurrentThisType();
11849 
11850   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11851     // Mark it referenced in the new context regardless.
11852     // FIXME: this is a bit instantiation-specific.
11853     getSema().MarkThisReferenced(E);
11854     return E;
11855   }
11856 
11857   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11858 }
11859 
11860 template<typename Derived>
11861 ExprResult
11862 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11863   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11864   if (SubExpr.isInvalid())
11865     return ExprError();
11866 
11867   if (!getDerived().AlwaysRebuild() &&
11868       SubExpr.get() == E->getSubExpr())
11869     return E;
11870 
11871   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11872                                           E->isThrownVariableInScope());
11873 }
11874 
11875 template<typename Derived>
11876 ExprResult
11877 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11878   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11879       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11880   if (!Param)
11881     return ExprError();
11882 
11883   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11884       E->getUsedContext() == SemaRef.CurContext)
11885     return E;
11886 
11887   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11888 }
11889 
11890 template<typename Derived>
11891 ExprResult
11892 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11893   FieldDecl *Field = cast_or_null<FieldDecl>(
11894       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11895   if (!Field)
11896     return ExprError();
11897 
11898   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11899       E->getUsedContext() == SemaRef.CurContext)
11900     return E;
11901 
11902   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11903 }
11904 
11905 template<typename Derived>
11906 ExprResult
11907 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11908                                                     CXXScalarValueInitExpr *E) {
11909   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11910   if (!T)
11911     return ExprError();
11912 
11913   if (!getDerived().AlwaysRebuild() &&
11914       T == E->getTypeSourceInfo())
11915     return E;
11916 
11917   return getDerived().RebuildCXXScalarValueInitExpr(T,
11918                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11919                                                     E->getRParenLoc());
11920 }
11921 
11922 template<typename Derived>
11923 ExprResult
11924 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11925   // Transform the type that we're allocating
11926   TypeSourceInfo *AllocTypeInfo =
11927       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11928   if (!AllocTypeInfo)
11929     return ExprError();
11930 
11931   // Transform the size of the array we're allocating (if any).
11932   Optional<Expr *> ArraySize;
11933   if (E->isArray()) {
11934     ExprResult NewArraySize;
11935     if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11936       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11937       if (NewArraySize.isInvalid())
11938         return ExprError();
11939     }
11940     ArraySize = NewArraySize.get();
11941   }
11942 
11943   // Transform the placement arguments (if any).
11944   bool ArgumentChanged = false;
11945   SmallVector<Expr*, 8> PlacementArgs;
11946   if (getDerived().TransformExprs(E->getPlacementArgs(),
11947                                   E->getNumPlacementArgs(), true,
11948                                   PlacementArgs, &ArgumentChanged))
11949     return ExprError();
11950 
11951   // Transform the initializer (if any).
11952   Expr *OldInit = E->getInitializer();
11953   ExprResult NewInit;
11954   if (OldInit)
11955     NewInit = getDerived().TransformInitializer(OldInit, true);
11956   if (NewInit.isInvalid())
11957     return ExprError();
11958 
11959   // Transform new operator and delete operator.
11960   FunctionDecl *OperatorNew = nullptr;
11961   if (E->getOperatorNew()) {
11962     OperatorNew = cast_or_null<FunctionDecl>(
11963         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11964     if (!OperatorNew)
11965       return ExprError();
11966   }
11967 
11968   FunctionDecl *OperatorDelete = nullptr;
11969   if (E->getOperatorDelete()) {
11970     OperatorDelete = cast_or_null<FunctionDecl>(
11971         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11972     if (!OperatorDelete)
11973       return ExprError();
11974   }
11975 
11976   if (!getDerived().AlwaysRebuild() &&
11977       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11978       ArraySize == E->getArraySize() &&
11979       NewInit.get() == OldInit &&
11980       OperatorNew == E->getOperatorNew() &&
11981       OperatorDelete == E->getOperatorDelete() &&
11982       !ArgumentChanged) {
11983     // Mark any declarations we need as referenced.
11984     // FIXME: instantiation-specific.
11985     if (OperatorNew)
11986       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11987     if (OperatorDelete)
11988       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11989 
11990     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11991       QualType ElementType
11992         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11993       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11994         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11995         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11996           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11997         }
11998       }
11999     }
12000 
12001     return E;
12002   }
12003 
12004   QualType AllocType = AllocTypeInfo->getType();
12005   if (!ArraySize) {
12006     // If no array size was specified, but the new expression was
12007     // instantiated with an array type (e.g., "new T" where T is
12008     // instantiated with "int[4]"), extract the outer bound from the
12009     // array type as our array size. We do this with constant and
12010     // dependently-sized array types.
12011     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12012     if (!ArrayT) {
12013       // Do nothing
12014     } else if (const ConstantArrayType *ConsArrayT
12015                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12016       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12017                                          SemaRef.Context.getSizeType(),
12018                                          /*FIXME:*/ E->getBeginLoc());
12019       AllocType = ConsArrayT->getElementType();
12020     } else if (const DependentSizedArrayType *DepArrayT
12021                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12022       if (DepArrayT->getSizeExpr()) {
12023         ArraySize = DepArrayT->getSizeExpr();
12024         AllocType = DepArrayT->getElementType();
12025       }
12026     }
12027   }
12028 
12029   return getDerived().RebuildCXXNewExpr(
12030       E->getBeginLoc(), E->isGlobalNew(),
12031       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12032       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12033       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12034 }
12035 
12036 template<typename Derived>
12037 ExprResult
12038 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12039   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12040   if (Operand.isInvalid())
12041     return ExprError();
12042 
12043   // Transform the delete operator, if known.
12044   FunctionDecl *OperatorDelete = nullptr;
12045   if (E->getOperatorDelete()) {
12046     OperatorDelete = cast_or_null<FunctionDecl>(
12047         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12048     if (!OperatorDelete)
12049       return ExprError();
12050   }
12051 
12052   if (!getDerived().AlwaysRebuild() &&
12053       Operand.get() == E->getArgument() &&
12054       OperatorDelete == E->getOperatorDelete()) {
12055     // Mark any declarations we need as referenced.
12056     // FIXME: instantiation-specific.
12057     if (OperatorDelete)
12058       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12059 
12060     if (!E->getArgument()->isTypeDependent()) {
12061       QualType Destroyed = SemaRef.Context.getBaseElementType(
12062                                                          E->getDestroyedType());
12063       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12064         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12065         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12066                                        SemaRef.LookupDestructor(Record));
12067       }
12068     }
12069 
12070     return E;
12071   }
12072 
12073   return getDerived().RebuildCXXDeleteExpr(
12074       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12075 }
12076 
12077 template<typename Derived>
12078 ExprResult
12079 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12080                                                      CXXPseudoDestructorExpr *E) {
12081   ExprResult Base = getDerived().TransformExpr(E->getBase());
12082   if (Base.isInvalid())
12083     return ExprError();
12084 
12085   ParsedType ObjectTypePtr;
12086   bool MayBePseudoDestructor = false;
12087   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12088                                               E->getOperatorLoc(),
12089                                         E->isArrow()? tok::arrow : tok::period,
12090                                               ObjectTypePtr,
12091                                               MayBePseudoDestructor);
12092   if (Base.isInvalid())
12093     return ExprError();
12094 
12095   QualType ObjectType = ObjectTypePtr.get();
12096   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12097   if (QualifierLoc) {
12098     QualifierLoc
12099       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12100     if (!QualifierLoc)
12101       return ExprError();
12102   }
12103   CXXScopeSpec SS;
12104   SS.Adopt(QualifierLoc);
12105 
12106   PseudoDestructorTypeStorage Destroyed;
12107   if (E->getDestroyedTypeInfo()) {
12108     TypeSourceInfo *DestroyedTypeInfo
12109       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12110                                                 ObjectType, nullptr, SS);
12111     if (!DestroyedTypeInfo)
12112       return ExprError();
12113     Destroyed = DestroyedTypeInfo;
12114   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12115     // We aren't likely to be able to resolve the identifier down to a type
12116     // now anyway, so just retain the identifier.
12117     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12118                                             E->getDestroyedTypeLoc());
12119   } else {
12120     // Look for a destructor known with the given name.
12121     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12122                                               *E->getDestroyedTypeIdentifier(),
12123                                                 E->getDestroyedTypeLoc(),
12124                                                 /*Scope=*/nullptr,
12125                                                 SS, ObjectTypePtr,
12126                                                 false);
12127     if (!T)
12128       return ExprError();
12129 
12130     Destroyed
12131       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12132                                                  E->getDestroyedTypeLoc());
12133   }
12134 
12135   TypeSourceInfo *ScopeTypeInfo = nullptr;
12136   if (E->getScopeTypeInfo()) {
12137     CXXScopeSpec EmptySS;
12138     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12139                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12140     if (!ScopeTypeInfo)
12141       return ExprError();
12142   }
12143 
12144   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12145                                                      E->getOperatorLoc(),
12146                                                      E->isArrow(),
12147                                                      SS,
12148                                                      ScopeTypeInfo,
12149                                                      E->getColonColonLoc(),
12150                                                      E->getTildeLoc(),
12151                                                      Destroyed);
12152 }
12153 
12154 template <typename Derived>
12155 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12156                                                         bool RequiresADL,
12157                                                         LookupResult &R) {
12158   // Transform all the decls.
12159   bool AllEmptyPacks = true;
12160   for (auto *OldD : Old->decls()) {
12161     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12162     if (!InstD) {
12163       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12164       // This can happen because of dependent hiding.
12165       if (isa<UsingShadowDecl>(OldD))
12166         continue;
12167       else {
12168         R.clear();
12169         return true;
12170       }
12171     }
12172 
12173     // Expand using pack declarations.
12174     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12175     ArrayRef<NamedDecl*> Decls = SingleDecl;
12176     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12177       Decls = UPD->expansions();
12178 
12179     // Expand using declarations.
12180     for (auto *D : Decls) {
12181       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12182         for (auto *SD : UD->shadows())
12183           R.addDecl(SD);
12184       } else {
12185         R.addDecl(D);
12186       }
12187     }
12188 
12189     AllEmptyPacks &= Decls.empty();
12190   };
12191 
12192   // C++ [temp.res]/8.4.2:
12193   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12194   //   a name in the template definition found a using-declaration, but the
12195   //   lookup in the corresponding scope in the instantiation odoes not find
12196   //   any declarations because the using-declaration was a pack expansion and
12197   //   the corresponding pack is empty
12198   if (AllEmptyPacks && !RequiresADL) {
12199     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12200         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12201     return true;
12202   }
12203 
12204   // Resolve a kind, but don't do any further analysis.  If it's
12205   // ambiguous, the callee needs to deal with it.
12206   R.resolveKind();
12207   return false;
12208 }
12209 
12210 template<typename Derived>
12211 ExprResult
12212 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12213                                                   UnresolvedLookupExpr *Old) {
12214   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12215                  Sema::LookupOrdinaryName);
12216 
12217   // Transform the declaration set.
12218   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12219     return ExprError();
12220 
12221   // Rebuild the nested-name qualifier, if present.
12222   CXXScopeSpec SS;
12223   if (Old->getQualifierLoc()) {
12224     NestedNameSpecifierLoc QualifierLoc
12225       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12226     if (!QualifierLoc)
12227       return ExprError();
12228 
12229     SS.Adopt(QualifierLoc);
12230   }
12231 
12232   if (Old->getNamingClass()) {
12233     CXXRecordDecl *NamingClass
12234       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12235                                                             Old->getNameLoc(),
12236                                                         Old->getNamingClass()));
12237     if (!NamingClass) {
12238       R.clear();
12239       return ExprError();
12240     }
12241 
12242     R.setNamingClass(NamingClass);
12243   }
12244 
12245   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12246 
12247   // If we have neither explicit template arguments, nor the template keyword,
12248   // it's a normal declaration name or member reference.
12249   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12250     NamedDecl *D = R.getAsSingle<NamedDecl>();
12251     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12252     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12253     // give a good diagnostic.
12254     if (D && D->isCXXInstanceMember()) {
12255       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12256                                                      /*TemplateArgs=*/nullptr,
12257                                                      /*Scope=*/nullptr);
12258     }
12259 
12260     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12261   }
12262 
12263   // If we have template arguments, rebuild them, then rebuild the
12264   // templateid expression.
12265   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12266   if (Old->hasExplicitTemplateArgs() &&
12267       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12268                                               Old->getNumTemplateArgs(),
12269                                               TransArgs)) {
12270     R.clear();
12271     return ExprError();
12272   }
12273 
12274   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12275                                             Old->requiresADL(), &TransArgs);
12276 }
12277 
12278 template<typename Derived>
12279 ExprResult
12280 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12281   bool ArgChanged = false;
12282   SmallVector<TypeSourceInfo *, 4> Args;
12283   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12284     TypeSourceInfo *From = E->getArg(I);
12285     TypeLoc FromTL = From->getTypeLoc();
12286     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12287       TypeLocBuilder TLB;
12288       TLB.reserve(FromTL.getFullDataSize());
12289       QualType To = getDerived().TransformType(TLB, FromTL);
12290       if (To.isNull())
12291         return ExprError();
12292 
12293       if (To == From->getType())
12294         Args.push_back(From);
12295       else {
12296         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12297         ArgChanged = true;
12298       }
12299       continue;
12300     }
12301 
12302     ArgChanged = true;
12303 
12304     // We have a pack expansion. Instantiate it.
12305     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12306     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12307     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12308     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12309 
12310     // Determine whether the set of unexpanded parameter packs can and should
12311     // be expanded.
12312     bool Expand = true;
12313     bool RetainExpansion = false;
12314     Optional<unsigned> OrigNumExpansions =
12315         ExpansionTL.getTypePtr()->getNumExpansions();
12316     Optional<unsigned> NumExpansions = OrigNumExpansions;
12317     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12318                                              PatternTL.getSourceRange(),
12319                                              Unexpanded,
12320                                              Expand, RetainExpansion,
12321                                              NumExpansions))
12322       return ExprError();
12323 
12324     if (!Expand) {
12325       // The transform has determined that we should perform a simple
12326       // transformation on the pack expansion, producing another pack
12327       // expansion.
12328       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12329 
12330       TypeLocBuilder TLB;
12331       TLB.reserve(From->getTypeLoc().getFullDataSize());
12332 
12333       QualType To = getDerived().TransformType(TLB, PatternTL);
12334       if (To.isNull())
12335         return ExprError();
12336 
12337       To = getDerived().RebuildPackExpansionType(To,
12338                                                  PatternTL.getSourceRange(),
12339                                                  ExpansionTL.getEllipsisLoc(),
12340                                                  NumExpansions);
12341       if (To.isNull())
12342         return ExprError();
12343 
12344       PackExpansionTypeLoc ToExpansionTL
12345         = TLB.push<PackExpansionTypeLoc>(To);
12346       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12347       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12348       continue;
12349     }
12350 
12351     // Expand the pack expansion by substituting for each argument in the
12352     // pack(s).
12353     for (unsigned I = 0; I != *NumExpansions; ++I) {
12354       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12355       TypeLocBuilder TLB;
12356       TLB.reserve(PatternTL.getFullDataSize());
12357       QualType To = getDerived().TransformType(TLB, PatternTL);
12358       if (To.isNull())
12359         return ExprError();
12360 
12361       if (To->containsUnexpandedParameterPack()) {
12362         To = getDerived().RebuildPackExpansionType(To,
12363                                                    PatternTL.getSourceRange(),
12364                                                    ExpansionTL.getEllipsisLoc(),
12365                                                    NumExpansions);
12366         if (To.isNull())
12367           return ExprError();
12368 
12369         PackExpansionTypeLoc ToExpansionTL
12370           = TLB.push<PackExpansionTypeLoc>(To);
12371         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12372       }
12373 
12374       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12375     }
12376 
12377     if (!RetainExpansion)
12378       continue;
12379 
12380     // If we're supposed to retain a pack expansion, do so by temporarily
12381     // forgetting the partially-substituted parameter pack.
12382     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12383 
12384     TypeLocBuilder TLB;
12385     TLB.reserve(From->getTypeLoc().getFullDataSize());
12386 
12387     QualType To = getDerived().TransformType(TLB, PatternTL);
12388     if (To.isNull())
12389       return ExprError();
12390 
12391     To = getDerived().RebuildPackExpansionType(To,
12392                                                PatternTL.getSourceRange(),
12393                                                ExpansionTL.getEllipsisLoc(),
12394                                                NumExpansions);
12395     if (To.isNull())
12396       return ExprError();
12397 
12398     PackExpansionTypeLoc ToExpansionTL
12399       = TLB.push<PackExpansionTypeLoc>(To);
12400     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12401     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12402   }
12403 
12404   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12405     return E;
12406 
12407   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12408                                        E->getEndLoc());
12409 }
12410 
12411 template<typename Derived>
12412 ExprResult
12413 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12414                                                  ConceptSpecializationExpr *E) {
12415   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12416   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12417   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12418                                               Old->NumTemplateArgs, TransArgs))
12419     return ExprError();
12420 
12421   return getDerived().RebuildConceptSpecializationExpr(
12422       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12423       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12424       &TransArgs);
12425 }
12426 
12427 template<typename Derived>
12428 ExprResult
12429 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12430   SmallVector<ParmVarDecl*, 4> TransParams;
12431   SmallVector<QualType, 4> TransParamTypes;
12432   Sema::ExtParameterInfoBuilder ExtParamInfos;
12433 
12434   // C++2a [expr.prim.req]p2
12435   // Expressions appearing within a requirement-body are unevaluated operands.
12436   EnterExpressionEvaluationContext Ctx(
12437       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12438 
12439   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12440       getSema().Context, getSema().CurContext,
12441       E->getBody()->getBeginLoc());
12442 
12443   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12444 
12445   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12446                                                E->getLocalParameters(),
12447                                                /*ParamTypes=*/nullptr,
12448                                                /*ParamInfos=*/nullptr,
12449                                                TransParamTypes, &TransParams,
12450                                                ExtParamInfos))
12451     return ExprError();
12452 
12453   for (ParmVarDecl *Param : TransParams)
12454     Param->setDeclContext(Body);
12455 
12456   SmallVector<concepts::Requirement *, 4> TransReqs;
12457   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12458                                                      TransReqs))
12459     return ExprError();
12460 
12461   for (concepts::Requirement *Req : TransReqs) {
12462     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12463       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12464         ER->getReturnTypeRequirement()
12465                 .getTypeConstraintTemplateParameterList()->getParam(0)
12466                 ->setDeclContext(Body);
12467       }
12468     }
12469   }
12470 
12471   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12472                                           TransParams, TransReqs,
12473                                           E->getRBraceLoc());
12474 }
12475 
12476 template<typename Derived>
12477 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12478     ArrayRef<concepts::Requirement *> Reqs,
12479     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12480   for (concepts::Requirement *Req : Reqs) {
12481     concepts::Requirement *TransReq = nullptr;
12482     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12483       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12484     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12485       TransReq = getDerived().TransformExprRequirement(ExprReq);
12486     else
12487       TransReq = getDerived().TransformNestedRequirement(
12488                      cast<concepts::NestedRequirement>(Req));
12489     if (!TransReq)
12490       return true;
12491     Transformed.push_back(TransReq);
12492   }
12493   return false;
12494 }
12495 
12496 template<typename Derived>
12497 concepts::TypeRequirement *
12498 TreeTransform<Derived>::TransformTypeRequirement(
12499     concepts::TypeRequirement *Req) {
12500   if (Req->isSubstitutionFailure()) {
12501     if (getDerived().AlwaysRebuild())
12502       return getDerived().RebuildTypeRequirement(
12503               Req->getSubstitutionDiagnostic());
12504     return Req;
12505   }
12506   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12507   if (!TransType)
12508     return nullptr;
12509   return getDerived().RebuildTypeRequirement(TransType);
12510 }
12511 
12512 template<typename Derived>
12513 concepts::ExprRequirement *
12514 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12515   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12516   if (Req->isExprSubstitutionFailure())
12517     TransExpr = Req->getExprSubstitutionDiagnostic();
12518   else {
12519     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12520     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12521       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12522     if (TransExprRes.isInvalid())
12523       return nullptr;
12524     TransExpr = TransExprRes.get();
12525   }
12526 
12527   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12528   const auto &RetReq = Req->getReturnTypeRequirement();
12529   if (RetReq.isEmpty())
12530     TransRetReq.emplace();
12531   else if (RetReq.isSubstitutionFailure())
12532     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12533   else if (RetReq.isTypeConstraint()) {
12534     TemplateParameterList *OrigTPL =
12535         RetReq.getTypeConstraintTemplateParameterList();
12536     TemplateParameterList *TPL =
12537         getDerived().TransformTemplateParameterList(OrigTPL);
12538     if (!TPL)
12539       return nullptr;
12540     TransRetReq.emplace(TPL);
12541   }
12542   assert(TransRetReq.hasValue() &&
12543          "All code paths leading here must set TransRetReq");
12544   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12545     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12546                                                Req->getNoexceptLoc(),
12547                                                std::move(*TransRetReq));
12548   return getDerived().RebuildExprRequirement(
12549       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12550       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12551 }
12552 
12553 template<typename Derived>
12554 concepts::NestedRequirement *
12555 TreeTransform<Derived>::TransformNestedRequirement(
12556     concepts::NestedRequirement *Req) {
12557   if (Req->isSubstitutionFailure()) {
12558     if (getDerived().AlwaysRebuild())
12559       return getDerived().RebuildNestedRequirement(
12560           Req->getSubstitutionDiagnostic());
12561     return Req;
12562   }
12563   ExprResult TransConstraint =
12564       getDerived().TransformExpr(Req->getConstraintExpr());
12565   if (TransConstraint.isInvalid())
12566     return nullptr;
12567   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12568 }
12569 
12570 template<typename Derived>
12571 ExprResult
12572 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12573   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12574   if (!T)
12575     return ExprError();
12576 
12577   if (!getDerived().AlwaysRebuild() &&
12578       T == E->getQueriedTypeSourceInfo())
12579     return E;
12580 
12581   ExprResult SubExpr;
12582   {
12583     EnterExpressionEvaluationContext Unevaluated(
12584         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12585     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12586     if (SubExpr.isInvalid())
12587       return ExprError();
12588 
12589     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12590       return E;
12591   }
12592 
12593   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12594                                             SubExpr.get(), E->getEndLoc());
12595 }
12596 
12597 template<typename Derived>
12598 ExprResult
12599 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12600   ExprResult SubExpr;
12601   {
12602     EnterExpressionEvaluationContext Unevaluated(
12603         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12604     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12605     if (SubExpr.isInvalid())
12606       return ExprError();
12607 
12608     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12609       return E;
12610   }
12611 
12612   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12613                                              SubExpr.get(), E->getEndLoc());
12614 }
12615 
12616 template <typename Derived>
12617 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12618     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12619     TypeSourceInfo **RecoveryTSI) {
12620   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12621       DRE, AddrTaken, RecoveryTSI);
12622 
12623   // Propagate both errors and recovered types, which return ExprEmpty.
12624   if (!NewDRE.isUsable())
12625     return NewDRE;
12626 
12627   // We got an expr, wrap it up in parens.
12628   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12629     return PE;
12630   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12631                                        PE->getRParen());
12632 }
12633 
12634 template <typename Derived>
12635 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12636     DependentScopeDeclRefExpr *E) {
12637   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12638                                             nullptr);
12639 }
12640 
12641 template <typename Derived>
12642 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12643     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12644     TypeSourceInfo **RecoveryTSI) {
12645   assert(E->getQualifierLoc());
12646   NestedNameSpecifierLoc QualifierLoc =
12647       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12648   if (!QualifierLoc)
12649     return ExprError();
12650   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12651 
12652   // TODO: If this is a conversion-function-id, verify that the
12653   // destination type name (if present) resolves the same way after
12654   // instantiation as it did in the local scope.
12655 
12656   DeclarationNameInfo NameInfo =
12657       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12658   if (!NameInfo.getName())
12659     return ExprError();
12660 
12661   if (!E->hasExplicitTemplateArgs()) {
12662     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12663         // Note: it is sufficient to compare the Name component of NameInfo:
12664         // if name has not changed, DNLoc has not changed either.
12665         NameInfo.getName() == E->getDeclName())
12666       return E;
12667 
12668     return getDerived().RebuildDependentScopeDeclRefExpr(
12669         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12670         IsAddressOfOperand, RecoveryTSI);
12671   }
12672 
12673   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12674   if (getDerived().TransformTemplateArguments(
12675           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12676     return ExprError();
12677 
12678   return getDerived().RebuildDependentScopeDeclRefExpr(
12679       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12680       RecoveryTSI);
12681 }
12682 
12683 template<typename Derived>
12684 ExprResult
12685 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12686   // CXXConstructExprs other than for list-initialization and
12687   // CXXTemporaryObjectExpr are always implicit, so when we have
12688   // a 1-argument construction we just transform that argument.
12689   if (getDerived().AllowSkippingCXXConstructExpr() &&
12690       ((E->getNumArgs() == 1 ||
12691         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12692        (!getDerived().DropCallArgument(E->getArg(0))) &&
12693        !E->isListInitialization()))
12694     return getDerived().TransformInitializer(E->getArg(0),
12695                                              /*DirectInit*/ false);
12696 
12697   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12698 
12699   QualType T = getDerived().TransformType(E->getType());
12700   if (T.isNull())
12701     return ExprError();
12702 
12703   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12704       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12705   if (!Constructor)
12706     return ExprError();
12707 
12708   bool ArgumentChanged = false;
12709   SmallVector<Expr*, 8> Args;
12710   {
12711     EnterExpressionEvaluationContext Context(
12712         getSema(), EnterExpressionEvaluationContext::InitList,
12713         E->isListInitialization());
12714     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12715                                     &ArgumentChanged))
12716       return ExprError();
12717   }
12718 
12719   if (!getDerived().AlwaysRebuild() &&
12720       T == E->getType() &&
12721       Constructor == E->getConstructor() &&
12722       !ArgumentChanged) {
12723     // Mark the constructor as referenced.
12724     // FIXME: Instantiation-specific
12725     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12726     return E;
12727   }
12728 
12729   return getDerived().RebuildCXXConstructExpr(
12730       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12731       E->hadMultipleCandidates(), E->isListInitialization(),
12732       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12733       E->getConstructionKind(), E->getParenOrBraceRange());
12734 }
12735 
12736 template<typename Derived>
12737 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12738     CXXInheritedCtorInitExpr *E) {
12739   QualType T = getDerived().TransformType(E->getType());
12740   if (T.isNull())
12741     return ExprError();
12742 
12743   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12744       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12745   if (!Constructor)
12746     return ExprError();
12747 
12748   if (!getDerived().AlwaysRebuild() &&
12749       T == E->getType() &&
12750       Constructor == E->getConstructor()) {
12751     // Mark the constructor as referenced.
12752     // FIXME: Instantiation-specific
12753     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12754     return E;
12755   }
12756 
12757   return getDerived().RebuildCXXInheritedCtorInitExpr(
12758       T, E->getLocation(), Constructor,
12759       E->constructsVBase(), E->inheritedFromVBase());
12760 }
12761 
12762 /// Transform a C++ temporary-binding expression.
12763 ///
12764 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12765 /// transform the subexpression and return that.
12766 template<typename Derived>
12767 ExprResult
12768 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12769   if (auto *Dtor = E->getTemporary()->getDestructor())
12770     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12771                                    const_cast<CXXDestructorDecl *>(Dtor));
12772   return getDerived().TransformExpr(E->getSubExpr());
12773 }
12774 
12775 /// Transform a C++ expression that contains cleanups that should
12776 /// be run after the expression is evaluated.
12777 ///
12778 /// Since ExprWithCleanups nodes are implicitly generated, we
12779 /// just transform the subexpression and return that.
12780 template<typename Derived>
12781 ExprResult
12782 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12783   return getDerived().TransformExpr(E->getSubExpr());
12784 }
12785 
12786 template<typename Derived>
12787 ExprResult
12788 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12789                                                     CXXTemporaryObjectExpr *E) {
12790   TypeSourceInfo *T =
12791       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12792   if (!T)
12793     return ExprError();
12794 
12795   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12796       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12797   if (!Constructor)
12798     return ExprError();
12799 
12800   bool ArgumentChanged = false;
12801   SmallVector<Expr*, 8> Args;
12802   Args.reserve(E->getNumArgs());
12803   {
12804     EnterExpressionEvaluationContext Context(
12805         getSema(), EnterExpressionEvaluationContext::InitList,
12806         E->isListInitialization());
12807     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12808                        &ArgumentChanged))
12809       return ExprError();
12810   }
12811 
12812   if (!getDerived().AlwaysRebuild() &&
12813       T == E->getTypeSourceInfo() &&
12814       Constructor == E->getConstructor() &&
12815       !ArgumentChanged) {
12816     // FIXME: Instantiation-specific
12817     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12818     return SemaRef.MaybeBindToTemporary(E);
12819   }
12820 
12821   // FIXME: We should just pass E->isListInitialization(), but we're not
12822   // prepared to handle list-initialization without a child InitListExpr.
12823   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12824   return getDerived().RebuildCXXTemporaryObjectExpr(
12825       T, LParenLoc, Args, E->getEndLoc(),
12826       /*ListInitialization=*/LParenLoc.isInvalid());
12827 }
12828 
12829 template<typename Derived>
12830 ExprResult
12831 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12832   // Transform any init-capture expressions before entering the scope of the
12833   // lambda body, because they are not semantically within that scope.
12834   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12835   struct TransformedInitCapture {
12836     // The location of the ... if the result is retaining a pack expansion.
12837     SourceLocation EllipsisLoc;
12838     // Zero or more expansions of the init-capture.
12839     SmallVector<InitCaptureInfoTy, 4> Expansions;
12840   };
12841   SmallVector<TransformedInitCapture, 4> InitCaptures;
12842   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12843   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12844                                     CEnd = E->capture_end();
12845        C != CEnd; ++C) {
12846     if (!E->isInitCapture(C))
12847       continue;
12848 
12849     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12850     VarDecl *OldVD = C->getCapturedVar();
12851 
12852     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12853                                 Optional<unsigned> NumExpansions) {
12854       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12855           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12856 
12857       if (NewExprInitResult.isInvalid()) {
12858         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12859         return;
12860       }
12861       Expr *NewExprInit = NewExprInitResult.get();
12862 
12863       QualType NewInitCaptureType =
12864           getSema().buildLambdaInitCaptureInitialization(
12865               C->getLocation(), OldVD->getType()->isReferenceType(),
12866               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12867               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12868               NewExprInit);
12869       Result.Expansions.push_back(
12870           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12871     };
12872 
12873     // If this is an init-capture pack, consider expanding the pack now.
12874     if (OldVD->isParameterPack()) {
12875       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12876                                              ->getTypeLoc()
12877                                              .castAs<PackExpansionTypeLoc>();
12878       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12879       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12880 
12881       // Determine whether the set of unexpanded parameter packs can and should
12882       // be expanded.
12883       bool Expand = true;
12884       bool RetainExpansion = false;
12885       Optional<unsigned> OrigNumExpansions =
12886           ExpansionTL.getTypePtr()->getNumExpansions();
12887       Optional<unsigned> NumExpansions = OrigNumExpansions;
12888       if (getDerived().TryExpandParameterPacks(
12889               ExpansionTL.getEllipsisLoc(),
12890               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12891               RetainExpansion, NumExpansions))
12892         return ExprError();
12893       if (Expand) {
12894         for (unsigned I = 0; I != *NumExpansions; ++I) {
12895           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12896           SubstInitCapture(SourceLocation(), None);
12897         }
12898       }
12899       if (!Expand || RetainExpansion) {
12900         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12901         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12902         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12903       }
12904     } else {
12905       SubstInitCapture(SourceLocation(), None);
12906     }
12907   }
12908 
12909   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12910   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12911 
12912   // Transform the template parameters, and add them to the current
12913   // instantiation scope. The null case is handled correctly.
12914   auto TPL = getDerived().TransformTemplateParameterList(
12915       E->getTemplateParameterList());
12916   LSI->GLTemplateParameterList = TPL;
12917 
12918   // Transform the type of the original lambda's call operator.
12919   // The transformation MUST be done in the CurrentInstantiationScope since
12920   // it introduces a mapping of the original to the newly created
12921   // transformed parameters.
12922   TypeSourceInfo *NewCallOpTSI = nullptr;
12923   {
12924     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12925     FunctionProtoTypeLoc OldCallOpFPTL =
12926         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12927 
12928     TypeLocBuilder NewCallOpTLBuilder;
12929     SmallVector<QualType, 4> ExceptionStorage;
12930     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12931     QualType NewCallOpType = TransformFunctionProtoType(
12932         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12933         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12934           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12935                                               ExceptionStorage, Changed);
12936         });
12937     if (NewCallOpType.isNull())
12938       return ExprError();
12939     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12940                                                         NewCallOpType);
12941   }
12942 
12943   // Transform the trailing requires clause
12944   ExprResult NewTrailingRequiresClause;
12945   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12946     // FIXME: Concepts: Substitution into requires clause should only happen
12947     //                  when checking satisfaction.
12948     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12949 
12950   // Create the local class that will describe the lambda.
12951   // FIXME: KnownDependent below is wrong when substituting inside a templated
12952   // context that isn't a DeclContext (such as a variable template).
12953   CXXRecordDecl *OldClass = E->getLambdaClass();
12954   CXXRecordDecl *Class
12955     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12956                                         NewCallOpTSI,
12957                                         /*KnownDependent=*/false,
12958                                         E->getCaptureDefault());
12959   getDerived().transformedLocalDecl(OldClass, {Class});
12960 
12961   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12962   if (getDerived().ReplacingOriginal())
12963     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12964                                OldClass->getLambdaManglingNumber(),
12965                                OldClass->getDeviceLambdaManglingNumber(),
12966                                OldClass->getLambdaContextDecl());
12967 
12968   // Build the call operator.
12969   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12970       Class, E->getIntroducerRange(), NewCallOpTSI,
12971       E->getCallOperator()->getEndLoc(),
12972       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12973       E->getCallOperator()->getConstexprKind(),
12974       NewTrailingRequiresClause.get());
12975 
12976   LSI->CallOperator = NewCallOperator;
12977 
12978   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12979   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12980 
12981   // Number the lambda for linkage purposes if necessary.
12982   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12983 
12984   // Introduce the context of the call operator.
12985   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12986                                  /*NewThisContext*/false);
12987 
12988   // Enter the scope of the lambda.
12989   getSema().buildLambdaScope(LSI, NewCallOperator,
12990                              E->getIntroducerRange(),
12991                              E->getCaptureDefault(),
12992                              E->getCaptureDefaultLoc(),
12993                              E->hasExplicitParameters(),
12994                              E->hasExplicitResultType(),
12995                              E->isMutable());
12996 
12997   bool Invalid = false;
12998 
12999   // Transform captures.
13000   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13001                                  CEnd = E->capture_end();
13002        C != CEnd; ++C) {
13003     // When we hit the first implicit capture, tell Sema that we've finished
13004     // the list of explicit captures.
13005     if (C->isImplicit())
13006       break;
13007 
13008     // Capturing 'this' is trivial.
13009     if (C->capturesThis()) {
13010       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13011                                     /*BuildAndDiagnose*/ true, nullptr,
13012                                     C->getCaptureKind() == LCK_StarThis);
13013       continue;
13014     }
13015     // Captured expression will be recaptured during captured variables
13016     // rebuilding.
13017     if (C->capturesVLAType())
13018       continue;
13019 
13020     // Rebuild init-captures, including the implied field declaration.
13021     if (E->isInitCapture(C)) {
13022       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13023 
13024       VarDecl *OldVD = C->getCapturedVar();
13025       llvm::SmallVector<Decl*, 4> NewVDs;
13026 
13027       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13028         ExprResult Init = Info.first;
13029         QualType InitQualType = Info.second;
13030         if (Init.isInvalid() || InitQualType.isNull()) {
13031           Invalid = true;
13032           break;
13033         }
13034         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13035             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13036             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13037         if (!NewVD) {
13038           Invalid = true;
13039           break;
13040         }
13041         NewVDs.push_back(NewVD);
13042         getSema().addInitCapture(LSI, NewVD);
13043       }
13044 
13045       if (Invalid)
13046         break;
13047 
13048       getDerived().transformedLocalDecl(OldVD, NewVDs);
13049       continue;
13050     }
13051 
13052     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13053 
13054     // Determine the capture kind for Sema.
13055     Sema::TryCaptureKind Kind
13056       = C->isImplicit()? Sema::TryCapture_Implicit
13057                        : C->getCaptureKind() == LCK_ByCopy
13058                            ? Sema::TryCapture_ExplicitByVal
13059                            : Sema::TryCapture_ExplicitByRef;
13060     SourceLocation EllipsisLoc;
13061     if (C->isPackExpansion()) {
13062       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13063       bool ShouldExpand = false;
13064       bool RetainExpansion = false;
13065       Optional<unsigned> NumExpansions;
13066       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13067                                                C->getLocation(),
13068                                                Unexpanded,
13069                                                ShouldExpand, RetainExpansion,
13070                                                NumExpansions)) {
13071         Invalid = true;
13072         continue;
13073       }
13074 
13075       if (ShouldExpand) {
13076         // The transform has determined that we should perform an expansion;
13077         // transform and capture each of the arguments.
13078         // expansion of the pattern. Do so.
13079         VarDecl *Pack = C->getCapturedVar();
13080         for (unsigned I = 0; I != *NumExpansions; ++I) {
13081           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13082           VarDecl *CapturedVar
13083             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13084                                                                Pack));
13085           if (!CapturedVar) {
13086             Invalid = true;
13087             continue;
13088           }
13089 
13090           // Capture the transformed variable.
13091           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13092         }
13093 
13094         // FIXME: Retain a pack expansion if RetainExpansion is true.
13095 
13096         continue;
13097       }
13098 
13099       EllipsisLoc = C->getEllipsisLoc();
13100     }
13101 
13102     // Transform the captured variable.
13103     VarDecl *CapturedVar
13104       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13105                                                          C->getCapturedVar()));
13106     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13107       Invalid = true;
13108       continue;
13109     }
13110 
13111     // Capture the transformed variable.
13112     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13113                                  EllipsisLoc);
13114   }
13115   getSema().finishLambdaExplicitCaptures(LSI);
13116 
13117   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13118   // evaluation context even if we're not transforming the function body.
13119   getSema().PushExpressionEvaluationContext(
13120       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13121 
13122   // Instantiate the body of the lambda expression.
13123   StmtResult Body =
13124       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13125 
13126   // ActOnLambda* will pop the function scope for us.
13127   FuncScopeCleanup.disable();
13128 
13129   if (Body.isInvalid()) {
13130     SavedContext.pop();
13131     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13132                                /*IsInstantiation=*/true);
13133     return ExprError();
13134   }
13135 
13136   // Copy the LSI before ActOnFinishFunctionBody removes it.
13137   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13138   // the call operator.
13139   auto LSICopy = *LSI;
13140   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13141                                     /*IsInstantiation*/ true);
13142   SavedContext.pop();
13143 
13144   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13145                                    &LSICopy);
13146 }
13147 
13148 template<typename Derived>
13149 StmtResult
13150 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13151   return TransformStmt(S);
13152 }
13153 
13154 template<typename Derived>
13155 StmtResult
13156 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13157   // Transform captures.
13158   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13159                                  CEnd = E->capture_end();
13160        C != CEnd; ++C) {
13161     // When we hit the first implicit capture, tell Sema that we've finished
13162     // the list of explicit captures.
13163     if (!C->isImplicit())
13164       continue;
13165 
13166     // Capturing 'this' is trivial.
13167     if (C->capturesThis()) {
13168       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13169                                     /*BuildAndDiagnose*/ true, nullptr,
13170                                     C->getCaptureKind() == LCK_StarThis);
13171       continue;
13172     }
13173     // Captured expression will be recaptured during captured variables
13174     // rebuilding.
13175     if (C->capturesVLAType())
13176       continue;
13177 
13178     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13179     assert(!E->isInitCapture(C) && "implicit init-capture?");
13180 
13181     // Transform the captured variable.
13182     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13183         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13184     if (!CapturedVar || CapturedVar->isInvalidDecl())
13185       return StmtError();
13186 
13187     // Capture the transformed variable.
13188     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13189   }
13190 
13191   return S;
13192 }
13193 
13194 template<typename Derived>
13195 ExprResult
13196 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13197                                                   CXXUnresolvedConstructExpr *E) {
13198   TypeSourceInfo *T =
13199       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13200   if (!T)
13201     return ExprError();
13202 
13203   bool ArgumentChanged = false;
13204   SmallVector<Expr*, 8> Args;
13205   Args.reserve(E->getNumArgs());
13206   {
13207     EnterExpressionEvaluationContext Context(
13208         getSema(), EnterExpressionEvaluationContext::InitList,
13209         E->isListInitialization());
13210     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13211                                     &ArgumentChanged))
13212       return ExprError();
13213   }
13214 
13215   if (!getDerived().AlwaysRebuild() &&
13216       T == E->getTypeSourceInfo() &&
13217       !ArgumentChanged)
13218     return E;
13219 
13220   // FIXME: we're faking the locations of the commas
13221   return getDerived().RebuildCXXUnresolvedConstructExpr(
13222       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13223 }
13224 
13225 template<typename Derived>
13226 ExprResult
13227 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13228                                              CXXDependentScopeMemberExpr *E) {
13229   // Transform the base of the expression.
13230   ExprResult Base((Expr*) nullptr);
13231   Expr *OldBase;
13232   QualType BaseType;
13233   QualType ObjectType;
13234   if (!E->isImplicitAccess()) {
13235     OldBase = E->getBase();
13236     Base = getDerived().TransformExpr(OldBase);
13237     if (Base.isInvalid())
13238       return ExprError();
13239 
13240     // Start the member reference and compute the object's type.
13241     ParsedType ObjectTy;
13242     bool MayBePseudoDestructor = false;
13243     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13244                                                 E->getOperatorLoc(),
13245                                       E->isArrow()? tok::arrow : tok::period,
13246                                                 ObjectTy,
13247                                                 MayBePseudoDestructor);
13248     if (Base.isInvalid())
13249       return ExprError();
13250 
13251     ObjectType = ObjectTy.get();
13252     BaseType = ((Expr*) Base.get())->getType();
13253   } else {
13254     OldBase = nullptr;
13255     BaseType = getDerived().TransformType(E->getBaseType());
13256     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13257   }
13258 
13259   // Transform the first part of the nested-name-specifier that qualifies
13260   // the member name.
13261   NamedDecl *FirstQualifierInScope
13262     = getDerived().TransformFirstQualifierInScope(
13263                                             E->getFirstQualifierFoundInScope(),
13264                                             E->getQualifierLoc().getBeginLoc());
13265 
13266   NestedNameSpecifierLoc QualifierLoc;
13267   if (E->getQualifier()) {
13268     QualifierLoc
13269       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13270                                                      ObjectType,
13271                                                      FirstQualifierInScope);
13272     if (!QualifierLoc)
13273       return ExprError();
13274   }
13275 
13276   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13277 
13278   // TODO: If this is a conversion-function-id, verify that the
13279   // destination type name (if present) resolves the same way after
13280   // instantiation as it did in the local scope.
13281 
13282   DeclarationNameInfo NameInfo
13283     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13284   if (!NameInfo.getName())
13285     return ExprError();
13286 
13287   if (!E->hasExplicitTemplateArgs()) {
13288     // This is a reference to a member without an explicitly-specified
13289     // template argument list. Optimize for this common case.
13290     if (!getDerived().AlwaysRebuild() &&
13291         Base.get() == OldBase &&
13292         BaseType == E->getBaseType() &&
13293         QualifierLoc == E->getQualifierLoc() &&
13294         NameInfo.getName() == E->getMember() &&
13295         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13296       return E;
13297 
13298     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13299                                                        BaseType,
13300                                                        E->isArrow(),
13301                                                        E->getOperatorLoc(),
13302                                                        QualifierLoc,
13303                                                        TemplateKWLoc,
13304                                                        FirstQualifierInScope,
13305                                                        NameInfo,
13306                                                        /*TemplateArgs*/nullptr);
13307   }
13308 
13309   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13310   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13311                                               E->getNumTemplateArgs(),
13312                                               TransArgs))
13313     return ExprError();
13314 
13315   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13316                                                      BaseType,
13317                                                      E->isArrow(),
13318                                                      E->getOperatorLoc(),
13319                                                      QualifierLoc,
13320                                                      TemplateKWLoc,
13321                                                      FirstQualifierInScope,
13322                                                      NameInfo,
13323                                                      &TransArgs);
13324 }
13325 
13326 template <typename Derived>
13327 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13328     UnresolvedMemberExpr *Old) {
13329   // Transform the base of the expression.
13330   ExprResult Base((Expr *)nullptr);
13331   QualType BaseType;
13332   if (!Old->isImplicitAccess()) {
13333     Base = getDerived().TransformExpr(Old->getBase());
13334     if (Base.isInvalid())
13335       return ExprError();
13336     Base =
13337         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13338     if (Base.isInvalid())
13339       return ExprError();
13340     BaseType = Base.get()->getType();
13341   } else {
13342     BaseType = getDerived().TransformType(Old->getBaseType());
13343   }
13344 
13345   NestedNameSpecifierLoc QualifierLoc;
13346   if (Old->getQualifierLoc()) {
13347     QualifierLoc =
13348         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13349     if (!QualifierLoc)
13350       return ExprError();
13351   }
13352 
13353   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13354 
13355   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13356 
13357   // Transform the declaration set.
13358   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13359     return ExprError();
13360 
13361   // Determine the naming class.
13362   if (Old->getNamingClass()) {
13363     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13364         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13365     if (!NamingClass)
13366       return ExprError();
13367 
13368     R.setNamingClass(NamingClass);
13369   }
13370 
13371   TemplateArgumentListInfo TransArgs;
13372   if (Old->hasExplicitTemplateArgs()) {
13373     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13374     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13375     if (getDerived().TransformTemplateArguments(
13376             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13377       return ExprError();
13378   }
13379 
13380   // FIXME: to do this check properly, we will need to preserve the
13381   // first-qualifier-in-scope here, just in case we had a dependent
13382   // base (and therefore couldn't do the check) and a
13383   // nested-name-qualifier (and therefore could do the lookup).
13384   NamedDecl *FirstQualifierInScope = nullptr;
13385 
13386   return getDerived().RebuildUnresolvedMemberExpr(
13387       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13388       TemplateKWLoc, FirstQualifierInScope, R,
13389       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13390 }
13391 
13392 template<typename Derived>
13393 ExprResult
13394 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13395   EnterExpressionEvaluationContext Unevaluated(
13396       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13397   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13398   if (SubExpr.isInvalid())
13399     return ExprError();
13400 
13401   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13402     return E;
13403 
13404   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13405 }
13406 
13407 template<typename Derived>
13408 ExprResult
13409 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13410   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13411   if (Pattern.isInvalid())
13412     return ExprError();
13413 
13414   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13415     return E;
13416 
13417   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13418                                            E->getNumExpansions());
13419 }
13420 
13421 template<typename Derived>
13422 ExprResult
13423 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13424   // If E is not value-dependent, then nothing will change when we transform it.
13425   // Note: This is an instantiation-centric view.
13426   if (!E->isValueDependent())
13427     return E;
13428 
13429   EnterExpressionEvaluationContext Unevaluated(
13430       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13431 
13432   ArrayRef<TemplateArgument> PackArgs;
13433   TemplateArgument ArgStorage;
13434 
13435   // Find the argument list to transform.
13436   if (E->isPartiallySubstituted()) {
13437     PackArgs = E->getPartialArguments();
13438   } else if (E->isValueDependent()) {
13439     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13440     bool ShouldExpand = false;
13441     bool RetainExpansion = false;
13442     Optional<unsigned> NumExpansions;
13443     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13444                                              Unexpanded,
13445                                              ShouldExpand, RetainExpansion,
13446                                              NumExpansions))
13447       return ExprError();
13448 
13449     // If we need to expand the pack, build a template argument from it and
13450     // expand that.
13451     if (ShouldExpand) {
13452       auto *Pack = E->getPack();
13453       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13454         ArgStorage = getSema().Context.getPackExpansionType(
13455             getSema().Context.getTypeDeclType(TTPD), None);
13456       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13457         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13458       } else {
13459         auto *VD = cast<ValueDecl>(Pack);
13460         ExprResult DRE = getSema().BuildDeclRefExpr(
13461             VD, VD->getType().getNonLValueExprType(getSema().Context),
13462             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13463             E->getPackLoc());
13464         if (DRE.isInvalid())
13465           return ExprError();
13466         ArgStorage = new (getSema().Context) PackExpansionExpr(
13467             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13468       }
13469       PackArgs = ArgStorage;
13470     }
13471   }
13472 
13473   // If we're not expanding the pack, just transform the decl.
13474   if (!PackArgs.size()) {
13475     auto *Pack = cast_or_null<NamedDecl>(
13476         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13477     if (!Pack)
13478       return ExprError();
13479     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13480                                               E->getPackLoc(),
13481                                               E->getRParenLoc(), None, None);
13482   }
13483 
13484   // Try to compute the result without performing a partial substitution.
13485   Optional<unsigned> Result = 0;
13486   for (const TemplateArgument &Arg : PackArgs) {
13487     if (!Arg.isPackExpansion()) {
13488       Result = *Result + 1;
13489       continue;
13490     }
13491 
13492     TemplateArgumentLoc ArgLoc;
13493     InventTemplateArgumentLoc(Arg, ArgLoc);
13494 
13495     // Find the pattern of the pack expansion.
13496     SourceLocation Ellipsis;
13497     Optional<unsigned> OrigNumExpansions;
13498     TemplateArgumentLoc Pattern =
13499         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13500                                                           OrigNumExpansions);
13501 
13502     // Substitute under the pack expansion. Do not expand the pack (yet).
13503     TemplateArgumentLoc OutPattern;
13504     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13505     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13506                                                /*Uneval*/ true))
13507       return true;
13508 
13509     // See if we can determine the number of arguments from the result.
13510     Optional<unsigned> NumExpansions =
13511         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13512     if (!NumExpansions) {
13513       // No: we must be in an alias template expansion, and we're going to need
13514       // to actually expand the packs.
13515       Result = None;
13516       break;
13517     }
13518 
13519     Result = *Result + *NumExpansions;
13520   }
13521 
13522   // Common case: we could determine the number of expansions without
13523   // substituting.
13524   if (Result)
13525     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13526                                               E->getPackLoc(),
13527                                               E->getRParenLoc(), *Result, None);
13528 
13529   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13530                                                E->getPackLoc());
13531   {
13532     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13533     typedef TemplateArgumentLocInventIterator<
13534         Derived, const TemplateArgument*> PackLocIterator;
13535     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13536                                    PackLocIterator(*this, PackArgs.end()),
13537                                    TransformedPackArgs, /*Uneval*/true))
13538       return ExprError();
13539   }
13540 
13541   // Check whether we managed to fully-expand the pack.
13542   // FIXME: Is it possible for us to do so and not hit the early exit path?
13543   SmallVector<TemplateArgument, 8> Args;
13544   bool PartialSubstitution = false;
13545   for (auto &Loc : TransformedPackArgs.arguments()) {
13546     Args.push_back(Loc.getArgument());
13547     if (Loc.getArgument().isPackExpansion())
13548       PartialSubstitution = true;
13549   }
13550 
13551   if (PartialSubstitution)
13552     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13553                                               E->getPackLoc(),
13554                                               E->getRParenLoc(), None, Args);
13555 
13556   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13557                                             E->getPackLoc(), E->getRParenLoc(),
13558                                             Args.size(), None);
13559 }
13560 
13561 template<typename Derived>
13562 ExprResult
13563 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13564                                           SubstNonTypeTemplateParmPackExpr *E) {
13565   // Default behavior is to do nothing with this transformation.
13566   return E;
13567 }
13568 
13569 template<typename Derived>
13570 ExprResult
13571 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13572                                           SubstNonTypeTemplateParmExpr *E) {
13573   // Default behavior is to do nothing with this transformation.
13574   return E;
13575 }
13576 
13577 template<typename Derived>
13578 ExprResult
13579 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13580   // Default behavior is to do nothing with this transformation.
13581   return E;
13582 }
13583 
13584 template<typename Derived>
13585 ExprResult
13586 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13587                                                   MaterializeTemporaryExpr *E) {
13588   return getDerived().TransformExpr(E->getSubExpr());
13589 }
13590 
13591 template<typename Derived>
13592 ExprResult
13593 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13594   UnresolvedLookupExpr *Callee = nullptr;
13595   if (Expr *OldCallee = E->getCallee()) {
13596     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13597     if (CalleeResult.isInvalid())
13598       return ExprError();
13599     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13600   }
13601 
13602   Expr *Pattern = E->getPattern();
13603 
13604   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13605   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13606   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13607 
13608   // Determine whether the set of unexpanded parameter packs can and should
13609   // be expanded.
13610   bool Expand = true;
13611   bool RetainExpansion = false;
13612   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13613                      NumExpansions = OrigNumExpansions;
13614   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13615                                            Pattern->getSourceRange(),
13616                                            Unexpanded,
13617                                            Expand, RetainExpansion,
13618                                            NumExpansions))
13619     return true;
13620 
13621   if (!Expand) {
13622     // Do not expand any packs here, just transform and rebuild a fold
13623     // expression.
13624     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13625 
13626     ExprResult LHS =
13627         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13628     if (LHS.isInvalid())
13629       return true;
13630 
13631     ExprResult RHS =
13632         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13633     if (RHS.isInvalid())
13634       return true;
13635 
13636     if (!getDerived().AlwaysRebuild() &&
13637         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13638       return E;
13639 
13640     return getDerived().RebuildCXXFoldExpr(
13641         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13642         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13643   }
13644 
13645   // Formally a fold expression expands to nested parenthesized expressions.
13646   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13647   // them.
13648   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13649     SemaRef.Diag(E->getEllipsisLoc(),
13650                  clang::diag::err_fold_expression_limit_exceeded)
13651         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13652         << E->getSourceRange();
13653     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13654     return ExprError();
13655   }
13656 
13657   // The transform has determined that we should perform an elementwise
13658   // expansion of the pattern. Do so.
13659   ExprResult Result = getDerived().TransformExpr(E->getInit());
13660   if (Result.isInvalid())
13661     return true;
13662   bool LeftFold = E->isLeftFold();
13663 
13664   // If we're retaining an expansion for a right fold, it is the innermost
13665   // component and takes the init (if any).
13666   if (!LeftFold && RetainExpansion) {
13667     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13668 
13669     ExprResult Out = getDerived().TransformExpr(Pattern);
13670     if (Out.isInvalid())
13671       return true;
13672 
13673     Result = getDerived().RebuildCXXFoldExpr(
13674         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13675         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13676     if (Result.isInvalid())
13677       return true;
13678   }
13679 
13680   for (unsigned I = 0; I != *NumExpansions; ++I) {
13681     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13682         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13683     ExprResult Out = getDerived().TransformExpr(Pattern);
13684     if (Out.isInvalid())
13685       return true;
13686 
13687     if (Out.get()->containsUnexpandedParameterPack()) {
13688       // We still have a pack; retain a pack expansion for this slice.
13689       Result = getDerived().RebuildCXXFoldExpr(
13690           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13691           E->getOperator(), E->getEllipsisLoc(),
13692           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13693           OrigNumExpansions);
13694     } else if (Result.isUsable()) {
13695       // We've got down to a single element; build a binary operator.
13696       Expr *LHS = LeftFold ? Result.get() : Out.get();
13697       Expr *RHS = LeftFold ? Out.get() : Result.get();
13698       if (Callee)
13699         Result = getDerived().RebuildCXXOperatorCallExpr(
13700             BinaryOperator::getOverloadedOperator(E->getOperator()),
13701             E->getEllipsisLoc(), Callee, LHS, RHS);
13702       else
13703         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13704                                                     E->getOperator(), LHS, RHS);
13705     } else
13706       Result = Out;
13707 
13708     if (Result.isInvalid())
13709       return true;
13710   }
13711 
13712   // If we're retaining an expansion for a left fold, it is the outermost
13713   // component and takes the complete expansion so far as its init (if any).
13714   if (LeftFold && RetainExpansion) {
13715     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13716 
13717     ExprResult Out = getDerived().TransformExpr(Pattern);
13718     if (Out.isInvalid())
13719       return true;
13720 
13721     Result = getDerived().RebuildCXXFoldExpr(
13722         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13723         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13724     if (Result.isInvalid())
13725       return true;
13726   }
13727 
13728   // If we had no init and an empty pack, and we're not retaining an expansion,
13729   // then produce a fallback value or error.
13730   if (Result.isUnset())
13731     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13732                                                 E->getOperator());
13733 
13734   return Result;
13735 }
13736 
13737 template<typename Derived>
13738 ExprResult
13739 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13740     CXXStdInitializerListExpr *E) {
13741   return getDerived().TransformExpr(E->getSubExpr());
13742 }
13743 
13744 template<typename Derived>
13745 ExprResult
13746 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13747   return SemaRef.MaybeBindToTemporary(E);
13748 }
13749 
13750 template<typename Derived>
13751 ExprResult
13752 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13753   return E;
13754 }
13755 
13756 template<typename Derived>
13757 ExprResult
13758 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13759   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13760   if (SubExpr.isInvalid())
13761     return ExprError();
13762 
13763   if (!getDerived().AlwaysRebuild() &&
13764       SubExpr.get() == E->getSubExpr())
13765     return E;
13766 
13767   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13768 }
13769 
13770 template<typename Derived>
13771 ExprResult
13772 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13773   // Transform each of the elements.
13774   SmallVector<Expr *, 8> Elements;
13775   bool ArgChanged = false;
13776   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13777                                   /*IsCall=*/false, Elements, &ArgChanged))
13778     return ExprError();
13779 
13780   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13781     return SemaRef.MaybeBindToTemporary(E);
13782 
13783   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13784                                               Elements.data(),
13785                                               Elements.size());
13786 }
13787 
13788 template<typename Derived>
13789 ExprResult
13790 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13791                                                     ObjCDictionaryLiteral *E) {
13792   // Transform each of the elements.
13793   SmallVector<ObjCDictionaryElement, 8> Elements;
13794   bool ArgChanged = false;
13795   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13796     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13797 
13798     if (OrigElement.isPackExpansion()) {
13799       // This key/value element is a pack expansion.
13800       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13801       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13802       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13803       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13804 
13805       // Determine whether the set of unexpanded parameter packs can
13806       // and should be expanded.
13807       bool Expand = true;
13808       bool RetainExpansion = false;
13809       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13810       Optional<unsigned> NumExpansions = OrigNumExpansions;
13811       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13812                                OrigElement.Value->getEndLoc());
13813       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13814                                                PatternRange, Unexpanded, Expand,
13815                                                RetainExpansion, NumExpansions))
13816         return ExprError();
13817 
13818       if (!Expand) {
13819         // The transform has determined that we should perform a simple
13820         // transformation on the pack expansion, producing another pack
13821         // expansion.
13822         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13823         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13824         if (Key.isInvalid())
13825           return ExprError();
13826 
13827         if (Key.get() != OrigElement.Key)
13828           ArgChanged = true;
13829 
13830         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13831         if (Value.isInvalid())
13832           return ExprError();
13833 
13834         if (Value.get() != OrigElement.Value)
13835           ArgChanged = true;
13836 
13837         ObjCDictionaryElement Expansion = {
13838           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13839         };
13840         Elements.push_back(Expansion);
13841         continue;
13842       }
13843 
13844       // Record right away that the argument was changed.  This needs
13845       // to happen even if the array expands to nothing.
13846       ArgChanged = true;
13847 
13848       // The transform has determined that we should perform an elementwise
13849       // expansion of the pattern. Do so.
13850       for (unsigned I = 0; I != *NumExpansions; ++I) {
13851         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13852         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13853         if (Key.isInvalid())
13854           return ExprError();
13855 
13856         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13857         if (Value.isInvalid())
13858           return ExprError();
13859 
13860         ObjCDictionaryElement Element = {
13861           Key.get(), Value.get(), SourceLocation(), NumExpansions
13862         };
13863 
13864         // If any unexpanded parameter packs remain, we still have a
13865         // pack expansion.
13866         // FIXME: Can this really happen?
13867         if (Key.get()->containsUnexpandedParameterPack() ||
13868             Value.get()->containsUnexpandedParameterPack())
13869           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13870 
13871         Elements.push_back(Element);
13872       }
13873 
13874       // FIXME: Retain a pack expansion if RetainExpansion is true.
13875 
13876       // We've finished with this pack expansion.
13877       continue;
13878     }
13879 
13880     // Transform and check key.
13881     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13882     if (Key.isInvalid())
13883       return ExprError();
13884 
13885     if (Key.get() != OrigElement.Key)
13886       ArgChanged = true;
13887 
13888     // Transform and check value.
13889     ExprResult Value
13890       = getDerived().TransformExpr(OrigElement.Value);
13891     if (Value.isInvalid())
13892       return ExprError();
13893 
13894     if (Value.get() != OrigElement.Value)
13895       ArgChanged = true;
13896 
13897     ObjCDictionaryElement Element = {
13898       Key.get(), Value.get(), SourceLocation(), None
13899     };
13900     Elements.push_back(Element);
13901   }
13902 
13903   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13904     return SemaRef.MaybeBindToTemporary(E);
13905 
13906   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13907                                                    Elements);
13908 }
13909 
13910 template<typename Derived>
13911 ExprResult
13912 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13913   TypeSourceInfo *EncodedTypeInfo
13914     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13915   if (!EncodedTypeInfo)
13916     return ExprError();
13917 
13918   if (!getDerived().AlwaysRebuild() &&
13919       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13920     return E;
13921 
13922   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13923                                             EncodedTypeInfo,
13924                                             E->getRParenLoc());
13925 }
13926 
13927 template<typename Derived>
13928 ExprResult TreeTransform<Derived>::
13929 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13930   // This is a kind of implicit conversion, and it needs to get dropped
13931   // and recomputed for the same general reasons that ImplicitCastExprs
13932   // do, as well a more specific one: this expression is only valid when
13933   // it appears *immediately* as an argument expression.
13934   return getDerived().TransformExpr(E->getSubExpr());
13935 }
13936 
13937 template<typename Derived>
13938 ExprResult TreeTransform<Derived>::
13939 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13940   TypeSourceInfo *TSInfo
13941     = getDerived().TransformType(E->getTypeInfoAsWritten());
13942   if (!TSInfo)
13943     return ExprError();
13944 
13945   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13946   if (Result.isInvalid())
13947     return ExprError();
13948 
13949   if (!getDerived().AlwaysRebuild() &&
13950       TSInfo == E->getTypeInfoAsWritten() &&
13951       Result.get() == E->getSubExpr())
13952     return E;
13953 
13954   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13955                                       E->getBridgeKeywordLoc(), TSInfo,
13956                                       Result.get());
13957 }
13958 
13959 template <typename Derived>
13960 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13961     ObjCAvailabilityCheckExpr *E) {
13962   return E;
13963 }
13964 
13965 template<typename Derived>
13966 ExprResult
13967 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13968   // Transform arguments.
13969   bool ArgChanged = false;
13970   SmallVector<Expr*, 8> Args;
13971   Args.reserve(E->getNumArgs());
13972   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13973                                   &ArgChanged))
13974     return ExprError();
13975 
13976   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13977     // Class message: transform the receiver type.
13978     TypeSourceInfo *ReceiverTypeInfo
13979       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13980     if (!ReceiverTypeInfo)
13981       return ExprError();
13982 
13983     // If nothing changed, just retain the existing message send.
13984     if (!getDerived().AlwaysRebuild() &&
13985         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13986       return SemaRef.MaybeBindToTemporary(E);
13987 
13988     // Build a new class message send.
13989     SmallVector<SourceLocation, 16> SelLocs;
13990     E->getSelectorLocs(SelLocs);
13991     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13992                                                E->getSelector(),
13993                                                SelLocs,
13994                                                E->getMethodDecl(),
13995                                                E->getLeftLoc(),
13996                                                Args,
13997                                                E->getRightLoc());
13998   }
13999   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
14000            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
14001     if (!E->getMethodDecl())
14002       return ExprError();
14003 
14004     // Build a new class message send to 'super'.
14005     SmallVector<SourceLocation, 16> SelLocs;
14006     E->getSelectorLocs(SelLocs);
14007     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
14008                                                E->getSelector(),
14009                                                SelLocs,
14010                                                E->getReceiverType(),
14011                                                E->getMethodDecl(),
14012                                                E->getLeftLoc(),
14013                                                Args,
14014                                                E->getRightLoc());
14015   }
14016 
14017   // Instance message: transform the receiver
14018   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14019          "Only class and instance messages may be instantiated");
14020   ExprResult Receiver
14021     = getDerived().TransformExpr(E->getInstanceReceiver());
14022   if (Receiver.isInvalid())
14023     return ExprError();
14024 
14025   // If nothing changed, just retain the existing message send.
14026   if (!getDerived().AlwaysRebuild() &&
14027       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14028     return SemaRef.MaybeBindToTemporary(E);
14029 
14030   // Build a new instance message send.
14031   SmallVector<SourceLocation, 16> SelLocs;
14032   E->getSelectorLocs(SelLocs);
14033   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14034                                              E->getSelector(),
14035                                              SelLocs,
14036                                              E->getMethodDecl(),
14037                                              E->getLeftLoc(),
14038                                              Args,
14039                                              E->getRightLoc());
14040 }
14041 
14042 template<typename Derived>
14043 ExprResult
14044 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14045   return E;
14046 }
14047 
14048 template<typename Derived>
14049 ExprResult
14050 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14051   return E;
14052 }
14053 
14054 template<typename Derived>
14055 ExprResult
14056 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14057   // Transform the base expression.
14058   ExprResult Base = getDerived().TransformExpr(E->getBase());
14059   if (Base.isInvalid())
14060     return ExprError();
14061 
14062   // We don't need to transform the ivar; it will never change.
14063 
14064   // If nothing changed, just retain the existing expression.
14065   if (!getDerived().AlwaysRebuild() &&
14066       Base.get() == E->getBase())
14067     return E;
14068 
14069   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14070                                              E->getLocation(),
14071                                              E->isArrow(), E->isFreeIvar());
14072 }
14073 
14074 template<typename Derived>
14075 ExprResult
14076 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14077   // 'super' and types never change. Property never changes. Just
14078   // retain the existing expression.
14079   if (!E->isObjectReceiver())
14080     return E;
14081 
14082   // Transform the base expression.
14083   ExprResult Base = getDerived().TransformExpr(E->getBase());
14084   if (Base.isInvalid())
14085     return ExprError();
14086 
14087   // We don't need to transform the property; it will never change.
14088 
14089   // If nothing changed, just retain the existing expression.
14090   if (!getDerived().AlwaysRebuild() &&
14091       Base.get() == E->getBase())
14092     return E;
14093 
14094   if (E->isExplicitProperty())
14095     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14096                                                    E->getExplicitProperty(),
14097                                                    E->getLocation());
14098 
14099   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14100                                                  SemaRef.Context.PseudoObjectTy,
14101                                                  E->getImplicitPropertyGetter(),
14102                                                  E->getImplicitPropertySetter(),
14103                                                  E->getLocation());
14104 }
14105 
14106 template<typename Derived>
14107 ExprResult
14108 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14109   // Transform the base expression.
14110   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14111   if (Base.isInvalid())
14112     return ExprError();
14113 
14114   // Transform the key expression.
14115   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14116   if (Key.isInvalid())
14117     return ExprError();
14118 
14119   // If nothing changed, just retain the existing expression.
14120   if (!getDerived().AlwaysRebuild() &&
14121       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14122     return E;
14123 
14124   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14125                                                   Base.get(), Key.get(),
14126                                                   E->getAtIndexMethodDecl(),
14127                                                   E->setAtIndexMethodDecl());
14128 }
14129 
14130 template<typename Derived>
14131 ExprResult
14132 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14133   // Transform the base expression.
14134   ExprResult Base = getDerived().TransformExpr(E->getBase());
14135   if (Base.isInvalid())
14136     return ExprError();
14137 
14138   // If nothing changed, just retain the existing expression.
14139   if (!getDerived().AlwaysRebuild() &&
14140       Base.get() == E->getBase())
14141     return E;
14142 
14143   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14144                                          E->getOpLoc(),
14145                                          E->isArrow());
14146 }
14147 
14148 template<typename Derived>
14149 ExprResult
14150 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14151   bool ArgumentChanged = false;
14152   SmallVector<Expr*, 8> SubExprs;
14153   SubExprs.reserve(E->getNumSubExprs());
14154   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14155                                   SubExprs, &ArgumentChanged))
14156     return ExprError();
14157 
14158   if (!getDerived().AlwaysRebuild() &&
14159       !ArgumentChanged)
14160     return E;
14161 
14162   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14163                                                SubExprs,
14164                                                E->getRParenLoc());
14165 }
14166 
14167 template<typename Derived>
14168 ExprResult
14169 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14170   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14171   if (SrcExpr.isInvalid())
14172     return ExprError();
14173 
14174   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14175   if (!Type)
14176     return ExprError();
14177 
14178   if (!getDerived().AlwaysRebuild() &&
14179       Type == E->getTypeSourceInfo() &&
14180       SrcExpr.get() == E->getSrcExpr())
14181     return E;
14182 
14183   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14184                                                SrcExpr.get(), Type,
14185                                                E->getRParenLoc());
14186 }
14187 
14188 template<typename Derived>
14189 ExprResult
14190 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14191   BlockDecl *oldBlock = E->getBlockDecl();
14192 
14193   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14194   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14195 
14196   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14197   blockScope->TheDecl->setBlockMissingReturnType(
14198                          oldBlock->blockMissingReturnType());
14199 
14200   SmallVector<ParmVarDecl*, 4> params;
14201   SmallVector<QualType, 4> paramTypes;
14202 
14203   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14204 
14205   // Parameter substitution.
14206   Sema::ExtParameterInfoBuilder extParamInfos;
14207   if (getDerived().TransformFunctionTypeParams(
14208           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14209           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14210           extParamInfos)) {
14211     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14212     return ExprError();
14213   }
14214 
14215   QualType exprResultType =
14216       getDerived().TransformType(exprFunctionType->getReturnType());
14217 
14218   auto epi = exprFunctionType->getExtProtoInfo();
14219   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14220 
14221   QualType functionType =
14222     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14223   blockScope->FunctionType = functionType;
14224 
14225   // Set the parameters on the block decl.
14226   if (!params.empty())
14227     blockScope->TheDecl->setParams(params);
14228 
14229   if (!oldBlock->blockMissingReturnType()) {
14230     blockScope->HasImplicitReturnType = false;
14231     blockScope->ReturnType = exprResultType;
14232   }
14233 
14234   // Transform the body
14235   StmtResult body = getDerived().TransformStmt(E->getBody());
14236   if (body.isInvalid()) {
14237     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14238     return ExprError();
14239   }
14240 
14241 #ifndef NDEBUG
14242   // In builds with assertions, make sure that we captured everything we
14243   // captured before.
14244   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14245     for (const auto &I : oldBlock->captures()) {
14246       VarDecl *oldCapture = I.getVariable();
14247 
14248       // Ignore parameter packs.
14249       if (oldCapture->isParameterPack())
14250         continue;
14251 
14252       VarDecl *newCapture =
14253         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14254                                                  oldCapture));
14255       assert(blockScope->CaptureMap.count(newCapture));
14256     }
14257     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14258   }
14259 #endif
14260 
14261   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14262                                     /*Scope=*/nullptr);
14263 }
14264 
14265 template<typename Derived>
14266 ExprResult
14267 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14268   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14269   if (SrcExpr.isInvalid())
14270     return ExprError();
14271 
14272   QualType Type = getDerived().TransformType(E->getType());
14273 
14274   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14275                                  E->getRParenLoc());
14276 }
14277 
14278 template<typename Derived>
14279 ExprResult
14280 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14281   bool ArgumentChanged = false;
14282   SmallVector<Expr*, 8> SubExprs;
14283   SubExprs.reserve(E->getNumSubExprs());
14284   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14285                                   SubExprs, &ArgumentChanged))
14286     return ExprError();
14287 
14288   if (!getDerived().AlwaysRebuild() &&
14289       !ArgumentChanged)
14290     return E;
14291 
14292   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14293                                         E->getOp(), E->getRParenLoc());
14294 }
14295 
14296 //===----------------------------------------------------------------------===//
14297 // Type reconstruction
14298 //===----------------------------------------------------------------------===//
14299 
14300 template<typename Derived>
14301 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14302                                                     SourceLocation Star) {
14303   return SemaRef.BuildPointerType(PointeeType, Star,
14304                                   getDerived().getBaseEntity());
14305 }
14306 
14307 template<typename Derived>
14308 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14309                                                          SourceLocation Star) {
14310   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14311                                        getDerived().getBaseEntity());
14312 }
14313 
14314 template<typename Derived>
14315 QualType
14316 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14317                                              bool WrittenAsLValue,
14318                                              SourceLocation Sigil) {
14319   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14320                                     Sigil, getDerived().getBaseEntity());
14321 }
14322 
14323 template<typename Derived>
14324 QualType
14325 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14326                                                  QualType ClassType,
14327                                                  SourceLocation Sigil) {
14328   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14329                                         getDerived().getBaseEntity());
14330 }
14331 
14332 template<typename Derived>
14333 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14334            const ObjCTypeParamDecl *Decl,
14335            SourceLocation ProtocolLAngleLoc,
14336            ArrayRef<ObjCProtocolDecl *> Protocols,
14337            ArrayRef<SourceLocation> ProtocolLocs,
14338            SourceLocation ProtocolRAngleLoc) {
14339   return SemaRef.BuildObjCTypeParamType(Decl,
14340                                         ProtocolLAngleLoc, Protocols,
14341                                         ProtocolLocs, ProtocolRAngleLoc,
14342                                         /*FailOnError=*/true);
14343 }
14344 
14345 template<typename Derived>
14346 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14347            QualType BaseType,
14348            SourceLocation Loc,
14349            SourceLocation TypeArgsLAngleLoc,
14350            ArrayRef<TypeSourceInfo *> TypeArgs,
14351            SourceLocation TypeArgsRAngleLoc,
14352            SourceLocation ProtocolLAngleLoc,
14353            ArrayRef<ObjCProtocolDecl *> Protocols,
14354            ArrayRef<SourceLocation> ProtocolLocs,
14355            SourceLocation ProtocolRAngleLoc) {
14356   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14357                                      TypeArgs, TypeArgsRAngleLoc,
14358                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14359                                      ProtocolRAngleLoc,
14360                                      /*FailOnError=*/true);
14361 }
14362 
14363 template<typename Derived>
14364 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14365            QualType PointeeType,
14366            SourceLocation Star) {
14367   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14368 }
14369 
14370 template<typename Derived>
14371 QualType
14372 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14373                                          ArrayType::ArraySizeModifier SizeMod,
14374                                          const llvm::APInt *Size,
14375                                          Expr *SizeExpr,
14376                                          unsigned IndexTypeQuals,
14377                                          SourceRange BracketsRange) {
14378   if (SizeExpr || !Size)
14379     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14380                                   IndexTypeQuals, BracketsRange,
14381                                   getDerived().getBaseEntity());
14382 
14383   QualType Types[] = {
14384     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14385     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14386     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14387   };
14388   const unsigned NumTypes = llvm::array_lengthof(Types);
14389   QualType SizeType;
14390   for (unsigned I = 0; I != NumTypes; ++I)
14391     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14392       SizeType = Types[I];
14393       break;
14394     }
14395 
14396   // Note that we can return a VariableArrayType here in the case where
14397   // the element type was a dependent VariableArrayType.
14398   IntegerLiteral *ArraySize
14399       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14400                                /*FIXME*/BracketsRange.getBegin());
14401   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14402                                 IndexTypeQuals, BracketsRange,
14403                                 getDerived().getBaseEntity());
14404 }
14405 
14406 template<typename Derived>
14407 QualType
14408 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14409                                                  ArrayType::ArraySizeModifier SizeMod,
14410                                                  const llvm::APInt &Size,
14411                                                  Expr *SizeExpr,
14412                                                  unsigned IndexTypeQuals,
14413                                                  SourceRange BracketsRange) {
14414   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14415                                         IndexTypeQuals, BracketsRange);
14416 }
14417 
14418 template<typename Derived>
14419 QualType
14420 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14421                                           ArrayType::ArraySizeModifier SizeMod,
14422                                                  unsigned IndexTypeQuals,
14423                                                    SourceRange BracketsRange) {
14424   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14425                                        IndexTypeQuals, BracketsRange);
14426 }
14427 
14428 template<typename Derived>
14429 QualType
14430 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14431                                           ArrayType::ArraySizeModifier SizeMod,
14432                                                  Expr *SizeExpr,
14433                                                  unsigned IndexTypeQuals,
14434                                                  SourceRange BracketsRange) {
14435   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14436                                        SizeExpr,
14437                                        IndexTypeQuals, BracketsRange);
14438 }
14439 
14440 template<typename Derived>
14441 QualType
14442 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14443                                           ArrayType::ArraySizeModifier SizeMod,
14444                                                        Expr *SizeExpr,
14445                                                        unsigned IndexTypeQuals,
14446                                                    SourceRange BracketsRange) {
14447   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14448                                        SizeExpr,
14449                                        IndexTypeQuals, BracketsRange);
14450 }
14451 
14452 template <typename Derived>
14453 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14454     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14455   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14456                                           AttributeLoc);
14457 }
14458 
14459 template <typename Derived>
14460 QualType
14461 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14462                                           unsigned NumElements,
14463                                           VectorType::VectorKind VecKind) {
14464   // FIXME: semantic checking!
14465   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14466 }
14467 
14468 template <typename Derived>
14469 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14470     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14471     VectorType::VectorKind VecKind) {
14472   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14473 }
14474 
14475 template<typename Derived>
14476 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14477                                                       unsigned NumElements,
14478                                                  SourceLocation AttributeLoc) {
14479   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14480                           NumElements, true);
14481   IntegerLiteral *VectorSize
14482     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14483                              AttributeLoc);
14484   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14485 }
14486 
14487 template<typename Derived>
14488 QualType
14489 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14490                                                            Expr *SizeExpr,
14491                                                   SourceLocation AttributeLoc) {
14492   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14493 }
14494 
14495 template <typename Derived>
14496 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14497     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14498   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14499                                                NumColumns);
14500 }
14501 
14502 template <typename Derived>
14503 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14504     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14505     SourceLocation AttributeLoc) {
14506   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14507                                  AttributeLoc);
14508 }
14509 
14510 template<typename Derived>
14511 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14512     QualType T,
14513     MutableArrayRef<QualType> ParamTypes,
14514     const FunctionProtoType::ExtProtoInfo &EPI) {
14515   return SemaRef.BuildFunctionType(T, ParamTypes,
14516                                    getDerived().getBaseLocation(),
14517                                    getDerived().getBaseEntity(),
14518                                    EPI);
14519 }
14520 
14521 template<typename Derived>
14522 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14523   return SemaRef.Context.getFunctionNoProtoType(T);
14524 }
14525 
14526 template<typename Derived>
14527 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14528                                                             Decl *D) {
14529   assert(D && "no decl found");
14530   if (D->isInvalidDecl()) return QualType();
14531 
14532   // FIXME: Doesn't account for ObjCInterfaceDecl!
14533   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14534     // A valid resolved using typename pack expansion decl can have multiple
14535     // UsingDecls, but they must each have exactly one type, and it must be
14536     // the same type in every case. But we must have at least one expansion!
14537     if (UPD->expansions().empty()) {
14538       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14539           << UPD->isCXXClassMember() << UPD;
14540       return QualType();
14541     }
14542 
14543     // We might still have some unresolved types. Try to pick a resolved type
14544     // if we can. The final instantiation will check that the remaining
14545     // unresolved types instantiate to the type we pick.
14546     QualType FallbackT;
14547     QualType T;
14548     for (auto *E : UPD->expansions()) {
14549       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14550       if (ThisT.isNull())
14551         continue;
14552       else if (ThisT->getAs<UnresolvedUsingType>())
14553         FallbackT = ThisT;
14554       else if (T.isNull())
14555         T = ThisT;
14556       else
14557         assert(getSema().Context.hasSameType(ThisT, T) &&
14558                "mismatched resolved types in using pack expansion");
14559     }
14560     return T.isNull() ? FallbackT : T;
14561   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14562     assert(Using->hasTypename() &&
14563            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14564 
14565     // A valid resolved using typename decl points to exactly one type decl.
14566     assert(++Using->shadow_begin() == Using->shadow_end());
14567 
14568     UsingShadowDecl *Shadow = *Using->shadow_begin();
14569     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14570       return QualType();
14571     return SemaRef.Context.getUsingType(
14572         Shadow, SemaRef.Context.getTypeDeclType(
14573                     cast<TypeDecl>(Shadow->getTargetDecl())));
14574   } else {
14575     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14576            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14577     return SemaRef.Context.getTypeDeclType(
14578         cast<UnresolvedUsingTypenameDecl>(D));
14579   }
14580 }
14581 
14582 template <typename Derived>
14583 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14584                                                        SourceLocation) {
14585   return SemaRef.BuildTypeofExprType(E);
14586 }
14587 
14588 template<typename Derived>
14589 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14590   return SemaRef.Context.getTypeOfType(Underlying);
14591 }
14592 
14593 template <typename Derived>
14594 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14595   return SemaRef.BuildDecltypeType(E);
14596 }
14597 
14598 template<typename Derived>
14599 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14600                                             UnaryTransformType::UTTKind UKind,
14601                                             SourceLocation Loc) {
14602   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14603 }
14604 
14605 template<typename Derived>
14606 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14607                                                       TemplateName Template,
14608                                              SourceLocation TemplateNameLoc,
14609                                      TemplateArgumentListInfo &TemplateArgs) {
14610   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14611 }
14612 
14613 template<typename Derived>
14614 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14615                                                    SourceLocation KWLoc) {
14616   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14617 }
14618 
14619 template<typename Derived>
14620 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14621                                                  SourceLocation KWLoc,
14622                                                  bool isReadPipe) {
14623   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14624                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14625 }
14626 
14627 template <typename Derived>
14628 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14629                                                    unsigned NumBits,
14630                                                    SourceLocation Loc) {
14631   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14632                         NumBits, true);
14633   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14634                                                 SemaRef.Context.IntTy, Loc);
14635   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14636 }
14637 
14638 template <typename Derived>
14639 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14640     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14641   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14642 }
14643 
14644 template<typename Derived>
14645 TemplateName
14646 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14647                                             bool TemplateKW,
14648                                             TemplateDecl *Template) {
14649   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14650                                                   Template);
14651 }
14652 
14653 template<typename Derived>
14654 TemplateName
14655 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14656                                             SourceLocation TemplateKWLoc,
14657                                             const IdentifierInfo &Name,
14658                                             SourceLocation NameLoc,
14659                                             QualType ObjectType,
14660                                             NamedDecl *FirstQualifierInScope,
14661                                             bool AllowInjectedClassName) {
14662   UnqualifiedId TemplateName;
14663   TemplateName.setIdentifier(&Name, NameLoc);
14664   Sema::TemplateTy Template;
14665   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14666                               TemplateName, ParsedType::make(ObjectType),
14667                               /*EnteringContext=*/false, Template,
14668                               AllowInjectedClassName);
14669   return Template.get();
14670 }
14671 
14672 template<typename Derived>
14673 TemplateName
14674 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14675                                             SourceLocation TemplateKWLoc,
14676                                             OverloadedOperatorKind Operator,
14677                                             SourceLocation NameLoc,
14678                                             QualType ObjectType,
14679                                             bool AllowInjectedClassName) {
14680   UnqualifiedId Name;
14681   // FIXME: Bogus location information.
14682   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14683   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14684   Sema::TemplateTy Template;
14685   getSema().ActOnTemplateName(
14686       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14687       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14688   return Template.get();
14689 }
14690 
14691 template<typename Derived>
14692 ExprResult
14693 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14694                                                    SourceLocation OpLoc,
14695                                                    Expr *OrigCallee,
14696                                                    Expr *First,
14697                                                    Expr *Second) {
14698   Expr *Callee = OrigCallee->IgnoreParenCasts();
14699   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14700 
14701   if (First->getObjectKind() == OK_ObjCProperty) {
14702     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14703     if (BinaryOperator::isAssignmentOp(Opc))
14704       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14705                                                  First, Second);
14706     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14707     if (Result.isInvalid())
14708       return ExprError();
14709     First = Result.get();
14710   }
14711 
14712   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14713     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14714     if (Result.isInvalid())
14715       return ExprError();
14716     Second = Result.get();
14717   }
14718 
14719   // Determine whether this should be a builtin operation.
14720   if (Op == OO_Subscript) {
14721     if (!First->getType()->isOverloadableType() &&
14722         !Second->getType()->isOverloadableType())
14723       return getSema().CreateBuiltinArraySubscriptExpr(
14724           First, Callee->getBeginLoc(), Second, OpLoc);
14725   } else if (Op == OO_Arrow) {
14726     // -> is never a builtin operation.
14727     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14728   } else if (Second == nullptr || isPostIncDec) {
14729     if (!First->getType()->isOverloadableType() ||
14730         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14731       // The argument is not of overloadable type, or this is an expression
14732       // of the form &Class::member, so try to create a built-in unary
14733       // operation.
14734       UnaryOperatorKind Opc
14735         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14736 
14737       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14738     }
14739   } else {
14740     if (!First->getType()->isOverloadableType() &&
14741         !Second->getType()->isOverloadableType()) {
14742       // Neither of the arguments is an overloadable type, so try to
14743       // create a built-in binary operation.
14744       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14745       ExprResult Result
14746         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14747       if (Result.isInvalid())
14748         return ExprError();
14749 
14750       return Result;
14751     }
14752   }
14753 
14754   // Compute the transformed set of functions (and function templates) to be
14755   // used during overload resolution.
14756   UnresolvedSet<16> Functions;
14757   bool RequiresADL;
14758 
14759   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14760     Functions.append(ULE->decls_begin(), ULE->decls_end());
14761     // If the overload could not be resolved in the template definition
14762     // (because we had a dependent argument), ADL is performed as part of
14763     // template instantiation.
14764     RequiresADL = ULE->requiresADL();
14765   } else {
14766     // If we've resolved this to a particular non-member function, just call
14767     // that function. If we resolved it to a member function,
14768     // CreateOverloaded* will find that function for us.
14769     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14770     if (!isa<CXXMethodDecl>(ND))
14771       Functions.addDecl(ND);
14772     RequiresADL = false;
14773   }
14774 
14775   // Add any functions found via argument-dependent lookup.
14776   Expr *Args[2] = { First, Second };
14777   unsigned NumArgs = 1 + (Second != nullptr);
14778 
14779   // Create the overloaded operator invocation for unary operators.
14780   if (NumArgs == 1 || isPostIncDec) {
14781     UnaryOperatorKind Opc
14782       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14783     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14784                                            RequiresADL);
14785   }
14786 
14787   if (Op == OO_Subscript) {
14788     SourceLocation LBrace;
14789     SourceLocation RBrace;
14790 
14791     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14792       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14793       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14794       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14795     } else {
14796       LBrace = Callee->getBeginLoc();
14797       RBrace = OpLoc;
14798     }
14799 
14800     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14801                                                       First, Second);
14802   }
14803 
14804   // Create the overloaded operator invocation for binary operators.
14805   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14806   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14807       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14808   if (Result.isInvalid())
14809     return ExprError();
14810 
14811   return Result;
14812 }
14813 
14814 template<typename Derived>
14815 ExprResult
14816 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14817                                                      SourceLocation OperatorLoc,
14818                                                        bool isArrow,
14819                                                        CXXScopeSpec &SS,
14820                                                      TypeSourceInfo *ScopeType,
14821                                                        SourceLocation CCLoc,
14822                                                        SourceLocation TildeLoc,
14823                                         PseudoDestructorTypeStorage Destroyed) {
14824   QualType BaseType = Base->getType();
14825   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14826       (!isArrow && !BaseType->getAs<RecordType>()) ||
14827       (isArrow && BaseType->getAs<PointerType>() &&
14828        !BaseType->castAs<PointerType>()->getPointeeType()
14829                                               ->template getAs<RecordType>())){
14830     // This pseudo-destructor expression is still a pseudo-destructor.
14831     return SemaRef.BuildPseudoDestructorExpr(
14832         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14833         CCLoc, TildeLoc, Destroyed);
14834   }
14835 
14836   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14837   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14838                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14839   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14840   NameInfo.setNamedTypeInfo(DestroyedType);
14841 
14842   // The scope type is now known to be a valid nested name specifier
14843   // component. Tack it on to the end of the nested name specifier.
14844   if (ScopeType) {
14845     if (!ScopeType->getType()->getAs<TagType>()) {
14846       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14847                      diag::err_expected_class_or_namespace)
14848           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14849       return ExprError();
14850     }
14851     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14852               CCLoc);
14853   }
14854 
14855   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14856   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14857                                             OperatorLoc, isArrow,
14858                                             SS, TemplateKWLoc,
14859                                             /*FIXME: FirstQualifier*/ nullptr,
14860                                             NameInfo,
14861                                             /*TemplateArgs*/ nullptr,
14862                                             /*S*/nullptr);
14863 }
14864 
14865 template<typename Derived>
14866 StmtResult
14867 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14868   SourceLocation Loc = S->getBeginLoc();
14869   CapturedDecl *CD = S->getCapturedDecl();
14870   unsigned NumParams = CD->getNumParams();
14871   unsigned ContextParamPos = CD->getContextParamPosition();
14872   SmallVector<Sema::CapturedParamNameType, 4> Params;
14873   for (unsigned I = 0; I < NumParams; ++I) {
14874     if (I != ContextParamPos) {
14875       Params.push_back(
14876              std::make_pair(
14877                   CD->getParam(I)->getName(),
14878                   getDerived().TransformType(CD->getParam(I)->getType())));
14879     } else {
14880       Params.push_back(std::make_pair(StringRef(), QualType()));
14881     }
14882   }
14883   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14884                                      S->getCapturedRegionKind(), Params);
14885   StmtResult Body;
14886   {
14887     Sema::CompoundScopeRAII CompoundScope(getSema());
14888     Body = getDerived().TransformStmt(S->getCapturedStmt());
14889   }
14890 
14891   if (Body.isInvalid()) {
14892     getSema().ActOnCapturedRegionError();
14893     return StmtError();
14894   }
14895 
14896   return getSema().ActOnCapturedRegionEnd(Body.get());
14897 }
14898 
14899 } // end namespace clang
14900 
14901 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14902