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                                   QualType ResultTy, SourceLocation BuiltinLoc,
3390                                   SourceLocation RPLoc,
3391                                   DeclContext *ParentContext) {
3392     return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
3393                                         ParentContext);
3394   }
3395 
3396   /// Build a new Objective-C boxed expression.
3397   ///
3398   /// By default, performs semantic analysis to build the new expression.
3399   /// Subclasses may override this routine to provide different behavior.
3400   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3401       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3402       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3403       TemplateArgumentListInfo *TALI) {
3404     CXXScopeSpec SS;
3405     SS.Adopt(NNS);
3406     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3407                                                          ConceptNameInfo,
3408                                                          FoundDecl,
3409                                                          NamedConcept, TALI);
3410     if (Result.isInvalid())
3411       return ExprError();
3412     return Result;
3413   }
3414 
3415   /// \brief Build a new requires expression.
3416   ///
3417   /// By default, performs semantic analysis to build the new expression.
3418   /// Subclasses may override this routine to provide different behavior.
3419   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3420                                  RequiresExprBodyDecl *Body,
3421                                  ArrayRef<ParmVarDecl *> LocalParameters,
3422                                  ArrayRef<concepts::Requirement *> Requirements,
3423                                  SourceLocation ClosingBraceLoc) {
3424     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3425                                 LocalParameters, Requirements, ClosingBraceLoc);
3426   }
3427 
3428   concepts::TypeRequirement *
3429   RebuildTypeRequirement(
3430       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3431     return SemaRef.BuildTypeRequirement(SubstDiag);
3432   }
3433 
3434   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3435     return SemaRef.BuildTypeRequirement(T);
3436   }
3437 
3438   concepts::ExprRequirement *
3439   RebuildExprRequirement(
3440       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3441       SourceLocation NoexceptLoc,
3442       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3443     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3444                                         std::move(Ret));
3445   }
3446 
3447   concepts::ExprRequirement *
3448   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3449                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3450     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3451                                         std::move(Ret));
3452   }
3453 
3454   concepts::NestedRequirement *
3455   RebuildNestedRequirement(
3456       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3457     return SemaRef.BuildNestedRequirement(SubstDiag);
3458   }
3459 
3460   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3461     return SemaRef.BuildNestedRequirement(Constraint);
3462   }
3463 
3464   /// \brief Build a new Objective-C boxed expression.
3465   ///
3466   /// By default, performs semantic analysis to build the new expression.
3467   /// Subclasses may override this routine to provide different behavior.
3468   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3469     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3470   }
3471 
3472   /// Build a new Objective-C array literal.
3473   ///
3474   /// By default, performs semantic analysis to build the new expression.
3475   /// Subclasses may override this routine to provide different behavior.
3476   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3477                                      Expr **Elements, unsigned NumElements) {
3478     return getSema().BuildObjCArrayLiteral(Range,
3479                                            MultiExprArg(Elements, NumElements));
3480   }
3481 
3482   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3483                                          Expr *Base, Expr *Key,
3484                                          ObjCMethodDecl *getterMethod,
3485                                          ObjCMethodDecl *setterMethod) {
3486     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3487                                                    getterMethod, setterMethod);
3488   }
3489 
3490   /// Build a new Objective-C dictionary literal.
3491   ///
3492   /// By default, performs semantic analysis to build the new expression.
3493   /// Subclasses may override this routine to provide different behavior.
3494   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3495                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3496     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3497   }
3498 
3499   /// Build a new Objective-C \@encode expression.
3500   ///
3501   /// By default, performs semantic analysis to build the new expression.
3502   /// Subclasses may override this routine to provide different behavior.
3503   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3504                                          TypeSourceInfo *EncodeTypeInfo,
3505                                          SourceLocation RParenLoc) {
3506     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3507   }
3508 
3509   /// Build a new Objective-C class message.
3510   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3511                                           Selector Sel,
3512                                           ArrayRef<SourceLocation> SelectorLocs,
3513                                           ObjCMethodDecl *Method,
3514                                           SourceLocation LBracLoc,
3515                                           MultiExprArg Args,
3516                                           SourceLocation RBracLoc) {
3517     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3518                                      ReceiverTypeInfo->getType(),
3519                                      /*SuperLoc=*/SourceLocation(),
3520                                      Sel, Method, LBracLoc, SelectorLocs,
3521                                      RBracLoc, Args);
3522   }
3523 
3524   /// Build a new Objective-C instance message.
3525   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3526                                           Selector Sel,
3527                                           ArrayRef<SourceLocation> SelectorLocs,
3528                                           ObjCMethodDecl *Method,
3529                                           SourceLocation LBracLoc,
3530                                           MultiExprArg Args,
3531                                           SourceLocation RBracLoc) {
3532     return SemaRef.BuildInstanceMessage(Receiver,
3533                                         Receiver->getType(),
3534                                         /*SuperLoc=*/SourceLocation(),
3535                                         Sel, Method, LBracLoc, SelectorLocs,
3536                                         RBracLoc, Args);
3537   }
3538 
3539   /// Build a new Objective-C instance/class message to 'super'.
3540   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3541                                     Selector Sel,
3542                                     ArrayRef<SourceLocation> SelectorLocs,
3543                                     QualType SuperType,
3544                                     ObjCMethodDecl *Method,
3545                                     SourceLocation LBracLoc,
3546                                     MultiExprArg Args,
3547                                     SourceLocation RBracLoc) {
3548     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3549                                           SuperType,
3550                                           SuperLoc,
3551                                           Sel, Method, LBracLoc, SelectorLocs,
3552                                           RBracLoc, Args)
3553                                       : SemaRef.BuildClassMessage(nullptr,
3554                                           SuperType,
3555                                           SuperLoc,
3556                                           Sel, Method, LBracLoc, SelectorLocs,
3557                                           RBracLoc, Args);
3558 
3559 
3560   }
3561 
3562   /// Build a new Objective-C ivar reference expression.
3563   ///
3564   /// By default, performs semantic analysis to build the new expression.
3565   /// Subclasses may override this routine to provide different behavior.
3566   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3567                                           SourceLocation IvarLoc,
3568                                           bool IsArrow, bool IsFreeIvar) {
3569     CXXScopeSpec SS;
3570     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3571     ExprResult Result = getSema().BuildMemberReferenceExpr(
3572         BaseArg, BaseArg->getType(),
3573         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3574         /*FirstQualifierInScope=*/nullptr, NameInfo,
3575         /*TemplateArgs=*/nullptr,
3576         /*S=*/nullptr);
3577     if (IsFreeIvar && Result.isUsable())
3578       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3579     return Result;
3580   }
3581 
3582   /// Build a new Objective-C property reference expression.
3583   ///
3584   /// By default, performs semantic analysis to build the new expression.
3585   /// Subclasses may override this routine to provide different behavior.
3586   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3587                                         ObjCPropertyDecl *Property,
3588                                         SourceLocation PropertyLoc) {
3589     CXXScopeSpec SS;
3590     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3591     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3592                                               /*FIXME:*/PropertyLoc,
3593                                               /*IsArrow=*/false,
3594                                               SS, SourceLocation(),
3595                                               /*FirstQualifierInScope=*/nullptr,
3596                                               NameInfo,
3597                                               /*TemplateArgs=*/nullptr,
3598                                               /*S=*/nullptr);
3599   }
3600 
3601   /// Build a new Objective-C property reference expression.
3602   ///
3603   /// By default, performs semantic analysis to build the new expression.
3604   /// Subclasses may override this routine to provide different behavior.
3605   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3606                                         ObjCMethodDecl *Getter,
3607                                         ObjCMethodDecl *Setter,
3608                                         SourceLocation PropertyLoc) {
3609     // Since these expressions can only be value-dependent, we do not
3610     // need to perform semantic analysis again.
3611     return Owned(
3612       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3613                                                   VK_LValue, OK_ObjCProperty,
3614                                                   PropertyLoc, Base));
3615   }
3616 
3617   /// Build a new Objective-C "isa" expression.
3618   ///
3619   /// By default, performs semantic analysis to build the new expression.
3620   /// Subclasses may override this routine to provide different behavior.
3621   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3622                                 SourceLocation OpLoc, bool IsArrow) {
3623     CXXScopeSpec SS;
3624     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3625     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3626                                               OpLoc, IsArrow,
3627                                               SS, SourceLocation(),
3628                                               /*FirstQualifierInScope=*/nullptr,
3629                                               NameInfo,
3630                                               /*TemplateArgs=*/nullptr,
3631                                               /*S=*/nullptr);
3632   }
3633 
3634   /// Build a new shuffle vector expression.
3635   ///
3636   /// By default, performs semantic analysis to build the new expression.
3637   /// Subclasses may override this routine to provide different behavior.
3638   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3639                                       MultiExprArg SubExprs,
3640                                       SourceLocation RParenLoc) {
3641     // Find the declaration for __builtin_shufflevector
3642     const IdentifierInfo &Name
3643       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3644     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3645     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3646     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3647 
3648     // Build a reference to the __builtin_shufflevector builtin
3649     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3650     Expr *Callee = new (SemaRef.Context)
3651         DeclRefExpr(SemaRef.Context, Builtin, false,
3652                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3653     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3654     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3655                                        CK_BuiltinFnToFnPtr).get();
3656 
3657     // Build the CallExpr
3658     ExprResult TheCall = CallExpr::Create(
3659         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3660         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3661         FPOptionsOverride());
3662 
3663     // Type-check the __builtin_shufflevector expression.
3664     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3665   }
3666 
3667   /// Build a new convert vector expression.
3668   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3669                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3670                                       SourceLocation RParenLoc) {
3671     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3672                                          BuiltinLoc, RParenLoc);
3673   }
3674 
3675   /// Build a new template argument pack expansion.
3676   ///
3677   /// By default, performs semantic analysis to build a new pack expansion
3678   /// for a template argument. Subclasses may override this routine to provide
3679   /// different behavior.
3680   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3681                                            SourceLocation EllipsisLoc,
3682                                            Optional<unsigned> NumExpansions) {
3683     switch (Pattern.getArgument().getKind()) {
3684     case TemplateArgument::Expression: {
3685       ExprResult Result
3686         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3687                                        EllipsisLoc, NumExpansions);
3688       if (Result.isInvalid())
3689         return TemplateArgumentLoc();
3690 
3691       return TemplateArgumentLoc(Result.get(), Result.get());
3692     }
3693 
3694     case TemplateArgument::Template:
3695       return TemplateArgumentLoc(
3696           SemaRef.Context,
3697           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3698                            NumExpansions),
3699           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3700           EllipsisLoc);
3701 
3702     case TemplateArgument::Null:
3703     case TemplateArgument::Integral:
3704     case TemplateArgument::Declaration:
3705     case TemplateArgument::Pack:
3706     case TemplateArgument::TemplateExpansion:
3707     case TemplateArgument::NullPtr:
3708       llvm_unreachable("Pack expansion pattern has no parameter packs");
3709 
3710     case TemplateArgument::Type:
3711       if (TypeSourceInfo *Expansion
3712             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3713                                            EllipsisLoc,
3714                                            NumExpansions))
3715         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3716                                    Expansion);
3717       break;
3718     }
3719 
3720     return TemplateArgumentLoc();
3721   }
3722 
3723   /// Build a new expression pack expansion.
3724   ///
3725   /// By default, performs semantic analysis to build a new pack expansion
3726   /// for an expression. Subclasses may override this routine to provide
3727   /// different behavior.
3728   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3729                                   Optional<unsigned> NumExpansions) {
3730     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3731   }
3732 
3733   /// Build a new C++1z fold-expression.
3734   ///
3735   /// By default, performs semantic analysis in order to build a new fold
3736   /// expression.
3737   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3738                                 SourceLocation LParenLoc, Expr *LHS,
3739                                 BinaryOperatorKind Operator,
3740                                 SourceLocation EllipsisLoc, Expr *RHS,
3741                                 SourceLocation RParenLoc,
3742                                 Optional<unsigned> NumExpansions) {
3743     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3744                                       EllipsisLoc, RHS, RParenLoc,
3745                                       NumExpansions);
3746   }
3747 
3748   /// Build an empty C++1z fold-expression with the given operator.
3749   ///
3750   /// By default, produces the fallback value for the fold-expression, or
3751   /// produce an error if there is no fallback value.
3752   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3753                                      BinaryOperatorKind Operator) {
3754     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3755   }
3756 
3757   /// Build a new atomic operation expression.
3758   ///
3759   /// By default, performs semantic analysis to build the new expression.
3760   /// Subclasses may override this routine to provide different behavior.
3761   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3762                                AtomicExpr::AtomicOp Op,
3763                                SourceLocation RParenLoc) {
3764     // Use this for all of the locations, since we don't know the difference
3765     // between the call and the expr at this point.
3766     SourceRange Range{BuiltinLoc, RParenLoc};
3767     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3768                                      Sema::AtomicArgumentOrder::AST);
3769   }
3770 
3771   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3772                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3773     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3774   }
3775 
3776 private:
3777   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3778                                      QualType ObjectType,
3779                                      NamedDecl *FirstQualifierInScope,
3780                                      CXXScopeSpec &SS);
3781 
3782   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3783                                              QualType ObjectType,
3784                                              NamedDecl *FirstQualifierInScope,
3785                                              CXXScopeSpec &SS);
3786 
3787   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3788                                             NamedDecl *FirstQualifierInScope,
3789                                             CXXScopeSpec &SS);
3790 
3791   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3792                                       DependentNameTypeLoc TL,
3793                                       bool DeducibleTSTContext);
3794 };
3795 
3796 template <typename Derived>
3797 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3798   if (!S)
3799     return S;
3800 
3801   switch (S->getStmtClass()) {
3802   case Stmt::NoStmtClass: break;
3803 
3804   // Transform individual statement nodes
3805   // Pass SDK into statements that can produce a value
3806 #define STMT(Node, Parent)                                              \
3807   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3808 #define VALUESTMT(Node, Parent)                                         \
3809   case Stmt::Node##Class:                                               \
3810     return getDerived().Transform##Node(cast<Node>(S), SDK);
3811 #define ABSTRACT_STMT(Node)
3812 #define EXPR(Node, Parent)
3813 #include "clang/AST/StmtNodes.inc"
3814 
3815   // Transform expressions by calling TransformExpr.
3816 #define STMT(Node, Parent)
3817 #define ABSTRACT_STMT(Stmt)
3818 #define EXPR(Node, Parent) case Stmt::Node##Class:
3819 #include "clang/AST/StmtNodes.inc"
3820     {
3821       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3822 
3823       if (SDK == SDK_StmtExprResult)
3824         E = getSema().ActOnStmtExprResult(E);
3825       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3826     }
3827   }
3828 
3829   return S;
3830 }
3831 
3832 template<typename Derived>
3833 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3834   if (!S)
3835     return S;
3836 
3837   switch (S->getClauseKind()) {
3838   default: break;
3839   // Transform individual clause nodes
3840 #define GEN_CLANG_CLAUSE_CLASS
3841 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3842   case Enum:                                                                   \
3843     return getDerived().Transform##Class(cast<Class>(S));
3844 #include "llvm/Frontend/OpenMP/OMP.inc"
3845   }
3846 
3847   return S;
3848 }
3849 
3850 
3851 template<typename Derived>
3852 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3853   if (!E)
3854     return E;
3855 
3856   switch (E->getStmtClass()) {
3857     case Stmt::NoStmtClass: break;
3858 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3859 #define ABSTRACT_STMT(Stmt)
3860 #define EXPR(Node, Parent)                                              \
3861     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3862 #include "clang/AST/StmtNodes.inc"
3863   }
3864 
3865   return E;
3866 }
3867 
3868 template<typename Derived>
3869 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3870                                                         bool NotCopyInit) {
3871   // Initializers are instantiated like expressions, except that various outer
3872   // layers are stripped.
3873   if (!Init)
3874     return Init;
3875 
3876   if (auto *FE = dyn_cast<FullExpr>(Init))
3877     Init = FE->getSubExpr();
3878 
3879   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
3880     OpaqueValueExpr *OVE = AIL->getCommonExpr();
3881     Init = OVE->getSourceExpr();
3882   }
3883 
3884   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3885     Init = MTE->getSubExpr();
3886 
3887   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3888     Init = Binder->getSubExpr();
3889 
3890   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3891     Init = ICE->getSubExprAsWritten();
3892 
3893   if (CXXStdInitializerListExpr *ILE =
3894           dyn_cast<CXXStdInitializerListExpr>(Init))
3895     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3896 
3897   // If this is copy-initialization, we only need to reconstruct
3898   // InitListExprs. Other forms of copy-initialization will be a no-op if
3899   // the initializer is already the right type.
3900   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3901   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3902     return getDerived().TransformExpr(Init);
3903 
3904   // Revert value-initialization back to empty parens.
3905   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3906     SourceRange Parens = VIE->getSourceRange();
3907     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3908                                              Parens.getEnd());
3909   }
3910 
3911   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3912   if (isa<ImplicitValueInitExpr>(Init))
3913     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3914                                              SourceLocation());
3915 
3916   // Revert initialization by constructor back to a parenthesized or braced list
3917   // of expressions. Any other form of initializer can just be reused directly.
3918   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3919     return getDerived().TransformExpr(Init);
3920 
3921   // If the initialization implicitly converted an initializer list to a
3922   // std::initializer_list object, unwrap the std::initializer_list too.
3923   if (Construct && Construct->isStdInitListInitialization())
3924     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3925 
3926   // Enter a list-init context if this was list initialization.
3927   EnterExpressionEvaluationContext Context(
3928       getSema(), EnterExpressionEvaluationContext::InitList,
3929       Construct->isListInitialization());
3930 
3931   SmallVector<Expr*, 8> NewArgs;
3932   bool ArgChanged = false;
3933   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3934                                   /*IsCall*/true, NewArgs, &ArgChanged))
3935     return ExprError();
3936 
3937   // If this was list initialization, revert to syntactic list form.
3938   if (Construct->isListInitialization())
3939     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3940                                         Construct->getEndLoc());
3941 
3942   // Build a ParenListExpr to represent anything else.
3943   SourceRange Parens = Construct->getParenOrBraceRange();
3944   if (Parens.isInvalid()) {
3945     // This was a variable declaration's initialization for which no initializer
3946     // was specified.
3947     assert(NewArgs.empty() &&
3948            "no parens or braces but have direct init with arguments?");
3949     return ExprEmpty();
3950   }
3951   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3952                                            Parens.getEnd());
3953 }
3954 
3955 template<typename Derived>
3956 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3957                                             unsigned NumInputs,
3958                                             bool IsCall,
3959                                       SmallVectorImpl<Expr *> &Outputs,
3960                                             bool *ArgChanged) {
3961   for (unsigned I = 0; I != NumInputs; ++I) {
3962     // If requested, drop call arguments that need to be dropped.
3963     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3964       if (ArgChanged)
3965         *ArgChanged = true;
3966 
3967       break;
3968     }
3969 
3970     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3971       Expr *Pattern = Expansion->getPattern();
3972 
3973       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3974       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3975       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3976 
3977       // Determine whether the set of unexpanded parameter packs can and should
3978       // be expanded.
3979       bool Expand = true;
3980       bool RetainExpansion = false;
3981       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3982       Optional<unsigned> NumExpansions = OrigNumExpansions;
3983       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3984                                                Pattern->getSourceRange(),
3985                                                Unexpanded,
3986                                                Expand, RetainExpansion,
3987                                                NumExpansions))
3988         return true;
3989 
3990       if (!Expand) {
3991         // The transform has determined that we should perform a simple
3992         // transformation on the pack expansion, producing another pack
3993         // expansion.
3994         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3995         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3996         if (OutPattern.isInvalid())
3997           return true;
3998 
3999         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
4000                                                 Expansion->getEllipsisLoc(),
4001                                                            NumExpansions);
4002         if (Out.isInvalid())
4003           return true;
4004 
4005         if (ArgChanged)
4006           *ArgChanged = true;
4007         Outputs.push_back(Out.get());
4008         continue;
4009       }
4010 
4011       // Record right away that the argument was changed.  This needs
4012       // to happen even if the array expands to nothing.
4013       if (ArgChanged) *ArgChanged = true;
4014 
4015       // The transform has determined that we should perform an elementwise
4016       // expansion of the pattern. Do so.
4017       for (unsigned I = 0; I != *NumExpansions; ++I) {
4018         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4019         ExprResult Out = getDerived().TransformExpr(Pattern);
4020         if (Out.isInvalid())
4021           return true;
4022 
4023         if (Out.get()->containsUnexpandedParameterPack()) {
4024           Out = getDerived().RebuildPackExpansion(
4025               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4026           if (Out.isInvalid())
4027             return true;
4028         }
4029 
4030         Outputs.push_back(Out.get());
4031       }
4032 
4033       // If we're supposed to retain a pack expansion, do so by temporarily
4034       // forgetting the partially-substituted parameter pack.
4035       if (RetainExpansion) {
4036         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4037 
4038         ExprResult Out = getDerived().TransformExpr(Pattern);
4039         if (Out.isInvalid())
4040           return true;
4041 
4042         Out = getDerived().RebuildPackExpansion(
4043             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4044         if (Out.isInvalid())
4045           return true;
4046 
4047         Outputs.push_back(Out.get());
4048       }
4049 
4050       continue;
4051     }
4052 
4053     ExprResult Result =
4054       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4055              : getDerived().TransformExpr(Inputs[I]);
4056     if (Result.isInvalid())
4057       return true;
4058 
4059     if (Result.get() != Inputs[I] && ArgChanged)
4060       *ArgChanged = true;
4061 
4062     Outputs.push_back(Result.get());
4063   }
4064 
4065   return false;
4066 }
4067 
4068 template <typename Derived>
4069 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4070     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4071   if (Var) {
4072     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4073         getDerived().TransformDefinition(Var->getLocation(), Var));
4074 
4075     if (!ConditionVar)
4076       return Sema::ConditionError();
4077 
4078     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4079   }
4080 
4081   if (Expr) {
4082     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4083 
4084     if (CondExpr.isInvalid())
4085       return Sema::ConditionError();
4086 
4087     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4088                                     /*MissingOK=*/true);
4089   }
4090 
4091   return Sema::ConditionResult();
4092 }
4093 
4094 template <typename Derived>
4095 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4096     NestedNameSpecifierLoc NNS, QualType ObjectType,
4097     NamedDecl *FirstQualifierInScope) {
4098   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4099   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4100        Qualifier = Qualifier.getPrefix())
4101     Qualifiers.push_back(Qualifier);
4102 
4103   CXXScopeSpec SS;
4104   while (!Qualifiers.empty()) {
4105     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4106     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4107 
4108     switch (QNNS->getKind()) {
4109     case NestedNameSpecifier::Identifier: {
4110       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4111                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4112                                       ObjectType);
4113       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4114                                               SS, FirstQualifierInScope, false))
4115         return NestedNameSpecifierLoc();
4116       break;
4117     }
4118 
4119     case NestedNameSpecifier::Namespace: {
4120       NamespaceDecl *NS =
4121           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4122               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4123       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4124       break;
4125     }
4126 
4127     case NestedNameSpecifier::NamespaceAlias: {
4128       NamespaceAliasDecl *Alias =
4129           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4130               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4131       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4132                 Q.getLocalEndLoc());
4133       break;
4134     }
4135 
4136     case NestedNameSpecifier::Global:
4137       // There is no meaningful transformation that one could perform on the
4138       // global scope.
4139       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4140       break;
4141 
4142     case NestedNameSpecifier::Super: {
4143       CXXRecordDecl *RD =
4144           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4145               SourceLocation(), QNNS->getAsRecordDecl()));
4146       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4147       break;
4148     }
4149 
4150     case NestedNameSpecifier::TypeSpecWithTemplate:
4151     case NestedNameSpecifier::TypeSpec: {
4152       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4153                                               FirstQualifierInScope, SS);
4154 
4155       if (!TL)
4156         return NestedNameSpecifierLoc();
4157 
4158       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4159           (SemaRef.getLangOpts().CPlusPlus11 &&
4160            TL.getType()->isEnumeralType())) {
4161         assert(!TL.getType().hasLocalQualifiers() &&
4162                "Can't get cv-qualifiers here");
4163         if (TL.getType()->isEnumeralType())
4164           SemaRef.Diag(TL.getBeginLoc(),
4165                        diag::warn_cxx98_compat_enum_nested_name_spec);
4166         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4167                   Q.getLocalEndLoc());
4168         break;
4169       }
4170       // If the nested-name-specifier is an invalid type def, don't emit an
4171       // error because a previous error should have already been emitted.
4172       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4173       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4174         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4175             << TL.getType() << SS.getRange();
4176       }
4177       return NestedNameSpecifierLoc();
4178     }
4179     }
4180 
4181     // The qualifier-in-scope and object type only apply to the leftmost entity.
4182     FirstQualifierInScope = nullptr;
4183     ObjectType = QualType();
4184   }
4185 
4186   // Don't rebuild the nested-name-specifier if we don't have to.
4187   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4188       !getDerived().AlwaysRebuild())
4189     return NNS;
4190 
4191   // If we can re-use the source-location data from the original
4192   // nested-name-specifier, do so.
4193   if (SS.location_size() == NNS.getDataLength() &&
4194       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4195     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4196 
4197   // Allocate new nested-name-specifier location information.
4198   return SS.getWithLocInContext(SemaRef.Context);
4199 }
4200 
4201 template<typename Derived>
4202 DeclarationNameInfo
4203 TreeTransform<Derived>
4204 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4205   DeclarationName Name = NameInfo.getName();
4206   if (!Name)
4207     return DeclarationNameInfo();
4208 
4209   switch (Name.getNameKind()) {
4210   case DeclarationName::Identifier:
4211   case DeclarationName::ObjCZeroArgSelector:
4212   case DeclarationName::ObjCOneArgSelector:
4213   case DeclarationName::ObjCMultiArgSelector:
4214   case DeclarationName::CXXOperatorName:
4215   case DeclarationName::CXXLiteralOperatorName:
4216   case DeclarationName::CXXUsingDirective:
4217     return NameInfo;
4218 
4219   case DeclarationName::CXXDeductionGuideName: {
4220     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4221     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4222         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4223     if (!NewTemplate)
4224       return DeclarationNameInfo();
4225 
4226     DeclarationNameInfo NewNameInfo(NameInfo);
4227     NewNameInfo.setName(
4228         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4229     return NewNameInfo;
4230   }
4231 
4232   case DeclarationName::CXXConstructorName:
4233   case DeclarationName::CXXDestructorName:
4234   case DeclarationName::CXXConversionFunctionName: {
4235     TypeSourceInfo *NewTInfo;
4236     CanQualType NewCanTy;
4237     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4238       NewTInfo = getDerived().TransformType(OldTInfo);
4239       if (!NewTInfo)
4240         return DeclarationNameInfo();
4241       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4242     }
4243     else {
4244       NewTInfo = nullptr;
4245       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4246       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4247       if (NewT.isNull())
4248         return DeclarationNameInfo();
4249       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4250     }
4251 
4252     DeclarationName NewName
4253       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4254                                                            NewCanTy);
4255     DeclarationNameInfo NewNameInfo(NameInfo);
4256     NewNameInfo.setName(NewName);
4257     NewNameInfo.setNamedTypeInfo(NewTInfo);
4258     return NewNameInfo;
4259   }
4260   }
4261 
4262   llvm_unreachable("Unknown name kind.");
4263 }
4264 
4265 template<typename Derived>
4266 TemplateName
4267 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4268                                               TemplateName Name,
4269                                               SourceLocation NameLoc,
4270                                               QualType ObjectType,
4271                                               NamedDecl *FirstQualifierInScope,
4272                                               bool AllowInjectedClassName) {
4273   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4274     TemplateDecl *Template = QTN->getTemplateDecl();
4275     assert(Template && "qualified template name must refer to a template");
4276 
4277     TemplateDecl *TransTemplate
4278       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4279                                                               Template));
4280     if (!TransTemplate)
4281       return TemplateName();
4282 
4283     if (!getDerived().AlwaysRebuild() &&
4284         SS.getScopeRep() == QTN->getQualifier() &&
4285         TransTemplate == Template)
4286       return Name;
4287 
4288     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4289                                             TransTemplate);
4290   }
4291 
4292   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4293     if (SS.getScopeRep()) {
4294       // These apply to the scope specifier, not the template.
4295       ObjectType = QualType();
4296       FirstQualifierInScope = nullptr;
4297     }
4298 
4299     if (!getDerived().AlwaysRebuild() &&
4300         SS.getScopeRep() == DTN->getQualifier() &&
4301         ObjectType.isNull())
4302       return Name;
4303 
4304     // FIXME: Preserve the location of the "template" keyword.
4305     SourceLocation TemplateKWLoc = NameLoc;
4306 
4307     if (DTN->isIdentifier()) {
4308       return getDerived().RebuildTemplateName(SS,
4309                                               TemplateKWLoc,
4310                                               *DTN->getIdentifier(),
4311                                               NameLoc,
4312                                               ObjectType,
4313                                               FirstQualifierInScope,
4314                                               AllowInjectedClassName);
4315     }
4316 
4317     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4318                                             DTN->getOperator(), NameLoc,
4319                                             ObjectType, AllowInjectedClassName);
4320   }
4321 
4322   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4323     TemplateDecl *TransTemplate
4324       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4325                                                               Template));
4326     if (!TransTemplate)
4327       return TemplateName();
4328 
4329     if (!getDerived().AlwaysRebuild() &&
4330         TransTemplate == Template)
4331       return Name;
4332 
4333     return TemplateName(TransTemplate);
4334   }
4335 
4336   if (SubstTemplateTemplateParmPackStorage *SubstPack
4337       = Name.getAsSubstTemplateTemplateParmPack()) {
4338     TemplateTemplateParmDecl *TransParam
4339     = cast_or_null<TemplateTemplateParmDecl>(
4340             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4341     if (!TransParam)
4342       return TemplateName();
4343 
4344     if (!getDerived().AlwaysRebuild() &&
4345         TransParam == SubstPack->getParameterPack())
4346       return Name;
4347 
4348     return getDerived().RebuildTemplateName(TransParam,
4349                                             SubstPack->getArgumentPack());
4350   }
4351 
4352   // These should be getting filtered out before they reach the AST.
4353   llvm_unreachable("overloaded function decl survived to here");
4354 }
4355 
4356 template<typename Derived>
4357 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4358                                          const TemplateArgument &Arg,
4359                                          TemplateArgumentLoc &Output) {
4360   Output = getSema().getTrivialTemplateArgumentLoc(
4361       Arg, QualType(), getDerived().getBaseLocation());
4362 }
4363 
4364 template <typename Derived>
4365 bool TreeTransform<Derived>::TransformTemplateArgument(
4366     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4367     bool Uneval) {
4368   const TemplateArgument &Arg = Input.getArgument();
4369   switch (Arg.getKind()) {
4370   case TemplateArgument::Null:
4371   case TemplateArgument::Pack:
4372     llvm_unreachable("Unexpected TemplateArgument");
4373 
4374   case TemplateArgument::Integral:
4375   case TemplateArgument::NullPtr:
4376   case TemplateArgument::Declaration: {
4377     // Transform a resolved template argument straight to a resolved template
4378     // argument. We get here when substituting into an already-substituted
4379     // template type argument during concept satisfaction checking.
4380     QualType T = Arg.getNonTypeTemplateArgumentType();
4381     QualType NewT = getDerived().TransformType(T);
4382     if (NewT.isNull())
4383       return true;
4384 
4385     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4386                        ? Arg.getAsDecl()
4387                        : nullptr;
4388     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4389                               getDerived().getBaseLocation(), D))
4390                         : nullptr;
4391     if (D && !NewD)
4392       return true;
4393 
4394     if (NewT == T && D == NewD)
4395       Output = Input;
4396     else if (Arg.getKind() == TemplateArgument::Integral)
4397       Output = TemplateArgumentLoc(
4398           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4399           TemplateArgumentLocInfo());
4400     else if (Arg.getKind() == TemplateArgument::NullPtr)
4401       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4402                                    TemplateArgumentLocInfo());
4403     else
4404       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4405                                    TemplateArgumentLocInfo());
4406 
4407     return false;
4408   }
4409 
4410   case TemplateArgument::Type: {
4411     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4412     if (!DI)
4413       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4414 
4415     DI = getDerived().TransformType(DI);
4416     if (!DI)
4417       return true;
4418 
4419     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4420     return false;
4421   }
4422 
4423   case TemplateArgument::Template: {
4424     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4425     if (QualifierLoc) {
4426       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4427       if (!QualifierLoc)
4428         return true;
4429     }
4430 
4431     CXXScopeSpec SS;
4432     SS.Adopt(QualifierLoc);
4433     TemplateName Template = getDerived().TransformTemplateName(
4434         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4435     if (Template.isNull())
4436       return true;
4437 
4438     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4439                                  QualifierLoc, Input.getTemplateNameLoc());
4440     return false;
4441   }
4442 
4443   case TemplateArgument::TemplateExpansion:
4444     llvm_unreachable("Caller should expand pack expansions");
4445 
4446   case TemplateArgument::Expression: {
4447     // Template argument expressions are constant expressions.
4448     EnterExpressionEvaluationContext Unevaluated(
4449         getSema(),
4450         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4451                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4452         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4453         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4454 
4455     Expr *InputExpr = Input.getSourceExpression();
4456     if (!InputExpr)
4457       InputExpr = Input.getArgument().getAsExpr();
4458 
4459     ExprResult E = getDerived().TransformExpr(InputExpr);
4460     E = SemaRef.ActOnConstantExpression(E);
4461     if (E.isInvalid())
4462       return true;
4463     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4464     return false;
4465   }
4466   }
4467 
4468   // Work around bogus GCC warning
4469   return true;
4470 }
4471 
4472 /// Iterator adaptor that invents template argument location information
4473 /// for each of the template arguments in its underlying iterator.
4474 template<typename Derived, typename InputIterator>
4475 class TemplateArgumentLocInventIterator {
4476   TreeTransform<Derived> &Self;
4477   InputIterator Iter;
4478 
4479 public:
4480   typedef TemplateArgumentLoc value_type;
4481   typedef TemplateArgumentLoc reference;
4482   typedef typename std::iterator_traits<InputIterator>::difference_type
4483     difference_type;
4484   typedef std::input_iterator_tag iterator_category;
4485 
4486   class pointer {
4487     TemplateArgumentLoc Arg;
4488 
4489   public:
4490     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4491 
4492     const TemplateArgumentLoc *operator->() const { return &Arg; }
4493   };
4494 
4495   TemplateArgumentLocInventIterator() { }
4496 
4497   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4498                                              InputIterator Iter)
4499     : Self(Self), Iter(Iter) { }
4500 
4501   TemplateArgumentLocInventIterator &operator++() {
4502     ++Iter;
4503     return *this;
4504   }
4505 
4506   TemplateArgumentLocInventIterator operator++(int) {
4507     TemplateArgumentLocInventIterator Old(*this);
4508     ++(*this);
4509     return Old;
4510   }
4511 
4512   reference operator*() const {
4513     TemplateArgumentLoc Result;
4514     Self.InventTemplateArgumentLoc(*Iter, Result);
4515     return Result;
4516   }
4517 
4518   pointer operator->() const { return pointer(**this); }
4519 
4520   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4521                          const TemplateArgumentLocInventIterator &Y) {
4522     return X.Iter == Y.Iter;
4523   }
4524 
4525   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4526                          const TemplateArgumentLocInventIterator &Y) {
4527     return X.Iter != Y.Iter;
4528   }
4529 };
4530 
4531 template<typename Derived>
4532 template<typename InputIterator>
4533 bool TreeTransform<Derived>::TransformTemplateArguments(
4534     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4535     bool Uneval) {
4536   for (; First != Last; ++First) {
4537     TemplateArgumentLoc Out;
4538     TemplateArgumentLoc In = *First;
4539 
4540     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4541       // Unpack argument packs, which we translate them into separate
4542       // arguments.
4543       // FIXME: We could do much better if we could guarantee that the
4544       // TemplateArgumentLocInfo for the pack expansion would be usable for
4545       // all of the template arguments in the argument pack.
4546       typedef TemplateArgumentLocInventIterator<Derived,
4547                                                 TemplateArgument::pack_iterator>
4548         PackLocIterator;
4549       if (TransformTemplateArguments(PackLocIterator(*this,
4550                                                  In.getArgument().pack_begin()),
4551                                      PackLocIterator(*this,
4552                                                    In.getArgument().pack_end()),
4553                                      Outputs, Uneval))
4554         return true;
4555 
4556       continue;
4557     }
4558 
4559     if (In.getArgument().isPackExpansion()) {
4560       // We have a pack expansion, for which we will be substituting into
4561       // the pattern.
4562       SourceLocation Ellipsis;
4563       Optional<unsigned> OrigNumExpansions;
4564       TemplateArgumentLoc Pattern
4565         = getSema().getTemplateArgumentPackExpansionPattern(
4566               In, Ellipsis, OrigNumExpansions);
4567 
4568       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4569       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4570       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4571 
4572       // Determine whether the set of unexpanded parameter packs can and should
4573       // be expanded.
4574       bool Expand = true;
4575       bool RetainExpansion = false;
4576       Optional<unsigned> NumExpansions = OrigNumExpansions;
4577       if (getDerived().TryExpandParameterPacks(Ellipsis,
4578                                                Pattern.getSourceRange(),
4579                                                Unexpanded,
4580                                                Expand,
4581                                                RetainExpansion,
4582                                                NumExpansions))
4583         return true;
4584 
4585       if (!Expand) {
4586         // The transform has determined that we should perform a simple
4587         // transformation on the pack expansion, producing another pack
4588         // expansion.
4589         TemplateArgumentLoc OutPattern;
4590         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4591         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4592           return true;
4593 
4594         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4595                                                 NumExpansions);
4596         if (Out.getArgument().isNull())
4597           return true;
4598 
4599         Outputs.addArgument(Out);
4600         continue;
4601       }
4602 
4603       // The transform has determined that we should perform an elementwise
4604       // expansion of the pattern. Do so.
4605       for (unsigned I = 0; I != *NumExpansions; ++I) {
4606         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4607 
4608         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4609           return true;
4610 
4611         if (Out.getArgument().containsUnexpandedParameterPack()) {
4612           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4613                                                   OrigNumExpansions);
4614           if (Out.getArgument().isNull())
4615             return true;
4616         }
4617 
4618         Outputs.addArgument(Out);
4619       }
4620 
4621       // If we're supposed to retain a pack expansion, do so by temporarily
4622       // forgetting the partially-substituted parameter pack.
4623       if (RetainExpansion) {
4624         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4625 
4626         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4627           return true;
4628 
4629         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4630                                                 OrigNumExpansions);
4631         if (Out.getArgument().isNull())
4632           return true;
4633 
4634         Outputs.addArgument(Out);
4635       }
4636 
4637       continue;
4638     }
4639 
4640     // The simple case:
4641     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4642       return true;
4643 
4644     Outputs.addArgument(Out);
4645   }
4646 
4647   return false;
4648 
4649 }
4650 
4651 //===----------------------------------------------------------------------===//
4652 // Type transformation
4653 //===----------------------------------------------------------------------===//
4654 
4655 template<typename Derived>
4656 QualType TreeTransform<Derived>::TransformType(QualType T) {
4657   if (getDerived().AlreadyTransformed(T))
4658     return T;
4659 
4660   // Temporary workaround.  All of these transformations should
4661   // eventually turn into transformations on TypeLocs.
4662   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4663                                                 getDerived().getBaseLocation());
4664 
4665   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4666 
4667   if (!NewDI)
4668     return QualType();
4669 
4670   return NewDI->getType();
4671 }
4672 
4673 template<typename Derived>
4674 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4675   // Refine the base location to the type's location.
4676   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4677                        getDerived().getBaseEntity());
4678   if (getDerived().AlreadyTransformed(DI->getType()))
4679     return DI;
4680 
4681   TypeLocBuilder TLB;
4682 
4683   TypeLoc TL = DI->getTypeLoc();
4684   TLB.reserve(TL.getFullDataSize());
4685 
4686   QualType Result = getDerived().TransformType(TLB, TL);
4687   if (Result.isNull())
4688     return nullptr;
4689 
4690   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4691 }
4692 
4693 template<typename Derived>
4694 QualType
4695 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4696   switch (T.getTypeLocClass()) {
4697 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4698 #define TYPELOC(CLASS, PARENT)                                                 \
4699   case TypeLoc::CLASS:                                                         \
4700     return getDerived().Transform##CLASS##Type(TLB,                            \
4701                                                T.castAs<CLASS##TypeLoc>());
4702 #include "clang/AST/TypeLocNodes.def"
4703   }
4704 
4705   llvm_unreachable("unhandled type loc!");
4706 }
4707 
4708 template<typename Derived>
4709 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4710   if (!isa<DependentNameType>(T))
4711     return TransformType(T);
4712 
4713   if (getDerived().AlreadyTransformed(T))
4714     return T;
4715   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4716                                                 getDerived().getBaseLocation());
4717   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4718   return NewDI ? NewDI->getType() : QualType();
4719 }
4720 
4721 template<typename Derived>
4722 TypeSourceInfo *
4723 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4724   if (!isa<DependentNameType>(DI->getType()))
4725     return TransformType(DI);
4726 
4727   // Refine the base location to the type's location.
4728   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4729                        getDerived().getBaseEntity());
4730   if (getDerived().AlreadyTransformed(DI->getType()))
4731     return DI;
4732 
4733   TypeLocBuilder TLB;
4734 
4735   TypeLoc TL = DI->getTypeLoc();
4736   TLB.reserve(TL.getFullDataSize());
4737 
4738   auto QTL = TL.getAs<QualifiedTypeLoc>();
4739   if (QTL)
4740     TL = QTL.getUnqualifiedLoc();
4741 
4742   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4743 
4744   QualType Result = getDerived().TransformDependentNameType(
4745       TLB, DNTL, /*DeducedTSTContext*/true);
4746   if (Result.isNull())
4747     return nullptr;
4748 
4749   if (QTL) {
4750     Result = getDerived().RebuildQualifiedType(Result, QTL);
4751     if (Result.isNull())
4752       return nullptr;
4753     TLB.TypeWasModifiedSafely(Result);
4754   }
4755 
4756   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4757 }
4758 
4759 template<typename Derived>
4760 QualType
4761 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4762                                                QualifiedTypeLoc T) {
4763   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4764   if (Result.isNull())
4765     return QualType();
4766 
4767   Result = getDerived().RebuildQualifiedType(Result, T);
4768 
4769   if (Result.isNull())
4770     return QualType();
4771 
4772   // RebuildQualifiedType might have updated the type, but not in a way
4773   // that invalidates the TypeLoc. (There's no location information for
4774   // qualifiers.)
4775   TLB.TypeWasModifiedSafely(Result);
4776 
4777   return Result;
4778 }
4779 
4780 template <typename Derived>
4781 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4782                                                       QualifiedTypeLoc TL) {
4783 
4784   SourceLocation Loc = TL.getBeginLoc();
4785   Qualifiers Quals = TL.getType().getLocalQualifiers();
4786 
4787   if ((T.getAddressSpace() != LangAS::Default &&
4788        Quals.getAddressSpace() != LangAS::Default) &&
4789       T.getAddressSpace() != Quals.getAddressSpace()) {
4790     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4791         << TL.getType() << T;
4792     return QualType();
4793   }
4794 
4795   // C++ [dcl.fct]p7:
4796   //   [When] adding cv-qualifications on top of the function type [...] the
4797   //   cv-qualifiers are ignored.
4798   if (T->isFunctionType()) {
4799     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4800                                                      Quals.getAddressSpace());
4801     return T;
4802   }
4803 
4804   // C++ [dcl.ref]p1:
4805   //   when the cv-qualifiers are introduced through the use of a typedef-name
4806   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4807   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4808   // applied to a reference type.
4809   if (T->isReferenceType()) {
4810     // The only qualifier that applies to a reference type is restrict.
4811     if (!Quals.hasRestrict())
4812       return T;
4813     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4814   }
4815 
4816   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4817   // resulting type.
4818   if (Quals.hasObjCLifetime()) {
4819     if (!T->isObjCLifetimeType() && !T->isDependentType())
4820       Quals.removeObjCLifetime();
4821     else if (T.getObjCLifetime()) {
4822       // Objective-C ARC:
4823       //   A lifetime qualifier applied to a substituted template parameter
4824       //   overrides the lifetime qualifier from the template argument.
4825       const AutoType *AutoTy;
4826       if (const SubstTemplateTypeParmType *SubstTypeParam
4827                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4828         QualType Replacement = SubstTypeParam->getReplacementType();
4829         Qualifiers Qs = Replacement.getQualifiers();
4830         Qs.removeObjCLifetime();
4831         Replacement = SemaRef.Context.getQualifiedType(
4832             Replacement.getUnqualifiedType(), Qs);
4833         T = SemaRef.Context.getSubstTemplateTypeParmType(
4834             SubstTypeParam->getReplacedParameter(), Replacement);
4835       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4836         // 'auto' types behave the same way as template parameters.
4837         QualType Deduced = AutoTy->getDeducedType();
4838         Qualifiers Qs = Deduced.getQualifiers();
4839         Qs.removeObjCLifetime();
4840         Deduced =
4841             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4842         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4843                                         AutoTy->isDependentType(),
4844                                         /*isPack=*/false,
4845                                         AutoTy->getTypeConstraintConcept(),
4846                                         AutoTy->getTypeConstraintArguments());
4847       } else {
4848         // Otherwise, complain about the addition of a qualifier to an
4849         // already-qualified type.
4850         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4851         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4852         Quals.removeObjCLifetime();
4853       }
4854     }
4855   }
4856 
4857   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4858 }
4859 
4860 template<typename Derived>
4861 TypeLoc
4862 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4863                                                    QualType ObjectType,
4864                                                    NamedDecl *UnqualLookup,
4865                                                    CXXScopeSpec &SS) {
4866   if (getDerived().AlreadyTransformed(TL.getType()))
4867     return TL;
4868 
4869   TypeSourceInfo *TSI =
4870       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4871   if (TSI)
4872     return TSI->getTypeLoc();
4873   return TypeLoc();
4874 }
4875 
4876 template<typename Derived>
4877 TypeSourceInfo *
4878 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4879                                                    QualType ObjectType,
4880                                                    NamedDecl *UnqualLookup,
4881                                                    CXXScopeSpec &SS) {
4882   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4883     return TSInfo;
4884 
4885   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4886                                    UnqualLookup, SS);
4887 }
4888 
4889 template <typename Derived>
4890 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4891     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4892     CXXScopeSpec &SS) {
4893   QualType T = TL.getType();
4894   assert(!getDerived().AlreadyTransformed(T));
4895 
4896   TypeLocBuilder TLB;
4897   QualType Result;
4898 
4899   if (isa<TemplateSpecializationType>(T)) {
4900     TemplateSpecializationTypeLoc SpecTL =
4901         TL.castAs<TemplateSpecializationTypeLoc>();
4902 
4903     TemplateName Template = getDerived().TransformTemplateName(
4904         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4905         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4906     if (Template.isNull())
4907       return nullptr;
4908 
4909     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4910                                                               Template);
4911   } else if (isa<DependentTemplateSpecializationType>(T)) {
4912     DependentTemplateSpecializationTypeLoc SpecTL =
4913         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4914 
4915     TemplateName Template
4916       = getDerived().RebuildTemplateName(SS,
4917                                          SpecTL.getTemplateKeywordLoc(),
4918                                          *SpecTL.getTypePtr()->getIdentifier(),
4919                                          SpecTL.getTemplateNameLoc(),
4920                                          ObjectType, UnqualLookup,
4921                                          /*AllowInjectedClassName*/true);
4922     if (Template.isNull())
4923       return nullptr;
4924 
4925     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4926                                                                        SpecTL,
4927                                                                        Template,
4928                                                                        SS);
4929   } else {
4930     // Nothing special needs to be done for these.
4931     Result = getDerived().TransformType(TLB, TL);
4932   }
4933 
4934   if (Result.isNull())
4935     return nullptr;
4936 
4937   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4938 }
4939 
4940 template <class TyLoc> static inline
4941 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4942   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4943   NewT.setNameLoc(T.getNameLoc());
4944   return T.getType();
4945 }
4946 
4947 template<typename Derived>
4948 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4949                                                       BuiltinTypeLoc T) {
4950   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4951   NewT.setBuiltinLoc(T.getBuiltinLoc());
4952   if (T.needsExtraLocalData())
4953     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4954   return T.getType();
4955 }
4956 
4957 template<typename Derived>
4958 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4959                                                       ComplexTypeLoc T) {
4960   // FIXME: recurse?
4961   return TransformTypeSpecType(TLB, T);
4962 }
4963 
4964 template <typename Derived>
4965 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4966                                                        AdjustedTypeLoc TL) {
4967   // Adjustments applied during transformation are handled elsewhere.
4968   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4969 }
4970 
4971 template<typename Derived>
4972 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4973                                                       DecayedTypeLoc TL) {
4974   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4975   if (OriginalType.isNull())
4976     return QualType();
4977 
4978   QualType Result = TL.getType();
4979   if (getDerived().AlwaysRebuild() ||
4980       OriginalType != TL.getOriginalLoc().getType())
4981     Result = SemaRef.Context.getDecayedType(OriginalType);
4982   TLB.push<DecayedTypeLoc>(Result);
4983   // Nothing to set for DecayedTypeLoc.
4984   return Result;
4985 }
4986 
4987 template<typename Derived>
4988 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4989                                                       PointerTypeLoc TL) {
4990   QualType PointeeType
4991     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4992   if (PointeeType.isNull())
4993     return QualType();
4994 
4995   QualType Result = TL.getType();
4996   if (PointeeType->getAs<ObjCObjectType>()) {
4997     // A dependent pointer type 'T *' has is being transformed such
4998     // that an Objective-C class type is being replaced for 'T'. The
4999     // resulting pointer type is an ObjCObjectPointerType, not a
5000     // PointerType.
5001     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5002 
5003     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5004     NewT.setStarLoc(TL.getStarLoc());
5005     return Result;
5006   }
5007 
5008   if (getDerived().AlwaysRebuild() ||
5009       PointeeType != TL.getPointeeLoc().getType()) {
5010     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5011     if (Result.isNull())
5012       return QualType();
5013   }
5014 
5015   // Objective-C ARC can add lifetime qualifiers to the type that we're
5016   // pointing to.
5017   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5018 
5019   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5020   NewT.setSigilLoc(TL.getSigilLoc());
5021   return Result;
5022 }
5023 
5024 template<typename Derived>
5025 QualType
5026 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5027                                                   BlockPointerTypeLoc TL) {
5028   QualType PointeeType
5029     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5030   if (PointeeType.isNull())
5031     return QualType();
5032 
5033   QualType Result = TL.getType();
5034   if (getDerived().AlwaysRebuild() ||
5035       PointeeType != TL.getPointeeLoc().getType()) {
5036     Result = getDerived().RebuildBlockPointerType(PointeeType,
5037                                                   TL.getSigilLoc());
5038     if (Result.isNull())
5039       return QualType();
5040   }
5041 
5042   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5043   NewT.setSigilLoc(TL.getSigilLoc());
5044   return Result;
5045 }
5046 
5047 /// Transforms a reference type.  Note that somewhat paradoxically we
5048 /// don't care whether the type itself is an l-value type or an r-value
5049 /// type;  we only care if the type was *written* as an l-value type
5050 /// or an r-value type.
5051 template<typename Derived>
5052 QualType
5053 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5054                                                ReferenceTypeLoc TL) {
5055   const ReferenceType *T = TL.getTypePtr();
5056 
5057   // Note that this works with the pointee-as-written.
5058   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5059   if (PointeeType.isNull())
5060     return QualType();
5061 
5062   QualType Result = TL.getType();
5063   if (getDerived().AlwaysRebuild() ||
5064       PointeeType != T->getPointeeTypeAsWritten()) {
5065     Result = getDerived().RebuildReferenceType(PointeeType,
5066                                                T->isSpelledAsLValue(),
5067                                                TL.getSigilLoc());
5068     if (Result.isNull())
5069       return QualType();
5070   }
5071 
5072   // Objective-C ARC can add lifetime qualifiers to the type that we're
5073   // referring to.
5074   TLB.TypeWasModifiedSafely(
5075       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5076 
5077   // r-value references can be rebuilt as l-value references.
5078   ReferenceTypeLoc NewTL;
5079   if (isa<LValueReferenceType>(Result))
5080     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5081   else
5082     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5083   NewTL.setSigilLoc(TL.getSigilLoc());
5084 
5085   return Result;
5086 }
5087 
5088 template<typename Derived>
5089 QualType
5090 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5091                                                  LValueReferenceTypeLoc TL) {
5092   return TransformReferenceType(TLB, TL);
5093 }
5094 
5095 template<typename Derived>
5096 QualType
5097 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5098                                                  RValueReferenceTypeLoc TL) {
5099   return TransformReferenceType(TLB, TL);
5100 }
5101 
5102 template<typename Derived>
5103 QualType
5104 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5105                                                    MemberPointerTypeLoc TL) {
5106   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5107   if (PointeeType.isNull())
5108     return QualType();
5109 
5110   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5111   TypeSourceInfo *NewClsTInfo = nullptr;
5112   if (OldClsTInfo) {
5113     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5114     if (!NewClsTInfo)
5115       return QualType();
5116   }
5117 
5118   const MemberPointerType *T = TL.getTypePtr();
5119   QualType OldClsType = QualType(T->getClass(), 0);
5120   QualType NewClsType;
5121   if (NewClsTInfo)
5122     NewClsType = NewClsTInfo->getType();
5123   else {
5124     NewClsType = getDerived().TransformType(OldClsType);
5125     if (NewClsType.isNull())
5126       return QualType();
5127   }
5128 
5129   QualType Result = TL.getType();
5130   if (getDerived().AlwaysRebuild() ||
5131       PointeeType != T->getPointeeType() ||
5132       NewClsType != OldClsType) {
5133     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5134                                                    TL.getStarLoc());
5135     if (Result.isNull())
5136       return QualType();
5137   }
5138 
5139   // If we had to adjust the pointee type when building a member pointer, make
5140   // sure to push TypeLoc info for it.
5141   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5142   if (MPT && PointeeType != MPT->getPointeeType()) {
5143     assert(isa<AdjustedType>(MPT->getPointeeType()));
5144     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5145   }
5146 
5147   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5148   NewTL.setSigilLoc(TL.getSigilLoc());
5149   NewTL.setClassTInfo(NewClsTInfo);
5150 
5151   return Result;
5152 }
5153 
5154 template<typename Derived>
5155 QualType
5156 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5157                                                    ConstantArrayTypeLoc TL) {
5158   const ConstantArrayType *T = TL.getTypePtr();
5159   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5160   if (ElementType.isNull())
5161     return QualType();
5162 
5163   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5164   Expr *OldSize = TL.getSizeExpr();
5165   if (!OldSize)
5166     OldSize = const_cast<Expr*>(T->getSizeExpr());
5167   Expr *NewSize = nullptr;
5168   if (OldSize) {
5169     EnterExpressionEvaluationContext Unevaluated(
5170         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5171     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5172     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5173   }
5174 
5175   QualType Result = TL.getType();
5176   if (getDerived().AlwaysRebuild() ||
5177       ElementType != T->getElementType() ||
5178       (T->getSizeExpr() && NewSize != OldSize)) {
5179     Result = getDerived().RebuildConstantArrayType(ElementType,
5180                                                    T->getSizeModifier(),
5181                                                    T->getSize(), NewSize,
5182                                              T->getIndexTypeCVRQualifiers(),
5183                                                    TL.getBracketsRange());
5184     if (Result.isNull())
5185       return QualType();
5186   }
5187 
5188   // We might have either a ConstantArrayType or a VariableArrayType now:
5189   // a ConstantArrayType is allowed to have an element type which is a
5190   // VariableArrayType if the type is dependent.  Fortunately, all array
5191   // types have the same location layout.
5192   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5193   NewTL.setLBracketLoc(TL.getLBracketLoc());
5194   NewTL.setRBracketLoc(TL.getRBracketLoc());
5195   NewTL.setSizeExpr(NewSize);
5196 
5197   return Result;
5198 }
5199 
5200 template<typename Derived>
5201 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5202                                               TypeLocBuilder &TLB,
5203                                               IncompleteArrayTypeLoc TL) {
5204   const IncompleteArrayType *T = TL.getTypePtr();
5205   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5206   if (ElementType.isNull())
5207     return QualType();
5208 
5209   QualType Result = TL.getType();
5210   if (getDerived().AlwaysRebuild() ||
5211       ElementType != T->getElementType()) {
5212     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5213                                                      T->getSizeModifier(),
5214                                            T->getIndexTypeCVRQualifiers(),
5215                                                      TL.getBracketsRange());
5216     if (Result.isNull())
5217       return QualType();
5218   }
5219 
5220   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5221   NewTL.setLBracketLoc(TL.getLBracketLoc());
5222   NewTL.setRBracketLoc(TL.getRBracketLoc());
5223   NewTL.setSizeExpr(nullptr);
5224 
5225   return Result;
5226 }
5227 
5228 template<typename Derived>
5229 QualType
5230 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5231                                                    VariableArrayTypeLoc TL) {
5232   const VariableArrayType *T = TL.getTypePtr();
5233   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5234   if (ElementType.isNull())
5235     return QualType();
5236 
5237   ExprResult SizeResult;
5238   {
5239     EnterExpressionEvaluationContext Context(
5240         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5241     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5242   }
5243   if (SizeResult.isInvalid())
5244     return QualType();
5245   SizeResult =
5246       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5247   if (SizeResult.isInvalid())
5248     return QualType();
5249 
5250   Expr *Size = SizeResult.get();
5251 
5252   QualType Result = TL.getType();
5253   if (getDerived().AlwaysRebuild() ||
5254       ElementType != T->getElementType() ||
5255       Size != T->getSizeExpr()) {
5256     Result = getDerived().RebuildVariableArrayType(ElementType,
5257                                                    T->getSizeModifier(),
5258                                                    Size,
5259                                              T->getIndexTypeCVRQualifiers(),
5260                                                    TL.getBracketsRange());
5261     if (Result.isNull())
5262       return QualType();
5263   }
5264 
5265   // We might have constant size array now, but fortunately it has the same
5266   // location layout.
5267   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5268   NewTL.setLBracketLoc(TL.getLBracketLoc());
5269   NewTL.setRBracketLoc(TL.getRBracketLoc());
5270   NewTL.setSizeExpr(Size);
5271 
5272   return Result;
5273 }
5274 
5275 template<typename Derived>
5276 QualType
5277 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5278                                              DependentSizedArrayTypeLoc TL) {
5279   const DependentSizedArrayType *T = TL.getTypePtr();
5280   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5281   if (ElementType.isNull())
5282     return QualType();
5283 
5284   // Array bounds are constant expressions.
5285   EnterExpressionEvaluationContext Unevaluated(
5286       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5287 
5288   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5289   Expr *origSize = TL.getSizeExpr();
5290   if (!origSize) origSize = T->getSizeExpr();
5291 
5292   ExprResult sizeResult
5293     = getDerived().TransformExpr(origSize);
5294   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5295   if (sizeResult.isInvalid())
5296     return QualType();
5297 
5298   Expr *size = sizeResult.get();
5299 
5300   QualType Result = TL.getType();
5301   if (getDerived().AlwaysRebuild() ||
5302       ElementType != T->getElementType() ||
5303       size != origSize) {
5304     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5305                                                          T->getSizeModifier(),
5306                                                          size,
5307                                                 T->getIndexTypeCVRQualifiers(),
5308                                                         TL.getBracketsRange());
5309     if (Result.isNull())
5310       return QualType();
5311   }
5312 
5313   // We might have any sort of array type now, but fortunately they
5314   // all have the same location layout.
5315   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5316   NewTL.setLBracketLoc(TL.getLBracketLoc());
5317   NewTL.setRBracketLoc(TL.getRBracketLoc());
5318   NewTL.setSizeExpr(size);
5319 
5320   return Result;
5321 }
5322 
5323 template <typename Derived>
5324 QualType TreeTransform<Derived>::TransformDependentVectorType(
5325     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5326   const DependentVectorType *T = TL.getTypePtr();
5327   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5328   if (ElementType.isNull())
5329     return QualType();
5330 
5331   EnterExpressionEvaluationContext Unevaluated(
5332       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5333 
5334   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5335   Size = SemaRef.ActOnConstantExpression(Size);
5336   if (Size.isInvalid())
5337     return QualType();
5338 
5339   QualType Result = TL.getType();
5340   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5341       Size.get() != T->getSizeExpr()) {
5342     Result = getDerived().RebuildDependentVectorType(
5343         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5344     if (Result.isNull())
5345       return QualType();
5346   }
5347 
5348   // Result might be dependent or not.
5349   if (isa<DependentVectorType>(Result)) {
5350     DependentVectorTypeLoc NewTL =
5351         TLB.push<DependentVectorTypeLoc>(Result);
5352     NewTL.setNameLoc(TL.getNameLoc());
5353   } else {
5354     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5355     NewTL.setNameLoc(TL.getNameLoc());
5356   }
5357 
5358   return Result;
5359 }
5360 
5361 template<typename Derived>
5362 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5363                                       TypeLocBuilder &TLB,
5364                                       DependentSizedExtVectorTypeLoc TL) {
5365   const DependentSizedExtVectorType *T = TL.getTypePtr();
5366 
5367   // FIXME: ext vector locs should be nested
5368   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5369   if (ElementType.isNull())
5370     return QualType();
5371 
5372   // Vector sizes are constant expressions.
5373   EnterExpressionEvaluationContext Unevaluated(
5374       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5375 
5376   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5377   Size = SemaRef.ActOnConstantExpression(Size);
5378   if (Size.isInvalid())
5379     return QualType();
5380 
5381   QualType Result = TL.getType();
5382   if (getDerived().AlwaysRebuild() ||
5383       ElementType != T->getElementType() ||
5384       Size.get() != T->getSizeExpr()) {
5385     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5386                                                              Size.get(),
5387                                                          T->getAttributeLoc());
5388     if (Result.isNull())
5389       return QualType();
5390   }
5391 
5392   // Result might be dependent or not.
5393   if (isa<DependentSizedExtVectorType>(Result)) {
5394     DependentSizedExtVectorTypeLoc NewTL
5395       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5396     NewTL.setNameLoc(TL.getNameLoc());
5397   } else {
5398     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5399     NewTL.setNameLoc(TL.getNameLoc());
5400   }
5401 
5402   return Result;
5403 }
5404 
5405 template <typename Derived>
5406 QualType
5407 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5408                                                     ConstantMatrixTypeLoc TL) {
5409   const ConstantMatrixType *T = TL.getTypePtr();
5410   QualType ElementType = getDerived().TransformType(T->getElementType());
5411   if (ElementType.isNull())
5412     return QualType();
5413 
5414   QualType Result = TL.getType();
5415   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5416     Result = getDerived().RebuildConstantMatrixType(
5417         ElementType, T->getNumRows(), T->getNumColumns());
5418     if (Result.isNull())
5419       return QualType();
5420   }
5421 
5422   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5423   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5424   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5425   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5426   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5427 
5428   return Result;
5429 }
5430 
5431 template <typename Derived>
5432 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5433     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5434   const DependentSizedMatrixType *T = TL.getTypePtr();
5435 
5436   QualType ElementType = getDerived().TransformType(T->getElementType());
5437   if (ElementType.isNull()) {
5438     return QualType();
5439   }
5440 
5441   // Matrix dimensions are constant expressions.
5442   EnterExpressionEvaluationContext Unevaluated(
5443       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5444 
5445   Expr *origRows = TL.getAttrRowOperand();
5446   if (!origRows)
5447     origRows = T->getRowExpr();
5448   Expr *origColumns = TL.getAttrColumnOperand();
5449   if (!origColumns)
5450     origColumns = T->getColumnExpr();
5451 
5452   ExprResult rowResult = getDerived().TransformExpr(origRows);
5453   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5454   if (rowResult.isInvalid())
5455     return QualType();
5456 
5457   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5458   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5459   if (columnResult.isInvalid())
5460     return QualType();
5461 
5462   Expr *rows = rowResult.get();
5463   Expr *columns = columnResult.get();
5464 
5465   QualType Result = TL.getType();
5466   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5467       rows != origRows || columns != origColumns) {
5468     Result = getDerived().RebuildDependentSizedMatrixType(
5469         ElementType, rows, columns, T->getAttributeLoc());
5470 
5471     if (Result.isNull())
5472       return QualType();
5473   }
5474 
5475   // We might have any sort of matrix type now, but fortunately they
5476   // all have the same location layout.
5477   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5478   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5479   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5480   NewTL.setAttrRowOperand(rows);
5481   NewTL.setAttrColumnOperand(columns);
5482   return Result;
5483 }
5484 
5485 template <typename Derived>
5486 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5487     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5488   const DependentAddressSpaceType *T = TL.getTypePtr();
5489 
5490   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5491 
5492   if (pointeeType.isNull())
5493     return QualType();
5494 
5495   // Address spaces are constant expressions.
5496   EnterExpressionEvaluationContext Unevaluated(
5497       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5498 
5499   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5500   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5501   if (AddrSpace.isInvalid())
5502     return QualType();
5503 
5504   QualType Result = TL.getType();
5505   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5506       AddrSpace.get() != T->getAddrSpaceExpr()) {
5507     Result = getDerived().RebuildDependentAddressSpaceType(
5508         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5509     if (Result.isNull())
5510       return QualType();
5511   }
5512 
5513   // Result might be dependent or not.
5514   if (isa<DependentAddressSpaceType>(Result)) {
5515     DependentAddressSpaceTypeLoc NewTL =
5516         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5517 
5518     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5519     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5520     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5521 
5522   } else {
5523     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5524         Result, getDerived().getBaseLocation());
5525     TransformType(TLB, DI->getTypeLoc());
5526   }
5527 
5528   return Result;
5529 }
5530 
5531 template <typename Derived>
5532 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5533                                                      VectorTypeLoc TL) {
5534   const VectorType *T = TL.getTypePtr();
5535   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5536   if (ElementType.isNull())
5537     return QualType();
5538 
5539   QualType Result = TL.getType();
5540   if (getDerived().AlwaysRebuild() ||
5541       ElementType != T->getElementType()) {
5542     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5543                                             T->getVectorKind());
5544     if (Result.isNull())
5545       return QualType();
5546   }
5547 
5548   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5549   NewTL.setNameLoc(TL.getNameLoc());
5550 
5551   return Result;
5552 }
5553 
5554 template<typename Derived>
5555 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5556                                                         ExtVectorTypeLoc TL) {
5557   const VectorType *T = TL.getTypePtr();
5558   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5559   if (ElementType.isNull())
5560     return QualType();
5561 
5562   QualType Result = TL.getType();
5563   if (getDerived().AlwaysRebuild() ||
5564       ElementType != T->getElementType()) {
5565     Result = getDerived().RebuildExtVectorType(ElementType,
5566                                                T->getNumElements(),
5567                                                /*FIXME*/ SourceLocation());
5568     if (Result.isNull())
5569       return QualType();
5570   }
5571 
5572   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5573   NewTL.setNameLoc(TL.getNameLoc());
5574 
5575   return Result;
5576 }
5577 
5578 template <typename Derived>
5579 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5580     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5581     bool ExpectParameterPack) {
5582   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5583   TypeSourceInfo *NewDI = nullptr;
5584 
5585   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5586     // If we're substituting into a pack expansion type and we know the
5587     // length we want to expand to, just substitute for the pattern.
5588     TypeLoc OldTL = OldDI->getTypeLoc();
5589     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5590 
5591     TypeLocBuilder TLB;
5592     TypeLoc NewTL = OldDI->getTypeLoc();
5593     TLB.reserve(NewTL.getFullDataSize());
5594 
5595     QualType Result = getDerived().TransformType(TLB,
5596                                                OldExpansionTL.getPatternLoc());
5597     if (Result.isNull())
5598       return nullptr;
5599 
5600     Result = RebuildPackExpansionType(Result,
5601                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5602                                       OldExpansionTL.getEllipsisLoc(),
5603                                       NumExpansions);
5604     if (Result.isNull())
5605       return nullptr;
5606 
5607     PackExpansionTypeLoc NewExpansionTL
5608       = TLB.push<PackExpansionTypeLoc>(Result);
5609     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5610     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5611   } else
5612     NewDI = getDerived().TransformType(OldDI);
5613   if (!NewDI)
5614     return nullptr;
5615 
5616   if (NewDI == OldDI && indexAdjustment == 0)
5617     return OldParm;
5618 
5619   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5620                                              OldParm->getDeclContext(),
5621                                              OldParm->getInnerLocStart(),
5622                                              OldParm->getLocation(),
5623                                              OldParm->getIdentifier(),
5624                                              NewDI->getType(),
5625                                              NewDI,
5626                                              OldParm->getStorageClass(),
5627                                              /* DefArg */ nullptr);
5628   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5629                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5630   transformedLocalDecl(OldParm, {newParm});
5631   return newParm;
5632 }
5633 
5634 template <typename Derived>
5635 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5636     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5637     const QualType *ParamTypes,
5638     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5639     SmallVectorImpl<QualType> &OutParamTypes,
5640     SmallVectorImpl<ParmVarDecl *> *PVars,
5641     Sema::ExtParameterInfoBuilder &PInfos) {
5642   int indexAdjustment = 0;
5643 
5644   unsigned NumParams = Params.size();
5645   for (unsigned i = 0; i != NumParams; ++i) {
5646     if (ParmVarDecl *OldParm = Params[i]) {
5647       assert(OldParm->getFunctionScopeIndex() == i);
5648 
5649       Optional<unsigned> NumExpansions;
5650       ParmVarDecl *NewParm = nullptr;
5651       if (OldParm->isParameterPack()) {
5652         // We have a function parameter pack that may need to be expanded.
5653         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5654 
5655         // Find the parameter packs that could be expanded.
5656         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5657         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5658         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5659         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5660 
5661         // Determine whether we should expand the parameter packs.
5662         bool ShouldExpand = false;
5663         bool RetainExpansion = false;
5664         Optional<unsigned> OrigNumExpansions;
5665         if (Unexpanded.size() > 0) {
5666           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5667           NumExpansions = OrigNumExpansions;
5668           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5669                                                    Pattern.getSourceRange(),
5670                                                    Unexpanded,
5671                                                    ShouldExpand,
5672                                                    RetainExpansion,
5673                                                    NumExpansions)) {
5674             return true;
5675           }
5676         } else {
5677 #ifndef NDEBUG
5678           const AutoType *AT =
5679               Pattern.getType().getTypePtr()->getContainedAutoType();
5680           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5681                  "Could not find parameter packs or undeduced auto type!");
5682 #endif
5683         }
5684 
5685         if (ShouldExpand) {
5686           // Expand the function parameter pack into multiple, separate
5687           // parameters.
5688           getDerived().ExpandingFunctionParameterPack(OldParm);
5689           for (unsigned I = 0; I != *NumExpansions; ++I) {
5690             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5691             ParmVarDecl *NewParm
5692               = getDerived().TransformFunctionTypeParam(OldParm,
5693                                                         indexAdjustment++,
5694                                                         OrigNumExpansions,
5695                                                 /*ExpectParameterPack=*/false);
5696             if (!NewParm)
5697               return true;
5698 
5699             if (ParamInfos)
5700               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5701             OutParamTypes.push_back(NewParm->getType());
5702             if (PVars)
5703               PVars->push_back(NewParm);
5704           }
5705 
5706           // If we're supposed to retain a pack expansion, do so by temporarily
5707           // forgetting the partially-substituted parameter pack.
5708           if (RetainExpansion) {
5709             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5710             ParmVarDecl *NewParm
5711               = getDerived().TransformFunctionTypeParam(OldParm,
5712                                                         indexAdjustment++,
5713                                                         OrigNumExpansions,
5714                                                 /*ExpectParameterPack=*/false);
5715             if (!NewParm)
5716               return true;
5717 
5718             if (ParamInfos)
5719               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5720             OutParamTypes.push_back(NewParm->getType());
5721             if (PVars)
5722               PVars->push_back(NewParm);
5723           }
5724 
5725           // The next parameter should have the same adjustment as the
5726           // last thing we pushed, but we post-incremented indexAdjustment
5727           // on every push.  Also, if we push nothing, the adjustment should
5728           // go down by one.
5729           indexAdjustment--;
5730 
5731           // We're done with the pack expansion.
5732           continue;
5733         }
5734 
5735         // We'll substitute the parameter now without expanding the pack
5736         // expansion.
5737         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5738         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5739                                                           indexAdjustment,
5740                                                           NumExpansions,
5741                                                   /*ExpectParameterPack=*/true);
5742         assert(NewParm->isParameterPack() &&
5743                "Parameter pack no longer a parameter pack after "
5744                "transformation.");
5745       } else {
5746         NewParm = getDerived().TransformFunctionTypeParam(
5747             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5748       }
5749 
5750       if (!NewParm)
5751         return true;
5752 
5753       if (ParamInfos)
5754         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5755       OutParamTypes.push_back(NewParm->getType());
5756       if (PVars)
5757         PVars->push_back(NewParm);
5758       continue;
5759     }
5760 
5761     // Deal with the possibility that we don't have a parameter
5762     // declaration for this parameter.
5763     QualType OldType = ParamTypes[i];
5764     bool IsPackExpansion = false;
5765     Optional<unsigned> NumExpansions;
5766     QualType NewType;
5767     if (const PackExpansionType *Expansion
5768                                        = dyn_cast<PackExpansionType>(OldType)) {
5769       // We have a function parameter pack that may need to be expanded.
5770       QualType Pattern = Expansion->getPattern();
5771       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5772       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5773 
5774       // Determine whether we should expand the parameter packs.
5775       bool ShouldExpand = false;
5776       bool RetainExpansion = false;
5777       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5778                                                Unexpanded,
5779                                                ShouldExpand,
5780                                                RetainExpansion,
5781                                                NumExpansions)) {
5782         return true;
5783       }
5784 
5785       if (ShouldExpand) {
5786         // Expand the function parameter pack into multiple, separate
5787         // parameters.
5788         for (unsigned I = 0; I != *NumExpansions; ++I) {
5789           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5790           QualType NewType = getDerived().TransformType(Pattern);
5791           if (NewType.isNull())
5792             return true;
5793 
5794           if (NewType->containsUnexpandedParameterPack()) {
5795             NewType =
5796                 getSema().getASTContext().getPackExpansionType(NewType, None);
5797 
5798             if (NewType.isNull())
5799               return true;
5800           }
5801 
5802           if (ParamInfos)
5803             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5804           OutParamTypes.push_back(NewType);
5805           if (PVars)
5806             PVars->push_back(nullptr);
5807         }
5808 
5809         // We're done with the pack expansion.
5810         continue;
5811       }
5812 
5813       // If we're supposed to retain a pack expansion, do so by temporarily
5814       // forgetting the partially-substituted parameter pack.
5815       if (RetainExpansion) {
5816         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5817         QualType NewType = getDerived().TransformType(Pattern);
5818         if (NewType.isNull())
5819           return true;
5820 
5821         if (ParamInfos)
5822           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5823         OutParamTypes.push_back(NewType);
5824         if (PVars)
5825           PVars->push_back(nullptr);
5826       }
5827 
5828       // We'll substitute the parameter now without expanding the pack
5829       // expansion.
5830       OldType = Expansion->getPattern();
5831       IsPackExpansion = true;
5832       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5833       NewType = getDerived().TransformType(OldType);
5834     } else {
5835       NewType = getDerived().TransformType(OldType);
5836     }
5837 
5838     if (NewType.isNull())
5839       return true;
5840 
5841     if (IsPackExpansion)
5842       NewType = getSema().Context.getPackExpansionType(NewType,
5843                                                        NumExpansions);
5844 
5845     if (ParamInfos)
5846       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5847     OutParamTypes.push_back(NewType);
5848     if (PVars)
5849       PVars->push_back(nullptr);
5850   }
5851 
5852 #ifndef NDEBUG
5853   if (PVars) {
5854     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5855       if (ParmVarDecl *parm = (*PVars)[i])
5856         assert(parm->getFunctionScopeIndex() == i);
5857   }
5858 #endif
5859 
5860   return false;
5861 }
5862 
5863 template<typename Derived>
5864 QualType
5865 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5866                                                    FunctionProtoTypeLoc TL) {
5867   SmallVector<QualType, 4> ExceptionStorage;
5868   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5869   return getDerived().TransformFunctionProtoType(
5870       TLB, TL, nullptr, Qualifiers(),
5871       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5872         return This->getDerived().TransformExceptionSpec(
5873             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
5874       });
5875 }
5876 
5877 template<typename Derived> template<typename Fn>
5878 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5879     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5880     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5881 
5882   // Transform the parameters and return type.
5883   //
5884   // We are required to instantiate the params and return type in source order.
5885   // When the function has a trailing return type, we instantiate the
5886   // parameters before the return type,  since the return type can then refer
5887   // to the parameters themselves (via decltype, sizeof, etc.).
5888   //
5889   SmallVector<QualType, 4> ParamTypes;
5890   SmallVector<ParmVarDecl*, 4> ParamDecls;
5891   Sema::ExtParameterInfoBuilder ExtParamInfos;
5892   const FunctionProtoType *T = TL.getTypePtr();
5893 
5894   QualType ResultType;
5895 
5896   if (T->hasTrailingReturn()) {
5897     if (getDerived().TransformFunctionTypeParams(
5898             TL.getBeginLoc(), TL.getParams(),
5899             TL.getTypePtr()->param_type_begin(),
5900             T->getExtParameterInfosOrNull(),
5901             ParamTypes, &ParamDecls, ExtParamInfos))
5902       return QualType();
5903 
5904     {
5905       // C++11 [expr.prim.general]p3:
5906       //   If a declaration declares a member function or member function
5907       //   template of a class X, the expression this is a prvalue of type
5908       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5909       //   and the end of the function-definition, member-declarator, or
5910       //   declarator.
5911       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5912 
5913       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5914       if (ResultType.isNull())
5915         return QualType();
5916     }
5917   }
5918   else {
5919     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5920     if (ResultType.isNull())
5921       return QualType();
5922 
5923     if (getDerived().TransformFunctionTypeParams(
5924             TL.getBeginLoc(), TL.getParams(),
5925             TL.getTypePtr()->param_type_begin(),
5926             T->getExtParameterInfosOrNull(),
5927             ParamTypes, &ParamDecls, ExtParamInfos))
5928       return QualType();
5929   }
5930 
5931   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5932 
5933   bool EPIChanged = false;
5934   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5935     return QualType();
5936 
5937   // Handle extended parameter information.
5938   if (auto NewExtParamInfos =
5939         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5940     if (!EPI.ExtParameterInfos ||
5941         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5942           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5943       EPIChanged = true;
5944     }
5945     EPI.ExtParameterInfos = NewExtParamInfos;
5946   } else if (EPI.ExtParameterInfos) {
5947     EPIChanged = true;
5948     EPI.ExtParameterInfos = nullptr;
5949   }
5950 
5951   QualType Result = TL.getType();
5952   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5953       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5954     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5955     if (Result.isNull())
5956       return QualType();
5957   }
5958 
5959   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5960   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5961   NewTL.setLParenLoc(TL.getLParenLoc());
5962   NewTL.setRParenLoc(TL.getRParenLoc());
5963   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5964   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5965   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5966     NewTL.setParam(i, ParamDecls[i]);
5967 
5968   return Result;
5969 }
5970 
5971 template<typename Derived>
5972 bool TreeTransform<Derived>::TransformExceptionSpec(
5973     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5974     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5975   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5976 
5977   // Instantiate a dynamic noexcept expression, if any.
5978   if (isComputedNoexcept(ESI.Type)) {
5979     EnterExpressionEvaluationContext Unevaluated(
5980         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5981     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5982     if (NoexceptExpr.isInvalid())
5983       return true;
5984 
5985     ExceptionSpecificationType EST = ESI.Type;
5986     NoexceptExpr =
5987         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
5988     if (NoexceptExpr.isInvalid())
5989       return true;
5990 
5991     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5992       Changed = true;
5993     ESI.NoexceptExpr = NoexceptExpr.get();
5994     ESI.Type = EST;
5995   }
5996 
5997   if (ESI.Type != EST_Dynamic)
5998     return false;
5999 
6000   // Instantiate a dynamic exception specification's type.
6001   for (QualType T : ESI.Exceptions) {
6002     if (const PackExpansionType *PackExpansion =
6003             T->getAs<PackExpansionType>()) {
6004       Changed = true;
6005 
6006       // We have a pack expansion. Instantiate it.
6007       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6008       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6009                                               Unexpanded);
6010       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6011 
6012       // Determine whether the set of unexpanded parameter packs can and
6013       // should
6014       // be expanded.
6015       bool Expand = false;
6016       bool RetainExpansion = false;
6017       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6018       // FIXME: Track the location of the ellipsis (and track source location
6019       // information for the types in the exception specification in general).
6020       if (getDerived().TryExpandParameterPacks(
6021               Loc, SourceRange(), Unexpanded, Expand,
6022               RetainExpansion, NumExpansions))
6023         return true;
6024 
6025       if (!Expand) {
6026         // We can't expand this pack expansion into separate arguments yet;
6027         // just substitute into the pattern and create a new pack expansion
6028         // type.
6029         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6030         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6031         if (U.isNull())
6032           return true;
6033 
6034         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6035         Exceptions.push_back(U);
6036         continue;
6037       }
6038 
6039       // Substitute into the pack expansion pattern for each slice of the
6040       // pack.
6041       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6042         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6043 
6044         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6045         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6046           return true;
6047 
6048         Exceptions.push_back(U);
6049       }
6050     } else {
6051       QualType U = getDerived().TransformType(T);
6052       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6053         return true;
6054       if (T != U)
6055         Changed = true;
6056 
6057       Exceptions.push_back(U);
6058     }
6059   }
6060 
6061   ESI.Exceptions = Exceptions;
6062   if (ESI.Exceptions.empty())
6063     ESI.Type = EST_DynamicNone;
6064   return false;
6065 }
6066 
6067 template<typename Derived>
6068 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6069                                                  TypeLocBuilder &TLB,
6070                                                  FunctionNoProtoTypeLoc TL) {
6071   const FunctionNoProtoType *T = TL.getTypePtr();
6072   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6073   if (ResultType.isNull())
6074     return QualType();
6075 
6076   QualType Result = TL.getType();
6077   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6078     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6079 
6080   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6081   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6082   NewTL.setLParenLoc(TL.getLParenLoc());
6083   NewTL.setRParenLoc(TL.getRParenLoc());
6084   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6085 
6086   return Result;
6087 }
6088 
6089 template <typename Derived>
6090 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6091     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6092   const UnresolvedUsingType *T = TL.getTypePtr();
6093   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6094   if (!D)
6095     return QualType();
6096 
6097   QualType Result = TL.getType();
6098   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6099     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6100     if (Result.isNull())
6101       return QualType();
6102   }
6103 
6104   // We might get an arbitrary type spec type back.  We should at
6105   // least always get a type spec type, though.
6106   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6107   NewTL.setNameLoc(TL.getNameLoc());
6108 
6109   return Result;
6110 }
6111 
6112 template <typename Derived>
6113 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6114                                                     UsingTypeLoc TL) {
6115   const UsingType *T = TL.getTypePtr();
6116 
6117   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6118       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6119   if (!Found)
6120     return QualType();
6121 
6122   QualType Underlying = getDerived().TransformType(T->desugar());
6123   if (Underlying.isNull())
6124     return QualType();
6125 
6126   QualType Result = TL.getType();
6127   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6128       Underlying != T->getUnderlyingType()) {
6129     Result = getDerived().RebuildUsingType(Found, Underlying);
6130     if (Result.isNull())
6131       return QualType();
6132   }
6133 
6134   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6135   return Result;
6136 }
6137 
6138 template<typename Derived>
6139 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6140                                                       TypedefTypeLoc TL) {
6141   const TypedefType *T = TL.getTypePtr();
6142   TypedefNameDecl *Typedef
6143     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6144                                                                T->getDecl()));
6145   if (!Typedef)
6146     return QualType();
6147 
6148   QualType Result = TL.getType();
6149   if (getDerived().AlwaysRebuild() ||
6150       Typedef != T->getDecl()) {
6151     Result = getDerived().RebuildTypedefType(Typedef);
6152     if (Result.isNull())
6153       return QualType();
6154   }
6155 
6156   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6157   NewTL.setNameLoc(TL.getNameLoc());
6158 
6159   return Result;
6160 }
6161 
6162 template<typename Derived>
6163 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6164                                                       TypeOfExprTypeLoc TL) {
6165   // typeof expressions are not potentially evaluated contexts
6166   EnterExpressionEvaluationContext Unevaluated(
6167       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6168       Sema::ReuseLambdaContextDecl);
6169 
6170   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6171   if (E.isInvalid())
6172     return QualType();
6173 
6174   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6175   if (E.isInvalid())
6176     return QualType();
6177 
6178   QualType Result = TL.getType();
6179   if (getDerived().AlwaysRebuild() ||
6180       E.get() != TL.getUnderlyingExpr()) {
6181     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6182     if (Result.isNull())
6183       return QualType();
6184   }
6185   else E.get();
6186 
6187   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6188   NewTL.setTypeofLoc(TL.getTypeofLoc());
6189   NewTL.setLParenLoc(TL.getLParenLoc());
6190   NewTL.setRParenLoc(TL.getRParenLoc());
6191 
6192   return Result;
6193 }
6194 
6195 template<typename Derived>
6196 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6197                                                      TypeOfTypeLoc TL) {
6198   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6199   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6200   if (!New_Under_TI)
6201     return QualType();
6202 
6203   QualType Result = TL.getType();
6204   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6205     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6206     if (Result.isNull())
6207       return QualType();
6208   }
6209 
6210   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6211   NewTL.setTypeofLoc(TL.getTypeofLoc());
6212   NewTL.setLParenLoc(TL.getLParenLoc());
6213   NewTL.setRParenLoc(TL.getRParenLoc());
6214   NewTL.setUnderlyingTInfo(New_Under_TI);
6215 
6216   return Result;
6217 }
6218 
6219 template<typename Derived>
6220 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6221                                                        DecltypeTypeLoc TL) {
6222   const DecltypeType *T = TL.getTypePtr();
6223 
6224   // decltype expressions are not potentially evaluated contexts
6225   EnterExpressionEvaluationContext Unevaluated(
6226       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6227       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6228 
6229   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6230   if (E.isInvalid())
6231     return QualType();
6232 
6233   E = getSema().ActOnDecltypeExpression(E.get());
6234   if (E.isInvalid())
6235     return QualType();
6236 
6237   QualType Result = TL.getType();
6238   if (getDerived().AlwaysRebuild() ||
6239       E.get() != T->getUnderlyingExpr()) {
6240     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6241     if (Result.isNull())
6242       return QualType();
6243   }
6244   else E.get();
6245 
6246   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6247   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6248   NewTL.setRParenLoc(TL.getRParenLoc());
6249   return Result;
6250 }
6251 
6252 template<typename Derived>
6253 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6254                                                             TypeLocBuilder &TLB,
6255                                                      UnaryTransformTypeLoc TL) {
6256   QualType Result = TL.getType();
6257   if (Result->isDependentType()) {
6258     const UnaryTransformType *T = TL.getTypePtr();
6259     QualType NewBase =
6260       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6261     Result = getDerived().RebuildUnaryTransformType(NewBase,
6262                                                     T->getUTTKind(),
6263                                                     TL.getKWLoc());
6264     if (Result.isNull())
6265       return QualType();
6266   }
6267 
6268   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6269   NewTL.setKWLoc(TL.getKWLoc());
6270   NewTL.setParensRange(TL.getParensRange());
6271   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6272   return Result;
6273 }
6274 
6275 template<typename Derived>
6276 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6277     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6278   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6279 
6280   CXXScopeSpec SS;
6281   TemplateName TemplateName = getDerived().TransformTemplateName(
6282       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6283   if (TemplateName.isNull())
6284     return QualType();
6285 
6286   QualType OldDeduced = T->getDeducedType();
6287   QualType NewDeduced;
6288   if (!OldDeduced.isNull()) {
6289     NewDeduced = getDerived().TransformType(OldDeduced);
6290     if (NewDeduced.isNull())
6291       return QualType();
6292   }
6293 
6294   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6295       TemplateName, NewDeduced);
6296   if (Result.isNull())
6297     return QualType();
6298 
6299   DeducedTemplateSpecializationTypeLoc NewTL =
6300       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6301   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6302 
6303   return Result;
6304 }
6305 
6306 template<typename Derived>
6307 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6308                                                      RecordTypeLoc TL) {
6309   const RecordType *T = TL.getTypePtr();
6310   RecordDecl *Record
6311     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6312                                                           T->getDecl()));
6313   if (!Record)
6314     return QualType();
6315 
6316   QualType Result = TL.getType();
6317   if (getDerived().AlwaysRebuild() ||
6318       Record != T->getDecl()) {
6319     Result = getDerived().RebuildRecordType(Record);
6320     if (Result.isNull())
6321       return QualType();
6322   }
6323 
6324   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6325   NewTL.setNameLoc(TL.getNameLoc());
6326 
6327   return Result;
6328 }
6329 
6330 template<typename Derived>
6331 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6332                                                    EnumTypeLoc TL) {
6333   const EnumType *T = TL.getTypePtr();
6334   EnumDecl *Enum
6335     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6336                                                         T->getDecl()));
6337   if (!Enum)
6338     return QualType();
6339 
6340   QualType Result = TL.getType();
6341   if (getDerived().AlwaysRebuild() ||
6342       Enum != T->getDecl()) {
6343     Result = getDerived().RebuildEnumType(Enum);
6344     if (Result.isNull())
6345       return QualType();
6346   }
6347 
6348   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6349   NewTL.setNameLoc(TL.getNameLoc());
6350 
6351   return Result;
6352 }
6353 
6354 template<typename Derived>
6355 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6356                                          TypeLocBuilder &TLB,
6357                                          InjectedClassNameTypeLoc TL) {
6358   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6359                                        TL.getTypePtr()->getDecl());
6360   if (!D) return QualType();
6361 
6362   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6363   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6364   return T;
6365 }
6366 
6367 template<typename Derived>
6368 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6369                                                 TypeLocBuilder &TLB,
6370                                                 TemplateTypeParmTypeLoc TL) {
6371   return TransformTypeSpecType(TLB, TL);
6372 }
6373 
6374 template<typename Derived>
6375 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6376                                          TypeLocBuilder &TLB,
6377                                          SubstTemplateTypeParmTypeLoc TL) {
6378   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6379 
6380   // Substitute into the replacement type, which itself might involve something
6381   // that needs to be transformed. This only tends to occur with default
6382   // template arguments of template template parameters.
6383   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6384   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6385   if (Replacement.isNull())
6386     return QualType();
6387 
6388   // Always canonicalize the replacement type.
6389   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6390   QualType Result
6391     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6392                                                    Replacement);
6393 
6394   // Propagate type-source information.
6395   SubstTemplateTypeParmTypeLoc NewTL
6396     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6397   NewTL.setNameLoc(TL.getNameLoc());
6398   return Result;
6399 
6400 }
6401 
6402 template<typename Derived>
6403 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6404                                           TypeLocBuilder &TLB,
6405                                           SubstTemplateTypeParmPackTypeLoc TL) {
6406   return TransformTypeSpecType(TLB, TL);
6407 }
6408 
6409 template<typename Derived>
6410 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6411                                                         TypeLocBuilder &TLB,
6412                                            TemplateSpecializationTypeLoc TL) {
6413   const TemplateSpecializationType *T = TL.getTypePtr();
6414 
6415   // The nested-name-specifier never matters in a TemplateSpecializationType,
6416   // because we can't have a dependent nested-name-specifier anyway.
6417   CXXScopeSpec SS;
6418   TemplateName Template
6419     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6420                                          TL.getTemplateNameLoc());
6421   if (Template.isNull())
6422     return QualType();
6423 
6424   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6425 }
6426 
6427 template<typename Derived>
6428 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6429                                                      AtomicTypeLoc TL) {
6430   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6431   if (ValueType.isNull())
6432     return QualType();
6433 
6434   QualType Result = TL.getType();
6435   if (getDerived().AlwaysRebuild() ||
6436       ValueType != TL.getValueLoc().getType()) {
6437     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6438     if (Result.isNull())
6439       return QualType();
6440   }
6441 
6442   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6443   NewTL.setKWLoc(TL.getKWLoc());
6444   NewTL.setLParenLoc(TL.getLParenLoc());
6445   NewTL.setRParenLoc(TL.getRParenLoc());
6446 
6447   return Result;
6448 }
6449 
6450 template <typename Derived>
6451 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6452                                                    PipeTypeLoc TL) {
6453   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6454   if (ValueType.isNull())
6455     return QualType();
6456 
6457   QualType Result = TL.getType();
6458   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6459     const PipeType *PT = Result->castAs<PipeType>();
6460     bool isReadPipe = PT->isReadOnly();
6461     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6462     if (Result.isNull())
6463       return QualType();
6464   }
6465 
6466   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6467   NewTL.setKWLoc(TL.getKWLoc());
6468 
6469   return Result;
6470 }
6471 
6472 template <typename Derived>
6473 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6474                                                      BitIntTypeLoc TL) {
6475   const BitIntType *EIT = TL.getTypePtr();
6476   QualType Result = TL.getType();
6477 
6478   if (getDerived().AlwaysRebuild()) {
6479     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6480                                             EIT->getNumBits(), TL.getNameLoc());
6481     if (Result.isNull())
6482       return QualType();
6483   }
6484 
6485   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6486   NewTL.setNameLoc(TL.getNameLoc());
6487   return Result;
6488 }
6489 
6490 template <typename Derived>
6491 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6492     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6493   const DependentBitIntType *EIT = TL.getTypePtr();
6494 
6495   EnterExpressionEvaluationContext Unevaluated(
6496       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6497   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6498   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6499 
6500   if (BitsExpr.isInvalid())
6501     return QualType();
6502 
6503   QualType Result = TL.getType();
6504 
6505   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6506     Result = getDerived().RebuildDependentBitIntType(
6507         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6508 
6509     if (Result.isNull())
6510       return QualType();
6511   }
6512 
6513   if (isa<DependentBitIntType>(Result)) {
6514     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6515     NewTL.setNameLoc(TL.getNameLoc());
6516   } else {
6517     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6518     NewTL.setNameLoc(TL.getNameLoc());
6519   }
6520   return Result;
6521 }
6522 
6523   /// Simple iterator that traverses the template arguments in a
6524   /// container that provides a \c getArgLoc() member function.
6525   ///
6526   /// This iterator is intended to be used with the iterator form of
6527   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6528   template<typename ArgLocContainer>
6529   class TemplateArgumentLocContainerIterator {
6530     ArgLocContainer *Container;
6531     unsigned Index;
6532 
6533   public:
6534     typedef TemplateArgumentLoc value_type;
6535     typedef TemplateArgumentLoc reference;
6536     typedef int difference_type;
6537     typedef std::input_iterator_tag iterator_category;
6538 
6539     class pointer {
6540       TemplateArgumentLoc Arg;
6541 
6542     public:
6543       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6544 
6545       const TemplateArgumentLoc *operator->() const {
6546         return &Arg;
6547       }
6548     };
6549 
6550 
6551     TemplateArgumentLocContainerIterator() {}
6552 
6553     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6554                                  unsigned Index)
6555       : Container(&Container), Index(Index) { }
6556 
6557     TemplateArgumentLocContainerIterator &operator++() {
6558       ++Index;
6559       return *this;
6560     }
6561 
6562     TemplateArgumentLocContainerIterator operator++(int) {
6563       TemplateArgumentLocContainerIterator Old(*this);
6564       ++(*this);
6565       return Old;
6566     }
6567 
6568     TemplateArgumentLoc operator*() const {
6569       return Container->getArgLoc(Index);
6570     }
6571 
6572     pointer operator->() const {
6573       return pointer(Container->getArgLoc(Index));
6574     }
6575 
6576     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6577                            const TemplateArgumentLocContainerIterator &Y) {
6578       return X.Container == Y.Container && X.Index == Y.Index;
6579     }
6580 
6581     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6582                            const TemplateArgumentLocContainerIterator &Y) {
6583       return !(X == Y);
6584     }
6585   };
6586 
6587 template<typename Derived>
6588 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6589                                                    AutoTypeLoc TL) {
6590   const AutoType *T = TL.getTypePtr();
6591   QualType OldDeduced = T->getDeducedType();
6592   QualType NewDeduced;
6593   if (!OldDeduced.isNull()) {
6594     NewDeduced = getDerived().TransformType(OldDeduced);
6595     if (NewDeduced.isNull())
6596       return QualType();
6597   }
6598 
6599   ConceptDecl *NewCD = nullptr;
6600   TemplateArgumentListInfo NewTemplateArgs;
6601   NestedNameSpecifierLoc NewNestedNameSpec;
6602   if (T->isConstrained()) {
6603     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6604         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6605 
6606     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6607     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6608     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6609     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6610                                                 ArgIterator(TL,
6611                                                             TL.getNumArgs()),
6612                                                 NewTemplateArgs))
6613       return QualType();
6614 
6615     if (TL.getNestedNameSpecifierLoc()) {
6616       NewNestedNameSpec
6617         = getDerived().TransformNestedNameSpecifierLoc(
6618             TL.getNestedNameSpecifierLoc());
6619       if (!NewNestedNameSpec)
6620         return QualType();
6621     }
6622   }
6623 
6624   QualType Result = TL.getType();
6625   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6626       T->isDependentType() || T->isConstrained()) {
6627     // FIXME: Maybe don't rebuild if all template arguments are the same.
6628     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6629     NewArgList.reserve(NewTemplateArgs.size());
6630     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6631       NewArgList.push_back(ArgLoc.getArgument());
6632     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6633                                           NewArgList);
6634     if (Result.isNull())
6635       return QualType();
6636   }
6637 
6638   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6639   NewTL.setNameLoc(TL.getNameLoc());
6640   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6641   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6642   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6643   NewTL.setFoundDecl(TL.getFoundDecl());
6644   NewTL.setLAngleLoc(TL.getLAngleLoc());
6645   NewTL.setRAngleLoc(TL.getRAngleLoc());
6646   NewTL.setRParenLoc(TL.getRParenLoc());
6647   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6648     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6649 
6650   return Result;
6651 }
6652 
6653 template <typename Derived>
6654 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6655                                                         TypeLocBuilder &TLB,
6656                                            TemplateSpecializationTypeLoc TL,
6657                                                       TemplateName Template) {
6658   TemplateArgumentListInfo NewTemplateArgs;
6659   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6660   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6661   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6662     ArgIterator;
6663   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6664                                               ArgIterator(TL, TL.getNumArgs()),
6665                                               NewTemplateArgs))
6666     return QualType();
6667 
6668   // FIXME: maybe don't rebuild if all the template arguments are the same.
6669 
6670   QualType Result =
6671     getDerived().RebuildTemplateSpecializationType(Template,
6672                                                    TL.getTemplateNameLoc(),
6673                                                    NewTemplateArgs);
6674 
6675   if (!Result.isNull()) {
6676     // Specializations of template template parameters are represented as
6677     // TemplateSpecializationTypes, and substitution of type alias templates
6678     // within a dependent context can transform them into
6679     // DependentTemplateSpecializationTypes.
6680     if (isa<DependentTemplateSpecializationType>(Result)) {
6681       DependentTemplateSpecializationTypeLoc NewTL
6682         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6683       NewTL.setElaboratedKeywordLoc(SourceLocation());
6684       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6685       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6686       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6687       NewTL.setLAngleLoc(TL.getLAngleLoc());
6688       NewTL.setRAngleLoc(TL.getRAngleLoc());
6689       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6690         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6691       return Result;
6692     }
6693 
6694     TemplateSpecializationTypeLoc NewTL
6695       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6696     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6697     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6698     NewTL.setLAngleLoc(TL.getLAngleLoc());
6699     NewTL.setRAngleLoc(TL.getRAngleLoc());
6700     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6701       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6702   }
6703 
6704   return Result;
6705 }
6706 
6707 template <typename Derived>
6708 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6709                                      TypeLocBuilder &TLB,
6710                                      DependentTemplateSpecializationTypeLoc TL,
6711                                      TemplateName Template,
6712                                      CXXScopeSpec &SS) {
6713   TemplateArgumentListInfo NewTemplateArgs;
6714   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6715   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6716   typedef TemplateArgumentLocContainerIterator<
6717             DependentTemplateSpecializationTypeLoc> ArgIterator;
6718   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6719                                               ArgIterator(TL, TL.getNumArgs()),
6720                                               NewTemplateArgs))
6721     return QualType();
6722 
6723   // FIXME: maybe don't rebuild if all the template arguments are the same.
6724 
6725   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6726     QualType Result
6727       = getSema().Context.getDependentTemplateSpecializationType(
6728                                                 TL.getTypePtr()->getKeyword(),
6729                                                          DTN->getQualifier(),
6730                                                          DTN->getIdentifier(),
6731                                                                NewTemplateArgs);
6732 
6733     DependentTemplateSpecializationTypeLoc NewTL
6734       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6735     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6736     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6737     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6738     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6739     NewTL.setLAngleLoc(TL.getLAngleLoc());
6740     NewTL.setRAngleLoc(TL.getRAngleLoc());
6741     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6742       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6743     return Result;
6744   }
6745 
6746   QualType Result
6747     = getDerived().RebuildTemplateSpecializationType(Template,
6748                                                      TL.getTemplateNameLoc(),
6749                                                      NewTemplateArgs);
6750 
6751   if (!Result.isNull()) {
6752     /// FIXME: Wrap this in an elaborated-type-specifier?
6753     TemplateSpecializationTypeLoc NewTL
6754       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6755     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6756     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6757     NewTL.setLAngleLoc(TL.getLAngleLoc());
6758     NewTL.setRAngleLoc(TL.getRAngleLoc());
6759     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6760       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6761   }
6762 
6763   return Result;
6764 }
6765 
6766 template<typename Derived>
6767 QualType
6768 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6769                                                 ElaboratedTypeLoc TL) {
6770   const ElaboratedType *T = TL.getTypePtr();
6771 
6772   NestedNameSpecifierLoc QualifierLoc;
6773   // NOTE: the qualifier in an ElaboratedType is optional.
6774   if (TL.getQualifierLoc()) {
6775     QualifierLoc
6776       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6777     if (!QualifierLoc)
6778       return QualType();
6779   }
6780 
6781   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6782   if (NamedT.isNull())
6783     return QualType();
6784 
6785   // C++0x [dcl.type.elab]p2:
6786   //   If the identifier resolves to a typedef-name or the simple-template-id
6787   //   resolves to an alias template specialization, the
6788   //   elaborated-type-specifier is ill-formed.
6789   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6790     if (const TemplateSpecializationType *TST =
6791           NamedT->getAs<TemplateSpecializationType>()) {
6792       TemplateName Template = TST->getTemplateName();
6793       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6794               Template.getAsTemplateDecl())) {
6795         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6796                      diag::err_tag_reference_non_tag)
6797             << TAT << Sema::NTK_TypeAliasTemplate
6798             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6799         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6800       }
6801     }
6802   }
6803 
6804   QualType Result = TL.getType();
6805   if (getDerived().AlwaysRebuild() ||
6806       QualifierLoc != TL.getQualifierLoc() ||
6807       NamedT != T->getNamedType()) {
6808     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6809                                                 T->getKeyword(),
6810                                                 QualifierLoc, NamedT);
6811     if (Result.isNull())
6812       return QualType();
6813   }
6814 
6815   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6816   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6817   NewTL.setQualifierLoc(QualifierLoc);
6818   return Result;
6819 }
6820 
6821 template<typename Derived>
6822 QualType TreeTransform<Derived>::TransformAttributedType(
6823                                                 TypeLocBuilder &TLB,
6824                                                 AttributedTypeLoc TL) {
6825   const AttributedType *oldType = TL.getTypePtr();
6826   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6827   if (modifiedType.isNull())
6828     return QualType();
6829 
6830   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6831   const Attr *oldAttr = TL.getAttr();
6832   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6833   if (oldAttr && !newAttr)
6834     return QualType();
6835 
6836   QualType result = TL.getType();
6837 
6838   // FIXME: dependent operand expressions?
6839   if (getDerived().AlwaysRebuild() ||
6840       modifiedType != oldType->getModifiedType()) {
6841     // TODO: this is really lame; we should really be rebuilding the
6842     // equivalent type from first principles.
6843     QualType equivalentType
6844       = getDerived().TransformType(oldType->getEquivalentType());
6845     if (equivalentType.isNull())
6846       return QualType();
6847 
6848     // Check whether we can add nullability; it is only represented as
6849     // type sugar, and therefore cannot be diagnosed in any other way.
6850     if (auto nullability = oldType->getImmediateNullability()) {
6851       if (!modifiedType->canHaveNullability()) {
6852         SemaRef.Diag(TL.getAttr()->getLocation(),
6853                      diag::err_nullability_nonpointer)
6854             << DiagNullabilityKind(*nullability, false) << modifiedType;
6855         return QualType();
6856       }
6857     }
6858 
6859     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6860                                                modifiedType,
6861                                                equivalentType);
6862   }
6863 
6864   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6865   newTL.setAttr(newAttr);
6866   return result;
6867 }
6868 
6869 template <typename Derived>
6870 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
6871     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
6872   // The BTFTagAttributedType is available for C only.
6873   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
6874 }
6875 
6876 template<typename Derived>
6877 QualType
6878 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6879                                            ParenTypeLoc TL) {
6880   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6881   if (Inner.isNull())
6882     return QualType();
6883 
6884   QualType Result = TL.getType();
6885   if (getDerived().AlwaysRebuild() ||
6886       Inner != TL.getInnerLoc().getType()) {
6887     Result = getDerived().RebuildParenType(Inner);
6888     if (Result.isNull())
6889       return QualType();
6890   }
6891 
6892   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6893   NewTL.setLParenLoc(TL.getLParenLoc());
6894   NewTL.setRParenLoc(TL.getRParenLoc());
6895   return Result;
6896 }
6897 
6898 template <typename Derived>
6899 QualType
6900 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6901                                                     MacroQualifiedTypeLoc TL) {
6902   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6903   if (Inner.isNull())
6904     return QualType();
6905 
6906   QualType Result = TL.getType();
6907   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6908     Result =
6909         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6910     if (Result.isNull())
6911       return QualType();
6912   }
6913 
6914   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6915   NewTL.setExpansionLoc(TL.getExpansionLoc());
6916   return Result;
6917 }
6918 
6919 template<typename Derived>
6920 QualType TreeTransform<Derived>::TransformDependentNameType(
6921     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6922   return TransformDependentNameType(TLB, TL, false);
6923 }
6924 
6925 template<typename Derived>
6926 QualType TreeTransform<Derived>::TransformDependentNameType(
6927     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6928   const DependentNameType *T = TL.getTypePtr();
6929 
6930   NestedNameSpecifierLoc QualifierLoc
6931     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6932   if (!QualifierLoc)
6933     return QualType();
6934 
6935   QualType Result
6936     = getDerived().RebuildDependentNameType(T->getKeyword(),
6937                                             TL.getElaboratedKeywordLoc(),
6938                                             QualifierLoc,
6939                                             T->getIdentifier(),
6940                                             TL.getNameLoc(),
6941                                             DeducedTSTContext);
6942   if (Result.isNull())
6943     return QualType();
6944 
6945   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6946     QualType NamedT = ElabT->getNamedType();
6947     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6948 
6949     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6950     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6951     NewTL.setQualifierLoc(QualifierLoc);
6952   } else {
6953     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6954     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6955     NewTL.setQualifierLoc(QualifierLoc);
6956     NewTL.setNameLoc(TL.getNameLoc());
6957   }
6958   return Result;
6959 }
6960 
6961 template<typename Derived>
6962 QualType TreeTransform<Derived>::
6963           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6964                                  DependentTemplateSpecializationTypeLoc TL) {
6965   NestedNameSpecifierLoc QualifierLoc;
6966   if (TL.getQualifierLoc()) {
6967     QualifierLoc
6968       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6969     if (!QualifierLoc)
6970       return QualType();
6971   }
6972 
6973   return getDerived()
6974            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6975 }
6976 
6977 template<typename Derived>
6978 QualType TreeTransform<Derived>::
6979 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6980                                    DependentTemplateSpecializationTypeLoc TL,
6981                                        NestedNameSpecifierLoc QualifierLoc) {
6982   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6983 
6984   TemplateArgumentListInfo NewTemplateArgs;
6985   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6986   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6987 
6988   typedef TemplateArgumentLocContainerIterator<
6989   DependentTemplateSpecializationTypeLoc> ArgIterator;
6990   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6991                                               ArgIterator(TL, TL.getNumArgs()),
6992                                               NewTemplateArgs))
6993     return QualType();
6994 
6995   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6996       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6997       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6998       /*AllowInjectedClassName*/ false);
6999   if (Result.isNull())
7000     return QualType();
7001 
7002   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7003     QualType NamedT = ElabT->getNamedType();
7004 
7005     // Copy information relevant to the template specialization.
7006     TemplateSpecializationTypeLoc NamedTL
7007       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7008     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7009     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7010     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7011     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7012     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7013       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7014 
7015     // Copy information relevant to the elaborated type.
7016     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7017     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7018     NewTL.setQualifierLoc(QualifierLoc);
7019   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7020     DependentTemplateSpecializationTypeLoc SpecTL
7021       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7022     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7023     SpecTL.setQualifierLoc(QualifierLoc);
7024     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7025     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7026     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7027     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7028     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7029       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7030   } else {
7031     TemplateSpecializationTypeLoc SpecTL
7032       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7033     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7034     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7035     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7036     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7037     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7038       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7039   }
7040   return Result;
7041 }
7042 
7043 template<typename Derived>
7044 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7045                                                       PackExpansionTypeLoc TL) {
7046   QualType Pattern
7047     = getDerived().TransformType(TLB, TL.getPatternLoc());
7048   if (Pattern.isNull())
7049     return QualType();
7050 
7051   QualType Result = TL.getType();
7052   if (getDerived().AlwaysRebuild() ||
7053       Pattern != TL.getPatternLoc().getType()) {
7054     Result = getDerived().RebuildPackExpansionType(Pattern,
7055                                            TL.getPatternLoc().getSourceRange(),
7056                                                    TL.getEllipsisLoc(),
7057                                            TL.getTypePtr()->getNumExpansions());
7058     if (Result.isNull())
7059       return QualType();
7060   }
7061 
7062   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7063   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7064   return Result;
7065 }
7066 
7067 template<typename Derived>
7068 QualType
7069 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7070                                                    ObjCInterfaceTypeLoc TL) {
7071   // ObjCInterfaceType is never dependent.
7072   TLB.pushFullCopy(TL);
7073   return TL.getType();
7074 }
7075 
7076 template<typename Derived>
7077 QualType
7078 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7079                                                    ObjCTypeParamTypeLoc TL) {
7080   const ObjCTypeParamType *T = TL.getTypePtr();
7081   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7082       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7083   if (!OTP)
7084     return QualType();
7085 
7086   QualType Result = TL.getType();
7087   if (getDerived().AlwaysRebuild() ||
7088       OTP != T->getDecl()) {
7089     Result = getDerived().RebuildObjCTypeParamType(OTP,
7090                  TL.getProtocolLAngleLoc(),
7091                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7092                                     TL.getNumProtocols()),
7093                  TL.getProtocolLocs(),
7094                  TL.getProtocolRAngleLoc());
7095     if (Result.isNull())
7096       return QualType();
7097   }
7098 
7099   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7100   if (TL.getNumProtocols()) {
7101     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7102     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7103       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7104     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7105   }
7106   return Result;
7107 }
7108 
7109 template<typename Derived>
7110 QualType
7111 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7112                                                 ObjCObjectTypeLoc TL) {
7113   // Transform base type.
7114   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7115   if (BaseType.isNull())
7116     return QualType();
7117 
7118   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7119 
7120   // Transform type arguments.
7121   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7122   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7123     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7124     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7125     QualType TypeArg = TypeArgInfo->getType();
7126     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7127       AnyChanged = true;
7128 
7129       // We have a pack expansion. Instantiate it.
7130       const auto *PackExpansion = PackExpansionLoc.getType()
7131                                     ->castAs<PackExpansionType>();
7132       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7133       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7134                                               Unexpanded);
7135       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7136 
7137       // Determine whether the set of unexpanded parameter packs can
7138       // and should be expanded.
7139       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7140       bool Expand = false;
7141       bool RetainExpansion = false;
7142       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7143       if (getDerived().TryExpandParameterPacks(
7144             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7145             Unexpanded, Expand, RetainExpansion, NumExpansions))
7146         return QualType();
7147 
7148       if (!Expand) {
7149         // We can't expand this pack expansion into separate arguments yet;
7150         // just substitute into the pattern and create a new pack expansion
7151         // type.
7152         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7153 
7154         TypeLocBuilder TypeArgBuilder;
7155         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7156         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7157                                                              PatternLoc);
7158         if (NewPatternType.isNull())
7159           return QualType();
7160 
7161         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7162                                       NewPatternType, NumExpansions);
7163         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7164         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7165         NewTypeArgInfos.push_back(
7166           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7167         continue;
7168       }
7169 
7170       // Substitute into the pack expansion pattern for each slice of the
7171       // pack.
7172       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7173         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7174 
7175         TypeLocBuilder TypeArgBuilder;
7176         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7177 
7178         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7179                                                          PatternLoc);
7180         if (NewTypeArg.isNull())
7181           return QualType();
7182 
7183         NewTypeArgInfos.push_back(
7184           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7185       }
7186 
7187       continue;
7188     }
7189 
7190     TypeLocBuilder TypeArgBuilder;
7191     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7192     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7193     if (NewTypeArg.isNull())
7194       return QualType();
7195 
7196     // If nothing changed, just keep the old TypeSourceInfo.
7197     if (NewTypeArg == TypeArg) {
7198       NewTypeArgInfos.push_back(TypeArgInfo);
7199       continue;
7200     }
7201 
7202     NewTypeArgInfos.push_back(
7203       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7204     AnyChanged = true;
7205   }
7206 
7207   QualType Result = TL.getType();
7208   if (getDerived().AlwaysRebuild() || AnyChanged) {
7209     // Rebuild the type.
7210     Result = getDerived().RebuildObjCObjectType(
7211         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7212         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7213         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7214         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7215 
7216     if (Result.isNull())
7217       return QualType();
7218   }
7219 
7220   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7221   NewT.setHasBaseTypeAsWritten(true);
7222   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7223   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7224     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7225   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7226   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7227   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7228     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7229   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7230   return Result;
7231 }
7232 
7233 template<typename Derived>
7234 QualType
7235 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7236                                                ObjCObjectPointerTypeLoc TL) {
7237   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7238   if (PointeeType.isNull())
7239     return QualType();
7240 
7241   QualType Result = TL.getType();
7242   if (getDerived().AlwaysRebuild() ||
7243       PointeeType != TL.getPointeeLoc().getType()) {
7244     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7245                                                        TL.getStarLoc());
7246     if (Result.isNull())
7247       return QualType();
7248   }
7249 
7250   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7251   NewT.setStarLoc(TL.getStarLoc());
7252   return Result;
7253 }
7254 
7255 //===----------------------------------------------------------------------===//
7256 // Statement transformation
7257 //===----------------------------------------------------------------------===//
7258 template<typename Derived>
7259 StmtResult
7260 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7261   return S;
7262 }
7263 
7264 template<typename Derived>
7265 StmtResult
7266 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7267   return getDerived().TransformCompoundStmt(S, false);
7268 }
7269 
7270 template<typename Derived>
7271 StmtResult
7272 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7273                                               bool IsStmtExpr) {
7274   Sema::CompoundScopeRAII CompoundScope(getSema());
7275 
7276   const Stmt *ExprResult = S->getStmtExprResult();
7277   bool SubStmtInvalid = false;
7278   bool SubStmtChanged = false;
7279   SmallVector<Stmt*, 8> Statements;
7280   for (auto *B : S->body()) {
7281     StmtResult Result = getDerived().TransformStmt(
7282         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7283 
7284     if (Result.isInvalid()) {
7285       // Immediately fail if this was a DeclStmt, since it's very
7286       // likely that this will cause problems for future statements.
7287       if (isa<DeclStmt>(B))
7288         return StmtError();
7289 
7290       // Otherwise, just keep processing substatements and fail later.
7291       SubStmtInvalid = true;
7292       continue;
7293     }
7294 
7295     SubStmtChanged = SubStmtChanged || Result.get() != B;
7296     Statements.push_back(Result.getAs<Stmt>());
7297   }
7298 
7299   if (SubStmtInvalid)
7300     return StmtError();
7301 
7302   if (!getDerived().AlwaysRebuild() &&
7303       !SubStmtChanged)
7304     return S;
7305 
7306   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7307                                           Statements,
7308                                           S->getRBracLoc(),
7309                                           IsStmtExpr);
7310 }
7311 
7312 template<typename Derived>
7313 StmtResult
7314 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7315   ExprResult LHS, RHS;
7316   {
7317     EnterExpressionEvaluationContext Unevaluated(
7318         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7319 
7320     // Transform the left-hand case value.
7321     LHS = getDerived().TransformExpr(S->getLHS());
7322     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7323     if (LHS.isInvalid())
7324       return StmtError();
7325 
7326     // Transform the right-hand case value (for the GNU case-range extension).
7327     RHS = getDerived().TransformExpr(S->getRHS());
7328     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7329     if (RHS.isInvalid())
7330       return StmtError();
7331   }
7332 
7333   // Build the case statement.
7334   // Case statements are always rebuilt so that they will attached to their
7335   // transformed switch statement.
7336   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7337                                                        LHS.get(),
7338                                                        S->getEllipsisLoc(),
7339                                                        RHS.get(),
7340                                                        S->getColonLoc());
7341   if (Case.isInvalid())
7342     return StmtError();
7343 
7344   // Transform the statement following the case
7345   StmtResult SubStmt =
7346       getDerived().TransformStmt(S->getSubStmt());
7347   if (SubStmt.isInvalid())
7348     return StmtError();
7349 
7350   // Attach the body to the case statement
7351   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7352 }
7353 
7354 template <typename Derived>
7355 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7356   // Transform the statement following the default case
7357   StmtResult SubStmt =
7358       getDerived().TransformStmt(S->getSubStmt());
7359   if (SubStmt.isInvalid())
7360     return StmtError();
7361 
7362   // Default statements are always rebuilt
7363   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7364                                          SubStmt.get());
7365 }
7366 
7367 template<typename Derived>
7368 StmtResult
7369 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7370   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7371   if (SubStmt.isInvalid())
7372     return StmtError();
7373 
7374   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7375                                         S->getDecl());
7376   if (!LD)
7377     return StmtError();
7378 
7379   // If we're transforming "in-place" (we're not creating new local
7380   // declarations), assume we're replacing the old label statement
7381   // and clear out the reference to it.
7382   if (LD == S->getDecl())
7383     S->getDecl()->setStmt(nullptr);
7384 
7385   // FIXME: Pass the real colon location in.
7386   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7387                                        cast<LabelDecl>(LD), SourceLocation(),
7388                                        SubStmt.get());
7389 }
7390 
7391 template <typename Derived>
7392 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7393   if (!R)
7394     return R;
7395 
7396   switch (R->getKind()) {
7397 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7398 #define ATTR(X)
7399 #define PRAGMA_SPELLING_ATTR(X)                                                \
7400   case attr::X:                                                                \
7401     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7402 #include "clang/Basic/AttrList.inc"
7403   default:
7404     return R;
7405   }
7406 }
7407 
7408 template <typename Derived>
7409 StmtResult
7410 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7411                                                 StmtDiscardKind SDK) {
7412   bool AttrsChanged = false;
7413   SmallVector<const Attr *, 1> Attrs;
7414 
7415   // Visit attributes and keep track if any are transformed.
7416   for (const auto *I : S->getAttrs()) {
7417     const Attr *R = getDerived().TransformAttr(I);
7418     AttrsChanged |= (I != R);
7419     if (R)
7420       Attrs.push_back(R);
7421   }
7422 
7423   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7424   if (SubStmt.isInvalid())
7425     return StmtError();
7426 
7427   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7428     return S;
7429 
7430   // If transforming the attributes failed for all of the attributes in the
7431   // statement, don't make an AttributedStmt without attributes.
7432   if (Attrs.empty())
7433     return SubStmt;
7434 
7435   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7436                                             SubStmt.get());
7437 }
7438 
7439 template<typename Derived>
7440 StmtResult
7441 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7442   // Transform the initialization statement
7443   StmtResult Init = getDerived().TransformStmt(S->getInit());
7444   if (Init.isInvalid())
7445     return StmtError();
7446 
7447   Sema::ConditionResult Cond;
7448   if (!S->isConsteval()) {
7449     // Transform the condition
7450     Cond = getDerived().TransformCondition(
7451         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7452         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7453                          : Sema::ConditionKind::Boolean);
7454     if (Cond.isInvalid())
7455       return StmtError();
7456   }
7457 
7458   // If this is a constexpr if, determine which arm we should instantiate.
7459   llvm::Optional<bool> ConstexprConditionValue;
7460   if (S->isConstexpr())
7461     ConstexprConditionValue = Cond.getKnownValue();
7462 
7463   // Transform the "then" branch.
7464   StmtResult Then;
7465   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7466     Then = getDerived().TransformStmt(S->getThen());
7467     if (Then.isInvalid())
7468       return StmtError();
7469   } else {
7470     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7471   }
7472 
7473   // Transform the "else" branch.
7474   StmtResult Else;
7475   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7476     Else = getDerived().TransformStmt(S->getElse());
7477     if (Else.isInvalid())
7478       return StmtError();
7479   }
7480 
7481   if (!getDerived().AlwaysRebuild() &&
7482       Init.get() == S->getInit() &&
7483       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7484       Then.get() == S->getThen() &&
7485       Else.get() == S->getElse())
7486     return S;
7487 
7488   return getDerived().RebuildIfStmt(
7489       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7490       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7491 }
7492 
7493 template<typename Derived>
7494 StmtResult
7495 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7496   // Transform the initialization statement
7497   StmtResult Init = getDerived().TransformStmt(S->getInit());
7498   if (Init.isInvalid())
7499     return StmtError();
7500 
7501   // Transform the condition.
7502   Sema::ConditionResult Cond = getDerived().TransformCondition(
7503       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7504       Sema::ConditionKind::Switch);
7505   if (Cond.isInvalid())
7506     return StmtError();
7507 
7508   // Rebuild the switch statement.
7509   StmtResult Switch =
7510       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7511                                           Init.get(), Cond, S->getRParenLoc());
7512   if (Switch.isInvalid())
7513     return StmtError();
7514 
7515   // Transform the body of the switch statement.
7516   StmtResult Body = getDerived().TransformStmt(S->getBody());
7517   if (Body.isInvalid())
7518     return StmtError();
7519 
7520   // Complete the switch statement.
7521   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7522                                             Body.get());
7523 }
7524 
7525 template<typename Derived>
7526 StmtResult
7527 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7528   // Transform the condition
7529   Sema::ConditionResult Cond = getDerived().TransformCondition(
7530       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7531       Sema::ConditionKind::Boolean);
7532   if (Cond.isInvalid())
7533     return StmtError();
7534 
7535   // Transform the body
7536   StmtResult Body = getDerived().TransformStmt(S->getBody());
7537   if (Body.isInvalid())
7538     return StmtError();
7539 
7540   if (!getDerived().AlwaysRebuild() &&
7541       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7542       Body.get() == S->getBody())
7543     return Owned(S);
7544 
7545   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7546                                        Cond, S->getRParenLoc(), Body.get());
7547 }
7548 
7549 template<typename Derived>
7550 StmtResult
7551 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7552   // Transform the body
7553   StmtResult Body = getDerived().TransformStmt(S->getBody());
7554   if (Body.isInvalid())
7555     return StmtError();
7556 
7557   // Transform the condition
7558   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7559   if (Cond.isInvalid())
7560     return StmtError();
7561 
7562   if (!getDerived().AlwaysRebuild() &&
7563       Cond.get() == S->getCond() &&
7564       Body.get() == S->getBody())
7565     return S;
7566 
7567   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7568                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7569                                     S->getRParenLoc());
7570 }
7571 
7572 template<typename Derived>
7573 StmtResult
7574 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7575   if (getSema().getLangOpts().OpenMP)
7576     getSema().startOpenMPLoop();
7577 
7578   // Transform the initialization statement
7579   StmtResult Init = getDerived().TransformStmt(S->getInit());
7580   if (Init.isInvalid())
7581     return StmtError();
7582 
7583   // In OpenMP loop region loop control variable must be captured and be
7584   // private. Perform analysis of first part (if any).
7585   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7586     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7587 
7588   // Transform the condition
7589   Sema::ConditionResult Cond = getDerived().TransformCondition(
7590       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7591       Sema::ConditionKind::Boolean);
7592   if (Cond.isInvalid())
7593     return StmtError();
7594 
7595   // Transform the increment
7596   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7597   if (Inc.isInvalid())
7598     return StmtError();
7599 
7600   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7601   if (S->getInc() && !FullInc.get())
7602     return StmtError();
7603 
7604   // Transform the body
7605   StmtResult Body = getDerived().TransformStmt(S->getBody());
7606   if (Body.isInvalid())
7607     return StmtError();
7608 
7609   if (!getDerived().AlwaysRebuild() &&
7610       Init.get() == S->getInit() &&
7611       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7612       Inc.get() == S->getInc() &&
7613       Body.get() == S->getBody())
7614     return S;
7615 
7616   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7617                                      Init.get(), Cond, FullInc,
7618                                      S->getRParenLoc(), Body.get());
7619 }
7620 
7621 template<typename Derived>
7622 StmtResult
7623 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7624   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7625                                         S->getLabel());
7626   if (!LD)
7627     return StmtError();
7628 
7629   // Goto statements must always be rebuilt, to resolve the label.
7630   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7631                                       cast<LabelDecl>(LD));
7632 }
7633 
7634 template<typename Derived>
7635 StmtResult
7636 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7637   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7638   if (Target.isInvalid())
7639     return StmtError();
7640   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7641 
7642   if (!getDerived().AlwaysRebuild() &&
7643       Target.get() == S->getTarget())
7644     return S;
7645 
7646   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7647                                               Target.get());
7648 }
7649 
7650 template<typename Derived>
7651 StmtResult
7652 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7653   return S;
7654 }
7655 
7656 template<typename Derived>
7657 StmtResult
7658 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7659   return S;
7660 }
7661 
7662 template<typename Derived>
7663 StmtResult
7664 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7665   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7666                                                         /*NotCopyInit*/false);
7667   if (Result.isInvalid())
7668     return StmtError();
7669 
7670   // FIXME: We always rebuild the return statement because there is no way
7671   // to tell whether the return type of the function has changed.
7672   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7673 }
7674 
7675 template<typename Derived>
7676 StmtResult
7677 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7678   bool DeclChanged = false;
7679   SmallVector<Decl *, 4> Decls;
7680   for (auto *D : S->decls()) {
7681     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7682     if (!Transformed)
7683       return StmtError();
7684 
7685     if (Transformed != D)
7686       DeclChanged = true;
7687 
7688     Decls.push_back(Transformed);
7689   }
7690 
7691   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7692     return S;
7693 
7694   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7695 }
7696 
7697 template<typename Derived>
7698 StmtResult
7699 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7700 
7701   SmallVector<Expr*, 8> Constraints;
7702   SmallVector<Expr*, 8> Exprs;
7703   SmallVector<IdentifierInfo *, 4> Names;
7704 
7705   ExprResult AsmString;
7706   SmallVector<Expr*, 8> Clobbers;
7707 
7708   bool ExprsChanged = false;
7709 
7710   // Go through the outputs.
7711   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7712     Names.push_back(S->getOutputIdentifier(I));
7713 
7714     // No need to transform the constraint literal.
7715     Constraints.push_back(S->getOutputConstraintLiteral(I));
7716 
7717     // Transform the output expr.
7718     Expr *OutputExpr = S->getOutputExpr(I);
7719     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7720     if (Result.isInvalid())
7721       return StmtError();
7722 
7723     ExprsChanged |= Result.get() != OutputExpr;
7724 
7725     Exprs.push_back(Result.get());
7726   }
7727 
7728   // Go through the inputs.
7729   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7730     Names.push_back(S->getInputIdentifier(I));
7731 
7732     // No need to transform the constraint literal.
7733     Constraints.push_back(S->getInputConstraintLiteral(I));
7734 
7735     // Transform the input expr.
7736     Expr *InputExpr = S->getInputExpr(I);
7737     ExprResult Result = getDerived().TransformExpr(InputExpr);
7738     if (Result.isInvalid())
7739       return StmtError();
7740 
7741     ExprsChanged |= Result.get() != InputExpr;
7742 
7743     Exprs.push_back(Result.get());
7744   }
7745 
7746   // Go through the Labels.
7747   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7748     Names.push_back(S->getLabelIdentifier(I));
7749 
7750     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7751     if (Result.isInvalid())
7752       return StmtError();
7753     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7754     Exprs.push_back(Result.get());
7755   }
7756   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7757     return S;
7758 
7759   // Go through the clobbers.
7760   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7761     Clobbers.push_back(S->getClobberStringLiteral(I));
7762 
7763   // No need to transform the asm string literal.
7764   AsmString = S->getAsmString();
7765   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7766                                         S->isVolatile(), S->getNumOutputs(),
7767                                         S->getNumInputs(), Names.data(),
7768                                         Constraints, Exprs, AsmString.get(),
7769                                         Clobbers, S->getNumLabels(),
7770                                         S->getRParenLoc());
7771 }
7772 
7773 template<typename Derived>
7774 StmtResult
7775 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7776   ArrayRef<Token> AsmToks =
7777     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7778 
7779   bool HadError = false, HadChange = false;
7780 
7781   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7782   SmallVector<Expr*, 8> TransformedExprs;
7783   TransformedExprs.reserve(SrcExprs.size());
7784   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7785     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7786     if (!Result.isUsable()) {
7787       HadError = true;
7788     } else {
7789       HadChange |= (Result.get() != SrcExprs[i]);
7790       TransformedExprs.push_back(Result.get());
7791     }
7792   }
7793 
7794   if (HadError) return StmtError();
7795   if (!HadChange && !getDerived().AlwaysRebuild())
7796     return Owned(S);
7797 
7798   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7799                                        AsmToks, S->getAsmString(),
7800                                        S->getNumOutputs(), S->getNumInputs(),
7801                                        S->getAllConstraints(), S->getClobbers(),
7802                                        TransformedExprs, S->getEndLoc());
7803 }
7804 
7805 // C++ Coroutines TS
7806 
7807 template<typename Derived>
7808 StmtResult
7809 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7810   auto *ScopeInfo = SemaRef.getCurFunction();
7811   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7812   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7813          ScopeInfo->NeedsCoroutineSuspends &&
7814          ScopeInfo->CoroutineSuspends.first == nullptr &&
7815          ScopeInfo->CoroutineSuspends.second == nullptr &&
7816          "expected clean scope info");
7817 
7818   // Set that we have (possibly-invalid) suspend points before we do anything
7819   // that may fail.
7820   ScopeInfo->setNeedsCoroutineSuspends(false);
7821 
7822   // We re-build the coroutine promise object (and the coroutine parameters its
7823   // type and constructor depend on) based on the types used in our current
7824   // function. We must do so, and set it on the current FunctionScopeInfo,
7825   // before attempting to transform the other parts of the coroutine body
7826   // statement, such as the implicit suspend statements (because those
7827   // statements reference the FunctionScopeInfo::CoroutinePromise).
7828   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7829     return StmtError();
7830   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7831   if (!Promise)
7832     return StmtError();
7833   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7834   ScopeInfo->CoroutinePromise = Promise;
7835 
7836   // Transform the implicit coroutine statements constructed using dependent
7837   // types during the previous parse: initial and final suspensions, the return
7838   // object, and others. We also transform the coroutine function's body.
7839   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7840   if (InitSuspend.isInvalid())
7841     return StmtError();
7842   StmtResult FinalSuspend =
7843       getDerived().TransformStmt(S->getFinalSuspendStmt());
7844   if (FinalSuspend.isInvalid() ||
7845       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7846     return StmtError();
7847   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7848   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7849 
7850   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7851   if (BodyRes.isInvalid())
7852     return StmtError();
7853 
7854   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7855   if (Builder.isInvalid())
7856     return StmtError();
7857 
7858   Expr *ReturnObject = S->getReturnValueInit();
7859   assert(ReturnObject && "the return object is expected to be valid");
7860   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7861                                                      /*NoCopyInit*/ false);
7862   if (Res.isInvalid())
7863     return StmtError();
7864   Builder.ReturnValue = Res.get();
7865 
7866   // If during the previous parse the coroutine still had a dependent promise
7867   // statement, we may need to build some implicit coroutine statements
7868   // (such as exception and fallthrough handlers) for the first time.
7869   if (S->hasDependentPromiseType()) {
7870     // We can only build these statements, however, if the current promise type
7871     // is not dependent.
7872     if (!Promise->getType()->isDependentType()) {
7873       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7874              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7875              "these nodes should not have been built yet");
7876       if (!Builder.buildDependentStatements())
7877         return StmtError();
7878     }
7879   } else {
7880     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7881       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7882       if (Res.isInvalid())
7883         return StmtError();
7884       Builder.OnFallthrough = Res.get();
7885     }
7886 
7887     if (auto *OnException = S->getExceptionHandler()) {
7888       StmtResult Res = getDerived().TransformStmt(OnException);
7889       if (Res.isInvalid())
7890         return StmtError();
7891       Builder.OnException = Res.get();
7892     }
7893 
7894     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7895       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7896       if (Res.isInvalid())
7897         return StmtError();
7898       Builder.ReturnStmtOnAllocFailure = Res.get();
7899     }
7900 
7901     // Transform any additional statements we may have already built
7902     assert(S->getAllocate() && S->getDeallocate() &&
7903            "allocation and deallocation calls must already be built");
7904     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7905     if (AllocRes.isInvalid())
7906       return StmtError();
7907     Builder.Allocate = AllocRes.get();
7908 
7909     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7910     if (DeallocRes.isInvalid())
7911       return StmtError();
7912     Builder.Deallocate = DeallocRes.get();
7913 
7914     if (auto *ReturnStmt = S->getReturnStmt()) {
7915       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7916       if (Res.isInvalid())
7917         return StmtError();
7918       Builder.ReturnStmt = Res.get();
7919     }
7920   }
7921 
7922   return getDerived().RebuildCoroutineBodyStmt(Builder);
7923 }
7924 
7925 template<typename Derived>
7926 StmtResult
7927 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7928   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7929                                                         /*NotCopyInit*/false);
7930   if (Result.isInvalid())
7931     return StmtError();
7932 
7933   // Always rebuild; we don't know if this needs to be injected into a new
7934   // context or if the promise type has changed.
7935   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7936                                           S->isImplicit());
7937 }
7938 
7939 template<typename Derived>
7940 ExprResult
7941 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7942   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7943                                                         /*NotCopyInit*/false);
7944   if (Result.isInvalid())
7945     return ExprError();
7946 
7947   // Always rebuild; we don't know if this needs to be injected into a new
7948   // context or if the promise type has changed.
7949   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7950                                          E->isImplicit());
7951 }
7952 
7953 template <typename Derived>
7954 ExprResult
7955 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7956   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7957                                                         /*NotCopyInit*/ false);
7958   if (OperandResult.isInvalid())
7959     return ExprError();
7960 
7961   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7962           E->getOperatorCoawaitLookup());
7963 
7964   if (LookupResult.isInvalid())
7965     return ExprError();
7966 
7967   // Always rebuild; we don't know if this needs to be injected into a new
7968   // context or if the promise type has changed.
7969   return getDerived().RebuildDependentCoawaitExpr(
7970       E->getKeywordLoc(), OperandResult.get(),
7971       cast<UnresolvedLookupExpr>(LookupResult.get()));
7972 }
7973 
7974 template<typename Derived>
7975 ExprResult
7976 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7977   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7978                                                         /*NotCopyInit*/false);
7979   if (Result.isInvalid())
7980     return ExprError();
7981 
7982   // Always rebuild; we don't know if this needs to be injected into a new
7983   // context or if the promise type has changed.
7984   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7985 }
7986 
7987 // Objective-C Statements.
7988 
7989 template<typename Derived>
7990 StmtResult
7991 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7992   // Transform the body of the @try.
7993   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7994   if (TryBody.isInvalid())
7995     return StmtError();
7996 
7997   // Transform the @catch statements (if present).
7998   bool AnyCatchChanged = false;
7999   SmallVector<Stmt*, 8> CatchStmts;
8000   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8001     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8002     if (Catch.isInvalid())
8003       return StmtError();
8004     if (Catch.get() != S->getCatchStmt(I))
8005       AnyCatchChanged = true;
8006     CatchStmts.push_back(Catch.get());
8007   }
8008 
8009   // Transform the @finally statement (if present).
8010   StmtResult Finally;
8011   if (S->getFinallyStmt()) {
8012     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8013     if (Finally.isInvalid())
8014       return StmtError();
8015   }
8016 
8017   // If nothing changed, just retain this statement.
8018   if (!getDerived().AlwaysRebuild() &&
8019       TryBody.get() == S->getTryBody() &&
8020       !AnyCatchChanged &&
8021       Finally.get() == S->getFinallyStmt())
8022     return S;
8023 
8024   // Build a new statement.
8025   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8026                                            CatchStmts, Finally.get());
8027 }
8028 
8029 template<typename Derived>
8030 StmtResult
8031 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8032   // Transform the @catch parameter, if there is one.
8033   VarDecl *Var = nullptr;
8034   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8035     TypeSourceInfo *TSInfo = nullptr;
8036     if (FromVar->getTypeSourceInfo()) {
8037       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8038       if (!TSInfo)
8039         return StmtError();
8040     }
8041 
8042     QualType T;
8043     if (TSInfo)
8044       T = TSInfo->getType();
8045     else {
8046       T = getDerived().TransformType(FromVar->getType());
8047       if (T.isNull())
8048         return StmtError();
8049     }
8050 
8051     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8052     if (!Var)
8053       return StmtError();
8054   }
8055 
8056   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8057   if (Body.isInvalid())
8058     return StmtError();
8059 
8060   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8061                                              S->getRParenLoc(),
8062                                              Var, Body.get());
8063 }
8064 
8065 template<typename Derived>
8066 StmtResult
8067 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8068   // Transform the body.
8069   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8070   if (Body.isInvalid())
8071     return StmtError();
8072 
8073   // If nothing changed, just retain this statement.
8074   if (!getDerived().AlwaysRebuild() &&
8075       Body.get() == S->getFinallyBody())
8076     return S;
8077 
8078   // Build a new statement.
8079   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8080                                                Body.get());
8081 }
8082 
8083 template<typename Derived>
8084 StmtResult
8085 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8086   ExprResult Operand;
8087   if (S->getThrowExpr()) {
8088     Operand = getDerived().TransformExpr(S->getThrowExpr());
8089     if (Operand.isInvalid())
8090       return StmtError();
8091   }
8092 
8093   if (!getDerived().AlwaysRebuild() &&
8094       Operand.get() == S->getThrowExpr())
8095     return S;
8096 
8097   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8098 }
8099 
8100 template<typename Derived>
8101 StmtResult
8102 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8103                                                   ObjCAtSynchronizedStmt *S) {
8104   // Transform the object we are locking.
8105   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8106   if (Object.isInvalid())
8107     return StmtError();
8108   Object =
8109     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8110                                                   Object.get());
8111   if (Object.isInvalid())
8112     return StmtError();
8113 
8114   // Transform the body.
8115   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8116   if (Body.isInvalid())
8117     return StmtError();
8118 
8119   // If nothing change, just retain the current statement.
8120   if (!getDerived().AlwaysRebuild() &&
8121       Object.get() == S->getSynchExpr() &&
8122       Body.get() == S->getSynchBody())
8123     return S;
8124 
8125   // Build a new statement.
8126   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8127                                                     Object.get(), Body.get());
8128 }
8129 
8130 template<typename Derived>
8131 StmtResult
8132 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8133                                               ObjCAutoreleasePoolStmt *S) {
8134   // Transform the body.
8135   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8136   if (Body.isInvalid())
8137     return StmtError();
8138 
8139   // If nothing changed, just retain this statement.
8140   if (!getDerived().AlwaysRebuild() &&
8141       Body.get() == S->getSubStmt())
8142     return S;
8143 
8144   // Build a new statement.
8145   return getDerived().RebuildObjCAutoreleasePoolStmt(
8146                         S->getAtLoc(), Body.get());
8147 }
8148 
8149 template<typename Derived>
8150 StmtResult
8151 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8152                                                   ObjCForCollectionStmt *S) {
8153   // Transform the element statement.
8154   StmtResult Element =
8155       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8156   if (Element.isInvalid())
8157     return StmtError();
8158 
8159   // Transform the collection expression.
8160   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8161   if (Collection.isInvalid())
8162     return StmtError();
8163 
8164   // Transform the body.
8165   StmtResult Body = getDerived().TransformStmt(S->getBody());
8166   if (Body.isInvalid())
8167     return StmtError();
8168 
8169   // If nothing changed, just retain this statement.
8170   if (!getDerived().AlwaysRebuild() &&
8171       Element.get() == S->getElement() &&
8172       Collection.get() == S->getCollection() &&
8173       Body.get() == S->getBody())
8174     return S;
8175 
8176   // Build a new statement.
8177   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8178                                                    Element.get(),
8179                                                    Collection.get(),
8180                                                    S->getRParenLoc(),
8181                                                    Body.get());
8182 }
8183 
8184 template <typename Derived>
8185 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8186   // Transform the exception declaration, if any.
8187   VarDecl *Var = nullptr;
8188   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8189     TypeSourceInfo *T =
8190         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8191     if (!T)
8192       return StmtError();
8193 
8194     Var = getDerived().RebuildExceptionDecl(
8195         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8196         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8197     if (!Var || Var->isInvalidDecl())
8198       return StmtError();
8199   }
8200 
8201   // Transform the actual exception handler.
8202   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8203   if (Handler.isInvalid())
8204     return StmtError();
8205 
8206   if (!getDerived().AlwaysRebuild() && !Var &&
8207       Handler.get() == S->getHandlerBlock())
8208     return S;
8209 
8210   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8211 }
8212 
8213 template <typename Derived>
8214 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8215   // Transform the try block itself.
8216   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8217   if (TryBlock.isInvalid())
8218     return StmtError();
8219 
8220   // Transform the handlers.
8221   bool HandlerChanged = false;
8222   SmallVector<Stmt *, 8> Handlers;
8223   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8224     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8225     if (Handler.isInvalid())
8226       return StmtError();
8227 
8228     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8229     Handlers.push_back(Handler.getAs<Stmt>());
8230   }
8231 
8232   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8233       !HandlerChanged)
8234     return S;
8235 
8236   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8237                                         Handlers);
8238 }
8239 
8240 template<typename Derived>
8241 StmtResult
8242 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8243   StmtResult Init =
8244       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8245   if (Init.isInvalid())
8246     return StmtError();
8247 
8248   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8249   if (Range.isInvalid())
8250     return StmtError();
8251 
8252   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8253   if (Begin.isInvalid())
8254     return StmtError();
8255   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8256   if (End.isInvalid())
8257     return StmtError();
8258 
8259   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8260   if (Cond.isInvalid())
8261     return StmtError();
8262   if (Cond.get())
8263     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8264   if (Cond.isInvalid())
8265     return StmtError();
8266   if (Cond.get())
8267     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8268 
8269   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8270   if (Inc.isInvalid())
8271     return StmtError();
8272   if (Inc.get())
8273     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8274 
8275   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8276   if (LoopVar.isInvalid())
8277     return StmtError();
8278 
8279   StmtResult NewStmt = S;
8280   if (getDerived().AlwaysRebuild() ||
8281       Init.get() != S->getInit() ||
8282       Range.get() != S->getRangeStmt() ||
8283       Begin.get() != S->getBeginStmt() ||
8284       End.get() != S->getEndStmt() ||
8285       Cond.get() != S->getCond() ||
8286       Inc.get() != S->getInc() ||
8287       LoopVar.get() != S->getLoopVarStmt()) {
8288     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8289                                                   S->getCoawaitLoc(), Init.get(),
8290                                                   S->getColonLoc(), Range.get(),
8291                                                   Begin.get(), End.get(),
8292                                                   Cond.get(),
8293                                                   Inc.get(), LoopVar.get(),
8294                                                   S->getRParenLoc());
8295     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8296       // Might not have attached any initializer to the loop variable.
8297       getSema().ActOnInitializerError(
8298           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8299       return StmtError();
8300     }
8301   }
8302 
8303   StmtResult Body = getDerived().TransformStmt(S->getBody());
8304   if (Body.isInvalid())
8305     return StmtError();
8306 
8307   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8308   // it now so we have a new statement to attach the body to.
8309   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8310     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8311                                                   S->getCoawaitLoc(), Init.get(),
8312                                                   S->getColonLoc(), Range.get(),
8313                                                   Begin.get(), End.get(),
8314                                                   Cond.get(),
8315                                                   Inc.get(), LoopVar.get(),
8316                                                   S->getRParenLoc());
8317     if (NewStmt.isInvalid())
8318       return StmtError();
8319   }
8320 
8321   if (NewStmt.get() == S)
8322     return S;
8323 
8324   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8325 }
8326 
8327 template<typename Derived>
8328 StmtResult
8329 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8330                                                     MSDependentExistsStmt *S) {
8331   // Transform the nested-name-specifier, if any.
8332   NestedNameSpecifierLoc QualifierLoc;
8333   if (S->getQualifierLoc()) {
8334     QualifierLoc
8335       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8336     if (!QualifierLoc)
8337       return StmtError();
8338   }
8339 
8340   // Transform the declaration name.
8341   DeclarationNameInfo NameInfo = S->getNameInfo();
8342   if (NameInfo.getName()) {
8343     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8344     if (!NameInfo.getName())
8345       return StmtError();
8346   }
8347 
8348   // Check whether anything changed.
8349   if (!getDerived().AlwaysRebuild() &&
8350       QualifierLoc == S->getQualifierLoc() &&
8351       NameInfo.getName() == S->getNameInfo().getName())
8352     return S;
8353 
8354   // Determine whether this name exists, if we can.
8355   CXXScopeSpec SS;
8356   SS.Adopt(QualifierLoc);
8357   bool Dependent = false;
8358   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8359   case Sema::IER_Exists:
8360     if (S->isIfExists())
8361       break;
8362 
8363     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8364 
8365   case Sema::IER_DoesNotExist:
8366     if (S->isIfNotExists())
8367       break;
8368 
8369     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8370 
8371   case Sema::IER_Dependent:
8372     Dependent = true;
8373     break;
8374 
8375   case Sema::IER_Error:
8376     return StmtError();
8377   }
8378 
8379   // We need to continue with the instantiation, so do so now.
8380   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8381   if (SubStmt.isInvalid())
8382     return StmtError();
8383 
8384   // If we have resolved the name, just transform to the substatement.
8385   if (!Dependent)
8386     return SubStmt;
8387 
8388   // The name is still dependent, so build a dependent expression again.
8389   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8390                                                    S->isIfExists(),
8391                                                    QualifierLoc,
8392                                                    NameInfo,
8393                                                    SubStmt.get());
8394 }
8395 
8396 template<typename Derived>
8397 ExprResult
8398 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8399   NestedNameSpecifierLoc QualifierLoc;
8400   if (E->getQualifierLoc()) {
8401     QualifierLoc
8402     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8403     if (!QualifierLoc)
8404       return ExprError();
8405   }
8406 
8407   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8408     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8409   if (!PD)
8410     return ExprError();
8411 
8412   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8413   if (Base.isInvalid())
8414     return ExprError();
8415 
8416   return new (SemaRef.getASTContext())
8417       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8418                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8419                         QualifierLoc, E->getMemberLoc());
8420 }
8421 
8422 template <typename Derived>
8423 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8424     MSPropertySubscriptExpr *E) {
8425   auto BaseRes = getDerived().TransformExpr(E->getBase());
8426   if (BaseRes.isInvalid())
8427     return ExprError();
8428   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8429   if (IdxRes.isInvalid())
8430     return ExprError();
8431 
8432   if (!getDerived().AlwaysRebuild() &&
8433       BaseRes.get() == E->getBase() &&
8434       IdxRes.get() == E->getIdx())
8435     return E;
8436 
8437   return getDerived().RebuildArraySubscriptExpr(
8438       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8439 }
8440 
8441 template <typename Derived>
8442 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8443   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8444   if (TryBlock.isInvalid())
8445     return StmtError();
8446 
8447   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8448   if (Handler.isInvalid())
8449     return StmtError();
8450 
8451   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8452       Handler.get() == S->getHandler())
8453     return S;
8454 
8455   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8456                                         TryBlock.get(), Handler.get());
8457 }
8458 
8459 template <typename Derived>
8460 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8461   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8462   if (Block.isInvalid())
8463     return StmtError();
8464 
8465   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8466 }
8467 
8468 template <typename Derived>
8469 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8470   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8471   if (FilterExpr.isInvalid())
8472     return StmtError();
8473 
8474   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8475   if (Block.isInvalid())
8476     return StmtError();
8477 
8478   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8479                                            Block.get());
8480 }
8481 
8482 template <typename Derived>
8483 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8484   if (isa<SEHFinallyStmt>(Handler))
8485     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8486   else
8487     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8488 }
8489 
8490 template<typename Derived>
8491 StmtResult
8492 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8493   return S;
8494 }
8495 
8496 //===----------------------------------------------------------------------===//
8497 // OpenMP directive transformation
8498 //===----------------------------------------------------------------------===//
8499 
8500 template <typename Derived>
8501 StmtResult
8502 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8503   // OMPCanonicalLoops are eliminated during transformation, since they will be
8504   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8505   // after transformation.
8506   return getDerived().TransformStmt(L->getLoopStmt());
8507 }
8508 
8509 template <typename Derived>
8510 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8511     OMPExecutableDirective *D) {
8512 
8513   // Transform the clauses
8514   llvm::SmallVector<OMPClause *, 16> TClauses;
8515   ArrayRef<OMPClause *> Clauses = D->clauses();
8516   TClauses.reserve(Clauses.size());
8517   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8518        I != E; ++I) {
8519     if (*I) {
8520       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8521       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8522       getDerived().getSema().EndOpenMPClause();
8523       if (Clause)
8524         TClauses.push_back(Clause);
8525     } else {
8526       TClauses.push_back(nullptr);
8527     }
8528   }
8529   StmtResult AssociatedStmt;
8530   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8531     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8532                                                   /*CurScope=*/nullptr);
8533     StmtResult Body;
8534     {
8535       Sema::CompoundScopeRAII CompoundScope(getSema());
8536       Stmt *CS;
8537       if (D->getDirectiveKind() == OMPD_atomic ||
8538           D->getDirectiveKind() == OMPD_critical ||
8539           D->getDirectiveKind() == OMPD_section ||
8540           D->getDirectiveKind() == OMPD_master)
8541         CS = D->getAssociatedStmt();
8542       else
8543         CS = D->getRawStmt();
8544       Body = getDerived().TransformStmt(CS);
8545       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8546           getSema().getLangOpts().OpenMPIRBuilder)
8547         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8548     }
8549     AssociatedStmt =
8550         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8551     if (AssociatedStmt.isInvalid()) {
8552       return StmtError();
8553     }
8554   }
8555   if (TClauses.size() != Clauses.size()) {
8556     return StmtError();
8557   }
8558 
8559   // Transform directive name for 'omp critical' directive.
8560   DeclarationNameInfo DirName;
8561   if (D->getDirectiveKind() == OMPD_critical) {
8562     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8563     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8564   }
8565   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8566   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8567     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8568   } else if (D->getDirectiveKind() == OMPD_cancel) {
8569     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8570   }
8571 
8572   return getDerived().RebuildOMPExecutableDirective(
8573       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8574       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8575 }
8576 
8577 template <typename Derived>
8578 StmtResult
8579 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8580   // TODO: Fix This
8581   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8582       << getOpenMPDirectiveName(D->getDirectiveKind());
8583   return StmtError();
8584 }
8585 
8586 template <typename Derived>
8587 StmtResult
8588 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8589   DeclarationNameInfo DirName;
8590   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8591                                              D->getBeginLoc());
8592   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8593   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8594   return Res;
8595 }
8596 
8597 template <typename Derived>
8598 StmtResult
8599 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8600   DeclarationNameInfo DirName;
8601   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8602                                              D->getBeginLoc());
8603   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8604   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8605   return Res;
8606 }
8607 
8608 template <typename Derived>
8609 StmtResult
8610 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8611   DeclarationNameInfo DirName;
8612   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8613                                              nullptr, D->getBeginLoc());
8614   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8615   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8616   return Res;
8617 }
8618 
8619 template <typename Derived>
8620 StmtResult
8621 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8622   DeclarationNameInfo DirName;
8623   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8624                                              nullptr, D->getBeginLoc());
8625   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8626   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8627   return Res;
8628 }
8629 
8630 template <typename Derived>
8631 StmtResult
8632 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8633   DeclarationNameInfo DirName;
8634   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8635                                              D->getBeginLoc());
8636   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8637   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8638   return Res;
8639 }
8640 
8641 template <typename Derived>
8642 StmtResult
8643 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8644   DeclarationNameInfo DirName;
8645   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8646                                              D->getBeginLoc());
8647   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8648   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8649   return Res;
8650 }
8651 
8652 template <typename Derived>
8653 StmtResult
8654 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8655   DeclarationNameInfo DirName;
8656   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8657                                              D->getBeginLoc());
8658   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8659   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8660   return Res;
8661 }
8662 
8663 template <typename Derived>
8664 StmtResult
8665 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8666   DeclarationNameInfo DirName;
8667   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8668                                              D->getBeginLoc());
8669   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8670   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8671   return Res;
8672 }
8673 
8674 template <typename Derived>
8675 StmtResult
8676 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8677   DeclarationNameInfo DirName;
8678   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8679                                              D->getBeginLoc());
8680   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8681   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8682   return Res;
8683 }
8684 
8685 template <typename Derived>
8686 StmtResult
8687 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8688   DeclarationNameInfo DirName;
8689   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8690                                              D->getBeginLoc());
8691   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8692   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8693   return Res;
8694 }
8695 
8696 template <typename Derived>
8697 StmtResult
8698 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8699   getDerived().getSema().StartOpenMPDSABlock(
8700       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8701   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8702   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8703   return Res;
8704 }
8705 
8706 template <typename Derived>
8707 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8708     OMPParallelForDirective *D) {
8709   DeclarationNameInfo DirName;
8710   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8711                                              nullptr, D->getBeginLoc());
8712   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8713   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8714   return Res;
8715 }
8716 
8717 template <typename Derived>
8718 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8719     OMPParallelForSimdDirective *D) {
8720   DeclarationNameInfo DirName;
8721   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8722                                              nullptr, D->getBeginLoc());
8723   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8724   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8725   return Res;
8726 }
8727 
8728 template <typename Derived>
8729 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8730     OMPParallelMasterDirective *D) {
8731   DeclarationNameInfo DirName;
8732   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8733                                              nullptr, D->getBeginLoc());
8734   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8735   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8736   return Res;
8737 }
8738 
8739 template <typename Derived>
8740 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8741     OMPParallelSectionsDirective *D) {
8742   DeclarationNameInfo DirName;
8743   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8744                                              nullptr, D->getBeginLoc());
8745   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8746   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8747   return Res;
8748 }
8749 
8750 template <typename Derived>
8751 StmtResult
8752 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8753   DeclarationNameInfo DirName;
8754   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8755                                              D->getBeginLoc());
8756   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8757   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8758   return Res;
8759 }
8760 
8761 template <typename Derived>
8762 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8763     OMPTaskyieldDirective *D) {
8764   DeclarationNameInfo DirName;
8765   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8766                                              D->getBeginLoc());
8767   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8768   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8769   return Res;
8770 }
8771 
8772 template <typename Derived>
8773 StmtResult
8774 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8775   DeclarationNameInfo DirName;
8776   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8777                                              D->getBeginLoc());
8778   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8779   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8780   return Res;
8781 }
8782 
8783 template <typename Derived>
8784 StmtResult
8785 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8786   DeclarationNameInfo DirName;
8787   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8788                                              D->getBeginLoc());
8789   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8790   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8791   return Res;
8792 }
8793 
8794 template <typename Derived>
8795 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8796     OMPTaskgroupDirective *D) {
8797   DeclarationNameInfo DirName;
8798   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8799                                              D->getBeginLoc());
8800   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8801   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8802   return Res;
8803 }
8804 
8805 template <typename Derived>
8806 StmtResult
8807 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8808   DeclarationNameInfo DirName;
8809   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8810                                              D->getBeginLoc());
8811   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8812   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8813   return Res;
8814 }
8815 
8816 template <typename Derived>
8817 StmtResult
8818 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8819   DeclarationNameInfo DirName;
8820   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8821                                              D->getBeginLoc());
8822   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8823   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8824   return Res;
8825 }
8826 
8827 template <typename Derived>
8828 StmtResult
8829 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8830   DeclarationNameInfo DirName;
8831   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8832                                              D->getBeginLoc());
8833   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8834   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8835   return Res;
8836 }
8837 
8838 template <typename Derived>
8839 StmtResult
8840 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8841   DeclarationNameInfo DirName;
8842   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8843                                              D->getBeginLoc());
8844   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8845   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8846   return Res;
8847 }
8848 
8849 template <typename Derived>
8850 StmtResult
8851 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8852   DeclarationNameInfo DirName;
8853   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8854                                              D->getBeginLoc());
8855   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8856   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8857   return Res;
8858 }
8859 
8860 template <typename Derived>
8861 StmtResult
8862 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8863   DeclarationNameInfo DirName;
8864   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8865                                              D->getBeginLoc());
8866   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8867   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8868   return Res;
8869 }
8870 
8871 template <typename Derived>
8872 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8873     OMPTargetDataDirective *D) {
8874   DeclarationNameInfo DirName;
8875   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8876                                              D->getBeginLoc());
8877   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8878   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8879   return Res;
8880 }
8881 
8882 template <typename Derived>
8883 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8884     OMPTargetEnterDataDirective *D) {
8885   DeclarationNameInfo DirName;
8886   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8887                                              nullptr, D->getBeginLoc());
8888   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8889   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8890   return Res;
8891 }
8892 
8893 template <typename Derived>
8894 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8895     OMPTargetExitDataDirective *D) {
8896   DeclarationNameInfo DirName;
8897   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8898                                              nullptr, D->getBeginLoc());
8899   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8900   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8901   return Res;
8902 }
8903 
8904 template <typename Derived>
8905 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8906     OMPTargetParallelDirective *D) {
8907   DeclarationNameInfo DirName;
8908   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8909                                              nullptr, D->getBeginLoc());
8910   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8911   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8912   return Res;
8913 }
8914 
8915 template <typename Derived>
8916 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8917     OMPTargetParallelForDirective *D) {
8918   DeclarationNameInfo DirName;
8919   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8920                                              nullptr, D->getBeginLoc());
8921   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8922   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8923   return Res;
8924 }
8925 
8926 template <typename Derived>
8927 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8928     OMPTargetUpdateDirective *D) {
8929   DeclarationNameInfo DirName;
8930   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8931                                              nullptr, D->getBeginLoc());
8932   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8933   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8934   return Res;
8935 }
8936 
8937 template <typename Derived>
8938 StmtResult
8939 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8940   DeclarationNameInfo DirName;
8941   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8942                                              D->getBeginLoc());
8943   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8944   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8945   return Res;
8946 }
8947 
8948 template <typename Derived>
8949 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8950     OMPCancellationPointDirective *D) {
8951   DeclarationNameInfo DirName;
8952   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8953                                              nullptr, D->getBeginLoc());
8954   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8955   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8956   return Res;
8957 }
8958 
8959 template <typename Derived>
8960 StmtResult
8961 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8962   DeclarationNameInfo DirName;
8963   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8964                                              D->getBeginLoc());
8965   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8966   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8967   return Res;
8968 }
8969 
8970 template <typename Derived>
8971 StmtResult
8972 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8973   DeclarationNameInfo DirName;
8974   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8975                                              D->getBeginLoc());
8976   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8977   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8978   return Res;
8979 }
8980 
8981 template <typename Derived>
8982 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8983     OMPTaskLoopSimdDirective *D) {
8984   DeclarationNameInfo DirName;
8985   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8986                                              nullptr, D->getBeginLoc());
8987   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8988   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8989   return Res;
8990 }
8991 
8992 template <typename Derived>
8993 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8994     OMPMasterTaskLoopDirective *D) {
8995   DeclarationNameInfo DirName;
8996   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8997                                              nullptr, D->getBeginLoc());
8998   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8999   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9000   return Res;
9001 }
9002 
9003 template <typename Derived>
9004 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9005     OMPMasterTaskLoopSimdDirective *D) {
9006   DeclarationNameInfo DirName;
9007   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9008                                              nullptr, D->getBeginLoc());
9009   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9010   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9011   return Res;
9012 }
9013 
9014 template <typename Derived>
9015 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9016     OMPParallelMasterTaskLoopDirective *D) {
9017   DeclarationNameInfo DirName;
9018   getDerived().getSema().StartOpenMPDSABlock(
9019       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9020   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9021   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9022   return Res;
9023 }
9024 
9025 template <typename Derived>
9026 StmtResult
9027 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9028     OMPParallelMasterTaskLoopSimdDirective *D) {
9029   DeclarationNameInfo DirName;
9030   getDerived().getSema().StartOpenMPDSABlock(
9031       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9032   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9033   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9034   return Res;
9035 }
9036 
9037 template <typename Derived>
9038 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9039     OMPDistributeDirective *D) {
9040   DeclarationNameInfo DirName;
9041   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9042                                              D->getBeginLoc());
9043   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9044   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9045   return Res;
9046 }
9047 
9048 template <typename Derived>
9049 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9050     OMPDistributeParallelForDirective *D) {
9051   DeclarationNameInfo DirName;
9052   getDerived().getSema().StartOpenMPDSABlock(
9053       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9054   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9055   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9056   return Res;
9057 }
9058 
9059 template <typename Derived>
9060 StmtResult
9061 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9062     OMPDistributeParallelForSimdDirective *D) {
9063   DeclarationNameInfo DirName;
9064   getDerived().getSema().StartOpenMPDSABlock(
9065       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9066   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9067   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9068   return Res;
9069 }
9070 
9071 template <typename Derived>
9072 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9073     OMPDistributeSimdDirective *D) {
9074   DeclarationNameInfo DirName;
9075   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9076                                              nullptr, D->getBeginLoc());
9077   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9078   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9079   return Res;
9080 }
9081 
9082 template <typename Derived>
9083 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9084     OMPTargetParallelForSimdDirective *D) {
9085   DeclarationNameInfo DirName;
9086   getDerived().getSema().StartOpenMPDSABlock(
9087       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9088   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9089   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9090   return Res;
9091 }
9092 
9093 template <typename Derived>
9094 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9095     OMPTargetSimdDirective *D) {
9096   DeclarationNameInfo DirName;
9097   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9098                                              D->getBeginLoc());
9099   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9100   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9101   return Res;
9102 }
9103 
9104 template <typename Derived>
9105 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9106     OMPTeamsDistributeDirective *D) {
9107   DeclarationNameInfo DirName;
9108   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9109                                              nullptr, D->getBeginLoc());
9110   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9111   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9112   return Res;
9113 }
9114 
9115 template <typename Derived>
9116 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9117     OMPTeamsDistributeSimdDirective *D) {
9118   DeclarationNameInfo DirName;
9119   getDerived().getSema().StartOpenMPDSABlock(
9120       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9121   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9122   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9123   return Res;
9124 }
9125 
9126 template <typename Derived>
9127 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9128     OMPTeamsDistributeParallelForSimdDirective *D) {
9129   DeclarationNameInfo DirName;
9130   getDerived().getSema().StartOpenMPDSABlock(
9131       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9132       D->getBeginLoc());
9133   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9134   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9135   return Res;
9136 }
9137 
9138 template <typename Derived>
9139 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9140     OMPTeamsDistributeParallelForDirective *D) {
9141   DeclarationNameInfo DirName;
9142   getDerived().getSema().StartOpenMPDSABlock(
9143       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9144   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9145   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9146   return Res;
9147 }
9148 
9149 template <typename Derived>
9150 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9151     OMPTargetTeamsDirective *D) {
9152   DeclarationNameInfo DirName;
9153   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9154                                              nullptr, D->getBeginLoc());
9155   auto Res = getDerived().TransformOMPExecutableDirective(D);
9156   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9157   return Res;
9158 }
9159 
9160 template <typename Derived>
9161 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9162     OMPTargetTeamsDistributeDirective *D) {
9163   DeclarationNameInfo DirName;
9164   getDerived().getSema().StartOpenMPDSABlock(
9165       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9166   auto Res = getDerived().TransformOMPExecutableDirective(D);
9167   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9168   return Res;
9169 }
9170 
9171 template <typename Derived>
9172 StmtResult
9173 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9174     OMPTargetTeamsDistributeParallelForDirective *D) {
9175   DeclarationNameInfo DirName;
9176   getDerived().getSema().StartOpenMPDSABlock(
9177       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9178       D->getBeginLoc());
9179   auto Res = getDerived().TransformOMPExecutableDirective(D);
9180   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9181   return Res;
9182 }
9183 
9184 template <typename Derived>
9185 StmtResult TreeTransform<Derived>::
9186     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9187         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9188   DeclarationNameInfo DirName;
9189   getDerived().getSema().StartOpenMPDSABlock(
9190       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9191       D->getBeginLoc());
9192   auto Res = getDerived().TransformOMPExecutableDirective(D);
9193   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9194   return Res;
9195 }
9196 
9197 template <typename Derived>
9198 StmtResult
9199 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9200     OMPTargetTeamsDistributeSimdDirective *D) {
9201   DeclarationNameInfo DirName;
9202   getDerived().getSema().StartOpenMPDSABlock(
9203       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9204   auto Res = getDerived().TransformOMPExecutableDirective(D);
9205   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9206   return Res;
9207 }
9208 
9209 template <typename Derived>
9210 StmtResult
9211 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9212   DeclarationNameInfo DirName;
9213   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9214                                              D->getBeginLoc());
9215   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9216   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9217   return Res;
9218 }
9219 
9220 template <typename Derived>
9221 StmtResult
9222 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9223   DeclarationNameInfo DirName;
9224   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9225                                              D->getBeginLoc());
9226   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9227   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9228   return Res;
9229 }
9230 
9231 template <typename Derived>
9232 StmtResult
9233 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9234   DeclarationNameInfo DirName;
9235   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9236                                              D->getBeginLoc());
9237   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9238   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9239   return Res;
9240 }
9241 
9242 template <typename Derived>
9243 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9244     OMPGenericLoopDirective *D) {
9245   DeclarationNameInfo DirName;
9246   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9247                                              D->getBeginLoc());
9248   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9249   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9250   return Res;
9251 }
9252 
9253 template <typename Derived>
9254 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
9255     OMPTeamsGenericLoopDirective *D) {
9256   DeclarationNameInfo DirName;
9257   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr,
9258                                              D->getBeginLoc());
9259   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9260   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9261   return Res;
9262 }
9263 
9264 template <typename Derived>
9265 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
9266     OMPTargetTeamsGenericLoopDirective *D) {
9267   DeclarationNameInfo DirName;
9268   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName,
9269                                              nullptr, D->getBeginLoc());
9270   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9271   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9272   return Res;
9273 }
9274 
9275 template <typename Derived>
9276 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
9277     OMPParallelGenericLoopDirective *D) {
9278   DeclarationNameInfo DirName;
9279   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName,
9280                                              nullptr, D->getBeginLoc());
9281   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9282   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9283   return Res;
9284 }
9285 
9286 template <typename Derived>
9287 StmtResult
9288 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
9289     OMPTargetParallelGenericLoopDirective *D) {
9290   DeclarationNameInfo DirName;
9291   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName,
9292                                              nullptr, D->getBeginLoc());
9293   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9294   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9295   return Res;
9296 }
9297 
9298 //===----------------------------------------------------------------------===//
9299 // OpenMP clause transformation
9300 //===----------------------------------------------------------------------===//
9301 template <typename Derived>
9302 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9303   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9304   if (Cond.isInvalid())
9305     return nullptr;
9306   return getDerived().RebuildOMPIfClause(
9307       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9308       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9309 }
9310 
9311 template <typename Derived>
9312 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9313   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9314   if (Cond.isInvalid())
9315     return nullptr;
9316   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9317                                             C->getLParenLoc(), C->getEndLoc());
9318 }
9319 
9320 template <typename Derived>
9321 OMPClause *
9322 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9323   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9324   if (NumThreads.isInvalid())
9325     return nullptr;
9326   return getDerived().RebuildOMPNumThreadsClause(
9327       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9328 }
9329 
9330 template <typename Derived>
9331 OMPClause *
9332 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9333   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9334   if (E.isInvalid())
9335     return nullptr;
9336   return getDerived().RebuildOMPSafelenClause(
9337       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9338 }
9339 
9340 template <typename Derived>
9341 OMPClause *
9342 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9343   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9344   if (E.isInvalid())
9345     return nullptr;
9346   return getDerived().RebuildOMPAllocatorClause(
9347       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9348 }
9349 
9350 template <typename Derived>
9351 OMPClause *
9352 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9353   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9354   if (E.isInvalid())
9355     return nullptr;
9356   return getDerived().RebuildOMPSimdlenClause(
9357       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9358 }
9359 
9360 template <typename Derived>
9361 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9362   SmallVector<Expr *, 4> TransformedSizes;
9363   TransformedSizes.reserve(C->getNumSizes());
9364   bool Changed = false;
9365   for (Expr *E : C->getSizesRefs()) {
9366     if (!E) {
9367       TransformedSizes.push_back(nullptr);
9368       continue;
9369     }
9370 
9371     ExprResult T = getDerived().TransformExpr(E);
9372     if (T.isInvalid())
9373       return nullptr;
9374     if (E != T.get())
9375       Changed = true;
9376     TransformedSizes.push_back(T.get());
9377   }
9378 
9379   if (!Changed && !getDerived().AlwaysRebuild())
9380     return C;
9381   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9382                                C->getLParenLoc(), C->getEndLoc());
9383 }
9384 
9385 template <typename Derived>
9386 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9387   if (!getDerived().AlwaysRebuild())
9388     return C;
9389   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9390 }
9391 
9392 template <typename Derived>
9393 OMPClause *
9394 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9395   ExprResult T = getDerived().TransformExpr(C->getFactor());
9396   if (T.isInvalid())
9397     return nullptr;
9398   Expr *Factor = T.get();
9399   bool Changed = Factor != C->getFactor();
9400 
9401   if (!Changed && !getDerived().AlwaysRebuild())
9402     return C;
9403   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9404                                  C->getEndLoc());
9405 }
9406 
9407 template <typename Derived>
9408 OMPClause *
9409 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9410   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9411   if (E.isInvalid())
9412     return nullptr;
9413   return getDerived().RebuildOMPCollapseClause(
9414       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9415 }
9416 
9417 template <typename Derived>
9418 OMPClause *
9419 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9420   return getDerived().RebuildOMPDefaultClause(
9421       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9422       C->getLParenLoc(), C->getEndLoc());
9423 }
9424 
9425 template <typename Derived>
9426 OMPClause *
9427 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9428   return getDerived().RebuildOMPProcBindClause(
9429       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9430       C->getLParenLoc(), C->getEndLoc());
9431 }
9432 
9433 template <typename Derived>
9434 OMPClause *
9435 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9436   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9437   if (E.isInvalid())
9438     return nullptr;
9439   return getDerived().RebuildOMPScheduleClause(
9440       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9441       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9442       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9443       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9444 }
9445 
9446 template <typename Derived>
9447 OMPClause *
9448 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9449   ExprResult E;
9450   if (auto *Num = C->getNumForLoops()) {
9451     E = getDerived().TransformExpr(Num);
9452     if (E.isInvalid())
9453       return nullptr;
9454   }
9455   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9456                                               C->getLParenLoc(), E.get());
9457 }
9458 
9459 template <typename Derived>
9460 OMPClause *
9461 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9462   ExprResult E;
9463   if (Expr *Evt = C->getEventHandler()) {
9464     E = getDerived().TransformExpr(Evt);
9465     if (E.isInvalid())
9466       return nullptr;
9467   }
9468   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9469                                              C->getLParenLoc(), C->getEndLoc());
9470 }
9471 
9472 template <typename Derived>
9473 OMPClause *
9474 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9475   // No need to rebuild this clause, no template-dependent parameters.
9476   return C;
9477 }
9478 
9479 template <typename Derived>
9480 OMPClause *
9481 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9482   // No need to rebuild this clause, no template-dependent parameters.
9483   return C;
9484 }
9485 
9486 template <typename Derived>
9487 OMPClause *
9488 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9489   // No need to rebuild this clause, no template-dependent parameters.
9490   return C;
9491 }
9492 
9493 template <typename Derived>
9494 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9495   // No need to rebuild this clause, no template-dependent parameters.
9496   return C;
9497 }
9498 
9499 template <typename Derived>
9500 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *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>::TransformOMPUpdateClause(OMPUpdateClause *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>::TransformOMPCaptureClause(OMPCaptureClause *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>::TransformOMPCompareClause(OMPCompareClause *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>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9529   // No need to rebuild this clause, no template-dependent parameters.
9530   return C;
9531 }
9532 
9533 template <typename Derived>
9534 OMPClause *
9535 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9536   // No need to rebuild this clause, no template-dependent parameters.
9537   return C;
9538 }
9539 
9540 template <typename Derived>
9541 OMPClause *
9542 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9543   // No need to rebuild this clause, no template-dependent parameters.
9544   return C;
9545 }
9546 
9547 template <typename Derived>
9548 OMPClause *
9549 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9550   // No need to rebuild this clause, no template-dependent parameters.
9551   return C;
9552 }
9553 
9554 template <typename Derived>
9555 OMPClause *
9556 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9557   // No need to rebuild this clause, no template-dependent parameters.
9558   return C;
9559 }
9560 
9561 template <typename Derived>
9562 OMPClause *
9563 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9564   // No need to rebuild this clause, no template-dependent parameters.
9565   return C;
9566 }
9567 
9568 template <typename Derived>
9569 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9570   // No need to rebuild this clause, no template-dependent parameters.
9571   return C;
9572 }
9573 
9574 template <typename Derived>
9575 OMPClause *
9576 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9577   // No need to rebuild this clause, no template-dependent parameters.
9578   return C;
9579 }
9580 
9581 template <typename Derived>
9582 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9583   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9584   if (IVR.isInvalid())
9585     return nullptr;
9586 
9587   llvm::SmallVector<Expr *, 8> PrefExprs;
9588   PrefExprs.reserve(C->varlist_size() - 1);
9589   for (Expr *E : llvm::drop_begin(C->varlists())) {
9590     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9591     if (ER.isInvalid())
9592       return nullptr;
9593     PrefExprs.push_back(ER.get());
9594   }
9595   return getDerived().RebuildOMPInitClause(
9596       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9597       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9598 }
9599 
9600 template <typename Derived>
9601 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9602   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9603   if (ER.isInvalid())
9604     return nullptr;
9605   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9606                                           C->getLParenLoc(), C->getVarLoc(),
9607                                           C->getEndLoc());
9608 }
9609 
9610 template <typename Derived>
9611 OMPClause *
9612 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9613   ExprResult ER;
9614   if (Expr *IV = C->getInteropVar()) {
9615     ER = getDerived().TransformExpr(IV);
9616     if (ER.isInvalid())
9617       return nullptr;
9618   }
9619   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9620                                               C->getLParenLoc(), C->getVarLoc(),
9621                                               C->getEndLoc());
9622 }
9623 
9624 template <typename Derived>
9625 OMPClause *
9626 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9627   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9628   if (Cond.isInvalid())
9629     return nullptr;
9630   return getDerived().RebuildOMPNovariantsClause(
9631       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9632 }
9633 
9634 template <typename Derived>
9635 OMPClause *
9636 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9637   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9638   if (Cond.isInvalid())
9639     return nullptr;
9640   return getDerived().RebuildOMPNocontextClause(
9641       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9642 }
9643 
9644 template <typename Derived>
9645 OMPClause *
9646 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9647   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9648   if (ThreadID.isInvalid())
9649     return nullptr;
9650   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9651                                              C->getLParenLoc(), C->getEndLoc());
9652 }
9653 
9654 template <typename Derived>
9655 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9656   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9657   if (E.isInvalid())
9658     return nullptr;
9659   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9660                                             C->getLParenLoc(), C->getEndLoc());
9661 }
9662 
9663 template <typename Derived>
9664 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9665     OMPUnifiedAddressClause *C) {
9666   llvm_unreachable("unified_address clause cannot appear in dependent context");
9667 }
9668 
9669 template <typename Derived>
9670 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9671     OMPUnifiedSharedMemoryClause *C) {
9672   llvm_unreachable(
9673       "unified_shared_memory clause cannot appear in dependent context");
9674 }
9675 
9676 template <typename Derived>
9677 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9678     OMPReverseOffloadClause *C) {
9679   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9680 }
9681 
9682 template <typename Derived>
9683 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9684     OMPDynamicAllocatorsClause *C) {
9685   llvm_unreachable(
9686       "dynamic_allocators clause cannot appear in dependent context");
9687 }
9688 
9689 template <typename Derived>
9690 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9691     OMPAtomicDefaultMemOrderClause *C) {
9692   llvm_unreachable(
9693       "atomic_default_mem_order clause cannot appear in dependent context");
9694 }
9695 
9696 template <typename Derived>
9697 OMPClause *
9698 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9699   llvm::SmallVector<Expr *, 16> Vars;
9700   Vars.reserve(C->varlist_size());
9701   for (auto *VE : C->varlists()) {
9702     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9703     if (EVar.isInvalid())
9704       return nullptr;
9705     Vars.push_back(EVar.get());
9706   }
9707   return getDerived().RebuildOMPPrivateClause(
9708       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9709 }
9710 
9711 template <typename Derived>
9712 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9713     OMPFirstprivateClause *C) {
9714   llvm::SmallVector<Expr *, 16> Vars;
9715   Vars.reserve(C->varlist_size());
9716   for (auto *VE : C->varlists()) {
9717     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9718     if (EVar.isInvalid())
9719       return nullptr;
9720     Vars.push_back(EVar.get());
9721   }
9722   return getDerived().RebuildOMPFirstprivateClause(
9723       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9724 }
9725 
9726 template <typename Derived>
9727 OMPClause *
9728 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9729   llvm::SmallVector<Expr *, 16> Vars;
9730   Vars.reserve(C->varlist_size());
9731   for (auto *VE : C->varlists()) {
9732     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9733     if (EVar.isInvalid())
9734       return nullptr;
9735     Vars.push_back(EVar.get());
9736   }
9737   return getDerived().RebuildOMPLastprivateClause(
9738       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9739       C->getLParenLoc(), C->getEndLoc());
9740 }
9741 
9742 template <typename Derived>
9743 OMPClause *
9744 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9745   llvm::SmallVector<Expr *, 16> Vars;
9746   Vars.reserve(C->varlist_size());
9747   for (auto *VE : C->varlists()) {
9748     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9749     if (EVar.isInvalid())
9750       return nullptr;
9751     Vars.push_back(EVar.get());
9752   }
9753   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9754                                              C->getLParenLoc(), C->getEndLoc());
9755 }
9756 
9757 template <typename Derived>
9758 OMPClause *
9759 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9760   llvm::SmallVector<Expr *, 16> Vars;
9761   Vars.reserve(C->varlist_size());
9762   for (auto *VE : C->varlists()) {
9763     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9764     if (EVar.isInvalid())
9765       return nullptr;
9766     Vars.push_back(EVar.get());
9767   }
9768   CXXScopeSpec ReductionIdScopeSpec;
9769   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9770 
9771   DeclarationNameInfo NameInfo = C->getNameInfo();
9772   if (NameInfo.getName()) {
9773     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9774     if (!NameInfo.getName())
9775       return nullptr;
9776   }
9777   // Build a list of all UDR decls with the same names ranged by the Scopes.
9778   // The Scope boundary is a duplication of the previous decl.
9779   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9780   for (auto *E : C->reduction_ops()) {
9781     // Transform all the decls.
9782     if (E) {
9783       auto *ULE = cast<UnresolvedLookupExpr>(E);
9784       UnresolvedSet<8> Decls;
9785       for (auto *D : ULE->decls()) {
9786         NamedDecl *InstD =
9787             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9788         Decls.addDecl(InstD, InstD->getAccess());
9789       }
9790       UnresolvedReductions.push_back(
9791        UnresolvedLookupExpr::Create(
9792           SemaRef.Context, /*NamingClass=*/nullptr,
9793           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9794           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9795           Decls.begin(), Decls.end()));
9796     } else
9797       UnresolvedReductions.push_back(nullptr);
9798   }
9799   return getDerived().RebuildOMPReductionClause(
9800       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9801       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9802       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9803 }
9804 
9805 template <typename Derived>
9806 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9807     OMPTaskReductionClause *C) {
9808   llvm::SmallVector<Expr *, 16> Vars;
9809   Vars.reserve(C->varlist_size());
9810   for (auto *VE : C->varlists()) {
9811     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9812     if (EVar.isInvalid())
9813       return nullptr;
9814     Vars.push_back(EVar.get());
9815   }
9816   CXXScopeSpec ReductionIdScopeSpec;
9817   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9818 
9819   DeclarationNameInfo NameInfo = C->getNameInfo();
9820   if (NameInfo.getName()) {
9821     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9822     if (!NameInfo.getName())
9823       return nullptr;
9824   }
9825   // Build a list of all UDR decls with the same names ranged by the Scopes.
9826   // The Scope boundary is a duplication of the previous decl.
9827   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9828   for (auto *E : C->reduction_ops()) {
9829     // Transform all the decls.
9830     if (E) {
9831       auto *ULE = cast<UnresolvedLookupExpr>(E);
9832       UnresolvedSet<8> Decls;
9833       for (auto *D : ULE->decls()) {
9834         NamedDecl *InstD =
9835             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9836         Decls.addDecl(InstD, InstD->getAccess());
9837       }
9838       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9839           SemaRef.Context, /*NamingClass=*/nullptr,
9840           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9841           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9842     } else
9843       UnresolvedReductions.push_back(nullptr);
9844   }
9845   return getDerived().RebuildOMPTaskReductionClause(
9846       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9847       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9848 }
9849 
9850 template <typename Derived>
9851 OMPClause *
9852 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9853   llvm::SmallVector<Expr *, 16> Vars;
9854   Vars.reserve(C->varlist_size());
9855   for (auto *VE : C->varlists()) {
9856     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9857     if (EVar.isInvalid())
9858       return nullptr;
9859     Vars.push_back(EVar.get());
9860   }
9861   CXXScopeSpec ReductionIdScopeSpec;
9862   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9863 
9864   DeclarationNameInfo NameInfo = C->getNameInfo();
9865   if (NameInfo.getName()) {
9866     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9867     if (!NameInfo.getName())
9868       return nullptr;
9869   }
9870   // Build a list of all UDR decls with the same names ranged by the Scopes.
9871   // The Scope boundary is a duplication of the previous decl.
9872   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9873   for (auto *E : C->reduction_ops()) {
9874     // Transform all the decls.
9875     if (E) {
9876       auto *ULE = cast<UnresolvedLookupExpr>(E);
9877       UnresolvedSet<8> Decls;
9878       for (auto *D : ULE->decls()) {
9879         NamedDecl *InstD =
9880             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9881         Decls.addDecl(InstD, InstD->getAccess());
9882       }
9883       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9884           SemaRef.Context, /*NamingClass=*/nullptr,
9885           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9886           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9887     } else
9888       UnresolvedReductions.push_back(nullptr);
9889   }
9890   return getDerived().RebuildOMPInReductionClause(
9891       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9892       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9893 }
9894 
9895 template <typename Derived>
9896 OMPClause *
9897 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9898   llvm::SmallVector<Expr *, 16> Vars;
9899   Vars.reserve(C->varlist_size());
9900   for (auto *VE : C->varlists()) {
9901     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9902     if (EVar.isInvalid())
9903       return nullptr;
9904     Vars.push_back(EVar.get());
9905   }
9906   ExprResult Step = getDerived().TransformExpr(C->getStep());
9907   if (Step.isInvalid())
9908     return nullptr;
9909   return getDerived().RebuildOMPLinearClause(
9910       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9911       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9912 }
9913 
9914 template <typename Derived>
9915 OMPClause *
9916 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9917   llvm::SmallVector<Expr *, 16> Vars;
9918   Vars.reserve(C->varlist_size());
9919   for (auto *VE : C->varlists()) {
9920     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9921     if (EVar.isInvalid())
9922       return nullptr;
9923     Vars.push_back(EVar.get());
9924   }
9925   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9926   if (Alignment.isInvalid())
9927     return nullptr;
9928   return getDerived().RebuildOMPAlignedClause(
9929       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9930       C->getColonLoc(), C->getEndLoc());
9931 }
9932 
9933 template <typename Derived>
9934 OMPClause *
9935 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9936   llvm::SmallVector<Expr *, 16> Vars;
9937   Vars.reserve(C->varlist_size());
9938   for (auto *VE : C->varlists()) {
9939     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9940     if (EVar.isInvalid())
9941       return nullptr;
9942     Vars.push_back(EVar.get());
9943   }
9944   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9945                                              C->getLParenLoc(), C->getEndLoc());
9946 }
9947 
9948 template <typename Derived>
9949 OMPClause *
9950 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9951   llvm::SmallVector<Expr *, 16> Vars;
9952   Vars.reserve(C->varlist_size());
9953   for (auto *VE : C->varlists()) {
9954     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9955     if (EVar.isInvalid())
9956       return nullptr;
9957     Vars.push_back(EVar.get());
9958   }
9959   return getDerived().RebuildOMPCopyprivateClause(
9960       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9961 }
9962 
9963 template <typename Derived>
9964 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9965   llvm::SmallVector<Expr *, 16> Vars;
9966   Vars.reserve(C->varlist_size());
9967   for (auto *VE : C->varlists()) {
9968     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9969     if (EVar.isInvalid())
9970       return nullptr;
9971     Vars.push_back(EVar.get());
9972   }
9973   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9974                                             C->getLParenLoc(), C->getEndLoc());
9975 }
9976 
9977 template <typename Derived>
9978 OMPClause *
9979 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9980   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9981   if (E.isInvalid())
9982     return nullptr;
9983   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9984                                              C->getLParenLoc(), C->getEndLoc());
9985 }
9986 
9987 template <typename Derived>
9988 OMPClause *
9989 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9990   llvm::SmallVector<Expr *, 16> Vars;
9991   Expr *DepModifier = C->getModifier();
9992   if (DepModifier) {
9993     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9994     if (DepModRes.isInvalid())
9995       return nullptr;
9996     DepModifier = DepModRes.get();
9997   }
9998   Vars.reserve(C->varlist_size());
9999   for (auto *VE : C->varlists()) {
10000     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10001     if (EVar.isInvalid())
10002       return nullptr;
10003     Vars.push_back(EVar.get());
10004   }
10005   return getDerived().RebuildOMPDependClause(
10006       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
10007       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
10008       C->getEndLoc());
10009 }
10010 
10011 template <typename Derived>
10012 OMPClause *
10013 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
10014   ExprResult E = getDerived().TransformExpr(C->getDevice());
10015   if (E.isInvalid())
10016     return nullptr;
10017   return getDerived().RebuildOMPDeviceClause(
10018       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10019       C->getModifierLoc(), C->getEndLoc());
10020 }
10021 
10022 template <typename Derived, class T>
10023 bool transformOMPMappableExprListClause(
10024     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
10025     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
10026     DeclarationNameInfo &MapperIdInfo,
10027     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
10028   // Transform expressions in the list.
10029   Vars.reserve(C->varlist_size());
10030   for (auto *VE : C->varlists()) {
10031     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
10032     if (EVar.isInvalid())
10033       return true;
10034     Vars.push_back(EVar.get());
10035   }
10036   // Transform mapper scope specifier and identifier.
10037   NestedNameSpecifierLoc QualifierLoc;
10038   if (C->getMapperQualifierLoc()) {
10039     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
10040         C->getMapperQualifierLoc());
10041     if (!QualifierLoc)
10042       return true;
10043   }
10044   MapperIdScopeSpec.Adopt(QualifierLoc);
10045   MapperIdInfo = C->getMapperIdInfo();
10046   if (MapperIdInfo.getName()) {
10047     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10048     if (!MapperIdInfo.getName())
10049       return true;
10050   }
10051   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10052   // the previous user-defined mapper lookup in dependent environment.
10053   for (auto *E : C->mapperlists()) {
10054     // Transform all the decls.
10055     if (E) {
10056       auto *ULE = cast<UnresolvedLookupExpr>(E);
10057       UnresolvedSet<8> Decls;
10058       for (auto *D : ULE->decls()) {
10059         NamedDecl *InstD =
10060             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10061         Decls.addDecl(InstD, InstD->getAccess());
10062       }
10063       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10064           TT.getSema().Context, /*NamingClass=*/nullptr,
10065           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10066           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10067           Decls.end()));
10068     } else {
10069       UnresolvedMappers.push_back(nullptr);
10070     }
10071   }
10072   return false;
10073 }
10074 
10075 template <typename Derived>
10076 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10077   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10078   llvm::SmallVector<Expr *, 16> Vars;
10079   CXXScopeSpec MapperIdScopeSpec;
10080   DeclarationNameInfo MapperIdInfo;
10081   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10082   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10083           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10084     return nullptr;
10085   return getDerived().RebuildOMPMapClause(
10086       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
10087       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
10088       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10089 }
10090 
10091 template <typename Derived>
10092 OMPClause *
10093 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10094   Expr *Allocator = C->getAllocator();
10095   if (Allocator) {
10096     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10097     if (AllocatorRes.isInvalid())
10098       return nullptr;
10099     Allocator = AllocatorRes.get();
10100   }
10101   llvm::SmallVector<Expr *, 16> Vars;
10102   Vars.reserve(C->varlist_size());
10103   for (auto *VE : C->varlists()) {
10104     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10105     if (EVar.isInvalid())
10106       return nullptr;
10107     Vars.push_back(EVar.get());
10108   }
10109   return getDerived().RebuildOMPAllocateClause(
10110       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10111       C->getEndLoc());
10112 }
10113 
10114 template <typename Derived>
10115 OMPClause *
10116 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10117   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10118   if (E.isInvalid())
10119     return nullptr;
10120   return getDerived().RebuildOMPNumTeamsClause(
10121       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10122 }
10123 
10124 template <typename Derived>
10125 OMPClause *
10126 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10127   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10128   if (E.isInvalid())
10129     return nullptr;
10130   return getDerived().RebuildOMPThreadLimitClause(
10131       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10132 }
10133 
10134 template <typename Derived>
10135 OMPClause *
10136 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10137   ExprResult E = getDerived().TransformExpr(C->getPriority());
10138   if (E.isInvalid())
10139     return nullptr;
10140   return getDerived().RebuildOMPPriorityClause(
10141       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10142 }
10143 
10144 template <typename Derived>
10145 OMPClause *
10146 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10147   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10148   if (E.isInvalid())
10149     return nullptr;
10150   return getDerived().RebuildOMPGrainsizeClause(
10151       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10152 }
10153 
10154 template <typename Derived>
10155 OMPClause *
10156 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10157   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10158   if (E.isInvalid())
10159     return nullptr;
10160   return getDerived().RebuildOMPNumTasksClause(
10161       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10162 }
10163 
10164 template <typename Derived>
10165 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10166   ExprResult E = getDerived().TransformExpr(C->getHint());
10167   if (E.isInvalid())
10168     return nullptr;
10169   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10170                                            C->getLParenLoc(), C->getEndLoc());
10171 }
10172 
10173 template <typename Derived>
10174 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10175     OMPDistScheduleClause *C) {
10176   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10177   if (E.isInvalid())
10178     return nullptr;
10179   return getDerived().RebuildOMPDistScheduleClause(
10180       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10181       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10182 }
10183 
10184 template <typename Derived>
10185 OMPClause *
10186 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10187   // Rebuild Defaultmap Clause since we need to invoke the checking of
10188   // defaultmap(none:variable-category) after template initialization.
10189   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10190                                                  C->getDefaultmapKind(),
10191                                                  C->getBeginLoc(),
10192                                                  C->getLParenLoc(),
10193                                                  C->getDefaultmapModifierLoc(),
10194                                                  C->getDefaultmapKindLoc(),
10195                                                  C->getEndLoc());
10196 }
10197 
10198 template <typename Derived>
10199 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10200   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10201   llvm::SmallVector<Expr *, 16> Vars;
10202   CXXScopeSpec MapperIdScopeSpec;
10203   DeclarationNameInfo MapperIdInfo;
10204   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10205   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10206           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10207     return nullptr;
10208   return getDerived().RebuildOMPToClause(
10209       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10210       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10211 }
10212 
10213 template <typename Derived>
10214 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10215   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10216   llvm::SmallVector<Expr *, 16> Vars;
10217   CXXScopeSpec MapperIdScopeSpec;
10218   DeclarationNameInfo MapperIdInfo;
10219   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10220   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10221           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10222     return nullptr;
10223   return getDerived().RebuildOMPFromClause(
10224       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10225       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10226 }
10227 
10228 template <typename Derived>
10229 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10230     OMPUseDevicePtrClause *C) {
10231   llvm::SmallVector<Expr *, 16> Vars;
10232   Vars.reserve(C->varlist_size());
10233   for (auto *VE : C->varlists()) {
10234     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10235     if (EVar.isInvalid())
10236       return nullptr;
10237     Vars.push_back(EVar.get());
10238   }
10239   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10240   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10241 }
10242 
10243 template <typename Derived>
10244 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10245     OMPUseDeviceAddrClause *C) {
10246   llvm::SmallVector<Expr *, 16> Vars;
10247   Vars.reserve(C->varlist_size());
10248   for (auto *VE : C->varlists()) {
10249     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10250     if (EVar.isInvalid())
10251       return nullptr;
10252     Vars.push_back(EVar.get());
10253   }
10254   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10255   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10256 }
10257 
10258 template <typename Derived>
10259 OMPClause *
10260 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10261   llvm::SmallVector<Expr *, 16> Vars;
10262   Vars.reserve(C->varlist_size());
10263   for (auto *VE : C->varlists()) {
10264     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10265     if (EVar.isInvalid())
10266       return nullptr;
10267     Vars.push_back(EVar.get());
10268   }
10269   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10270   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10271 }
10272 
10273 template <typename Derived>
10274 OMPClause *
10275 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10276   llvm::SmallVector<Expr *, 16> Vars;
10277   Vars.reserve(C->varlist_size());
10278   for (auto *VE : C->varlists()) {
10279     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10280     if (EVar.isInvalid())
10281       return nullptr;
10282     Vars.push_back(EVar.get());
10283   }
10284   return getDerived().RebuildOMPNontemporalClause(
10285       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10286 }
10287 
10288 template <typename Derived>
10289 OMPClause *
10290 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10291   llvm::SmallVector<Expr *, 16> Vars;
10292   Vars.reserve(C->varlist_size());
10293   for (auto *VE : C->varlists()) {
10294     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10295     if (EVar.isInvalid())
10296       return nullptr;
10297     Vars.push_back(EVar.get());
10298   }
10299   return getDerived().RebuildOMPInclusiveClause(
10300       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10301 }
10302 
10303 template <typename Derived>
10304 OMPClause *
10305 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10306   llvm::SmallVector<Expr *, 16> Vars;
10307   Vars.reserve(C->varlist_size());
10308   for (auto *VE : C->varlists()) {
10309     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10310     if (EVar.isInvalid())
10311       return nullptr;
10312     Vars.push_back(EVar.get());
10313   }
10314   return getDerived().RebuildOMPExclusiveClause(
10315       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10316 }
10317 
10318 template <typename Derived>
10319 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10320     OMPUsesAllocatorsClause *C) {
10321   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10322   Data.reserve(C->getNumberOfAllocators());
10323   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10324     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10325     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10326     if (Allocator.isInvalid())
10327       continue;
10328     ExprResult AllocatorTraits;
10329     if (Expr *AT = D.AllocatorTraits) {
10330       AllocatorTraits = getDerived().TransformExpr(AT);
10331       if (AllocatorTraits.isInvalid())
10332         continue;
10333     }
10334     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10335     NewD.Allocator = Allocator.get();
10336     NewD.AllocatorTraits = AllocatorTraits.get();
10337     NewD.LParenLoc = D.LParenLoc;
10338     NewD.RParenLoc = D.RParenLoc;
10339   }
10340   return getDerived().RebuildOMPUsesAllocatorsClause(
10341       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10342 }
10343 
10344 template <typename Derived>
10345 OMPClause *
10346 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10347   SmallVector<Expr *, 4> Locators;
10348   Locators.reserve(C->varlist_size());
10349   ExprResult ModifierRes;
10350   if (Expr *Modifier = C->getModifier()) {
10351     ModifierRes = getDerived().TransformExpr(Modifier);
10352     if (ModifierRes.isInvalid())
10353       return nullptr;
10354   }
10355   for (Expr *E : C->varlists()) {
10356     ExprResult Locator = getDerived().TransformExpr(E);
10357     if (Locator.isInvalid())
10358       continue;
10359     Locators.push_back(Locator.get());
10360   }
10361   return getDerived().RebuildOMPAffinityClause(
10362       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10363       ModifierRes.get(), Locators);
10364 }
10365 
10366 template <typename Derived>
10367 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10368   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10369                                             C->getBeginLoc(), C->getLParenLoc(),
10370                                             C->getEndLoc());
10371 }
10372 
10373 template <typename Derived>
10374 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10375   return getDerived().RebuildOMPBindClause(
10376       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10377       C->getLParenLoc(), C->getEndLoc());
10378 }
10379 
10380 //===----------------------------------------------------------------------===//
10381 // Expression transformation
10382 //===----------------------------------------------------------------------===//
10383 template<typename Derived>
10384 ExprResult
10385 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10386   return TransformExpr(E->getSubExpr());
10387 }
10388 
10389 template <typename Derived>
10390 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10391     SYCLUniqueStableNameExpr *E) {
10392   if (!E->isTypeDependent())
10393     return E;
10394 
10395   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10396 
10397   if (!NewT)
10398     return ExprError();
10399 
10400   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10401     return E;
10402 
10403   return getDerived().RebuildSYCLUniqueStableNameExpr(
10404       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10405 }
10406 
10407 template<typename Derived>
10408 ExprResult
10409 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10410   if (!E->isTypeDependent())
10411     return E;
10412 
10413   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10414                                             E->getIdentKind());
10415 }
10416 
10417 template<typename Derived>
10418 ExprResult
10419 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10420   NestedNameSpecifierLoc QualifierLoc;
10421   if (E->getQualifierLoc()) {
10422     QualifierLoc
10423       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10424     if (!QualifierLoc)
10425       return ExprError();
10426   }
10427 
10428   ValueDecl *ND
10429     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10430                                                          E->getDecl()));
10431   if (!ND)
10432     return ExprError();
10433 
10434   NamedDecl *Found = ND;
10435   if (E->getFoundDecl() != E->getDecl()) {
10436     Found = cast_or_null<NamedDecl>(
10437         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10438     if (!Found)
10439       return ExprError();
10440   }
10441 
10442   DeclarationNameInfo NameInfo = E->getNameInfo();
10443   if (NameInfo.getName()) {
10444     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10445     if (!NameInfo.getName())
10446       return ExprError();
10447   }
10448 
10449   if (!getDerived().AlwaysRebuild() &&
10450       QualifierLoc == E->getQualifierLoc() &&
10451       ND == E->getDecl() &&
10452       Found == E->getFoundDecl() &&
10453       NameInfo.getName() == E->getDecl()->getDeclName() &&
10454       !E->hasExplicitTemplateArgs()) {
10455 
10456     // Mark it referenced in the new context regardless.
10457     // FIXME: this is a bit instantiation-specific.
10458     SemaRef.MarkDeclRefReferenced(E);
10459 
10460     return E;
10461   }
10462 
10463   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10464   if (E->hasExplicitTemplateArgs()) {
10465     TemplateArgs = &TransArgs;
10466     TransArgs.setLAngleLoc(E->getLAngleLoc());
10467     TransArgs.setRAngleLoc(E->getRAngleLoc());
10468     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10469                                                 E->getNumTemplateArgs(),
10470                                                 TransArgs))
10471       return ExprError();
10472   }
10473 
10474   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10475                                          Found, TemplateArgs);
10476 }
10477 
10478 template<typename Derived>
10479 ExprResult
10480 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10481   return E;
10482 }
10483 
10484 template <typename Derived>
10485 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10486     FixedPointLiteral *E) {
10487   return E;
10488 }
10489 
10490 template<typename Derived>
10491 ExprResult
10492 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10493   return E;
10494 }
10495 
10496 template<typename Derived>
10497 ExprResult
10498 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10499   return E;
10500 }
10501 
10502 template<typename Derived>
10503 ExprResult
10504 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10505   return E;
10506 }
10507 
10508 template<typename Derived>
10509 ExprResult
10510 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10511   return E;
10512 }
10513 
10514 template<typename Derived>
10515 ExprResult
10516 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10517   return getDerived().TransformCallExpr(E);
10518 }
10519 
10520 template<typename Derived>
10521 ExprResult
10522 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10523   ExprResult ControllingExpr =
10524     getDerived().TransformExpr(E->getControllingExpr());
10525   if (ControllingExpr.isInvalid())
10526     return ExprError();
10527 
10528   SmallVector<Expr *, 4> AssocExprs;
10529   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10530   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10531     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10532     if (TSI) {
10533       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10534       if (!AssocType)
10535         return ExprError();
10536       AssocTypes.push_back(AssocType);
10537     } else {
10538       AssocTypes.push_back(nullptr);
10539     }
10540 
10541     ExprResult AssocExpr =
10542         getDerived().TransformExpr(Assoc.getAssociationExpr());
10543     if (AssocExpr.isInvalid())
10544       return ExprError();
10545     AssocExprs.push_back(AssocExpr.get());
10546   }
10547 
10548   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10549                                                   E->getDefaultLoc(),
10550                                                   E->getRParenLoc(),
10551                                                   ControllingExpr.get(),
10552                                                   AssocTypes,
10553                                                   AssocExprs);
10554 }
10555 
10556 template<typename Derived>
10557 ExprResult
10558 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10559   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10560   if (SubExpr.isInvalid())
10561     return ExprError();
10562 
10563   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10564     return E;
10565 
10566   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10567                                        E->getRParen());
10568 }
10569 
10570 /// The operand of a unary address-of operator has special rules: it's
10571 /// allowed to refer to a non-static member of a class even if there's no 'this'
10572 /// object available.
10573 template<typename Derived>
10574 ExprResult
10575 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10576   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10577     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10578   else
10579     return getDerived().TransformExpr(E);
10580 }
10581 
10582 template<typename Derived>
10583 ExprResult
10584 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10585   ExprResult SubExpr;
10586   if (E->getOpcode() == UO_AddrOf)
10587     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10588   else
10589     SubExpr = TransformExpr(E->getSubExpr());
10590   if (SubExpr.isInvalid())
10591     return ExprError();
10592 
10593   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10594     return E;
10595 
10596   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10597                                            E->getOpcode(),
10598                                            SubExpr.get());
10599 }
10600 
10601 template<typename Derived>
10602 ExprResult
10603 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10604   // Transform the type.
10605   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10606   if (!Type)
10607     return ExprError();
10608 
10609   // Transform all of the components into components similar to what the
10610   // parser uses.
10611   // FIXME: It would be slightly more efficient in the non-dependent case to
10612   // just map FieldDecls, rather than requiring the rebuilder to look for
10613   // the fields again. However, __builtin_offsetof is rare enough in
10614   // template code that we don't care.
10615   bool ExprChanged = false;
10616   typedef Sema::OffsetOfComponent Component;
10617   SmallVector<Component, 4> Components;
10618   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10619     const OffsetOfNode &ON = E->getComponent(I);
10620     Component Comp;
10621     Comp.isBrackets = true;
10622     Comp.LocStart = ON.getSourceRange().getBegin();
10623     Comp.LocEnd = ON.getSourceRange().getEnd();
10624     switch (ON.getKind()) {
10625     case OffsetOfNode::Array: {
10626       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10627       ExprResult Index = getDerived().TransformExpr(FromIndex);
10628       if (Index.isInvalid())
10629         return ExprError();
10630 
10631       ExprChanged = ExprChanged || Index.get() != FromIndex;
10632       Comp.isBrackets = true;
10633       Comp.U.E = Index.get();
10634       break;
10635     }
10636 
10637     case OffsetOfNode::Field:
10638     case OffsetOfNode::Identifier:
10639       Comp.isBrackets = false;
10640       Comp.U.IdentInfo = ON.getFieldName();
10641       if (!Comp.U.IdentInfo)
10642         continue;
10643 
10644       break;
10645 
10646     case OffsetOfNode::Base:
10647       // Will be recomputed during the rebuild.
10648       continue;
10649     }
10650 
10651     Components.push_back(Comp);
10652   }
10653 
10654   // If nothing changed, retain the existing expression.
10655   if (!getDerived().AlwaysRebuild() &&
10656       Type == E->getTypeSourceInfo() &&
10657       !ExprChanged)
10658     return E;
10659 
10660   // Build a new offsetof expression.
10661   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10662                                           Components, E->getRParenLoc());
10663 }
10664 
10665 template<typename Derived>
10666 ExprResult
10667 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10668   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10669          "opaque value expression requires transformation");
10670   return E;
10671 }
10672 
10673 template<typename Derived>
10674 ExprResult
10675 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10676   return E;
10677 }
10678 
10679 template <typename Derived>
10680 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10681   llvm::SmallVector<Expr *, 8> Children;
10682   bool Changed = false;
10683   for (Expr *C : E->subExpressions()) {
10684     ExprResult NewC = getDerived().TransformExpr(C);
10685     if (NewC.isInvalid())
10686       return ExprError();
10687     Children.push_back(NewC.get());
10688 
10689     Changed |= NewC.get() != C;
10690   }
10691   if (!getDerived().AlwaysRebuild() && !Changed)
10692     return E;
10693   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10694                                           Children, E->getType());
10695 }
10696 
10697 template<typename Derived>
10698 ExprResult
10699 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10700   // Rebuild the syntactic form.  The original syntactic form has
10701   // opaque-value expressions in it, so strip those away and rebuild
10702   // the result.  This is a really awful way of doing this, but the
10703   // better solution (rebuilding the semantic expressions and
10704   // rebinding OVEs as necessary) doesn't work; we'd need
10705   // TreeTransform to not strip away implicit conversions.
10706   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10707   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10708   if (result.isInvalid()) return ExprError();
10709 
10710   // If that gives us a pseudo-object result back, the pseudo-object
10711   // expression must have been an lvalue-to-rvalue conversion which we
10712   // should reapply.
10713   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10714     result = SemaRef.checkPseudoObjectRValue(result.get());
10715 
10716   return result;
10717 }
10718 
10719 template<typename Derived>
10720 ExprResult
10721 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10722                                                 UnaryExprOrTypeTraitExpr *E) {
10723   if (E->isArgumentType()) {
10724     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10725 
10726     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10727     if (!NewT)
10728       return ExprError();
10729 
10730     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10731       return E;
10732 
10733     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10734                                                     E->getKind(),
10735                                                     E->getSourceRange());
10736   }
10737 
10738   // C++0x [expr.sizeof]p1:
10739   //   The operand is either an expression, which is an unevaluated operand
10740   //   [...]
10741   EnterExpressionEvaluationContext Unevaluated(
10742       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10743       Sema::ReuseLambdaContextDecl);
10744 
10745   // Try to recover if we have something like sizeof(T::X) where X is a type.
10746   // Notably, there must be *exactly* one set of parens if X is a type.
10747   TypeSourceInfo *RecoveryTSI = nullptr;
10748   ExprResult SubExpr;
10749   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10750   if (auto *DRE =
10751           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10752     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10753         PE, DRE, false, &RecoveryTSI);
10754   else
10755     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10756 
10757   if (RecoveryTSI) {
10758     return getDerived().RebuildUnaryExprOrTypeTrait(
10759         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10760   } else if (SubExpr.isInvalid())
10761     return ExprError();
10762 
10763   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10764     return E;
10765 
10766   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10767                                                   E->getOperatorLoc(),
10768                                                   E->getKind(),
10769                                                   E->getSourceRange());
10770 }
10771 
10772 template<typename Derived>
10773 ExprResult
10774 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10775   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10776   if (LHS.isInvalid())
10777     return ExprError();
10778 
10779   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10780   if (RHS.isInvalid())
10781     return ExprError();
10782 
10783 
10784   if (!getDerived().AlwaysRebuild() &&
10785       LHS.get() == E->getLHS() &&
10786       RHS.get() == E->getRHS())
10787     return E;
10788 
10789   return getDerived().RebuildArraySubscriptExpr(
10790       LHS.get(),
10791       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10792 }
10793 
10794 template <typename Derived>
10795 ExprResult
10796 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10797   ExprResult Base = getDerived().TransformExpr(E->getBase());
10798   if (Base.isInvalid())
10799     return ExprError();
10800 
10801   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10802   if (RowIdx.isInvalid())
10803     return ExprError();
10804 
10805   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10806   if (ColumnIdx.isInvalid())
10807     return ExprError();
10808 
10809   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10810       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10811     return E;
10812 
10813   return getDerived().RebuildMatrixSubscriptExpr(
10814       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10815 }
10816 
10817 template <typename Derived>
10818 ExprResult
10819 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10820   ExprResult Base = getDerived().TransformExpr(E->getBase());
10821   if (Base.isInvalid())
10822     return ExprError();
10823 
10824   ExprResult LowerBound;
10825   if (E->getLowerBound()) {
10826     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10827     if (LowerBound.isInvalid())
10828       return ExprError();
10829   }
10830 
10831   ExprResult Length;
10832   if (E->getLength()) {
10833     Length = getDerived().TransformExpr(E->getLength());
10834     if (Length.isInvalid())
10835       return ExprError();
10836   }
10837 
10838   ExprResult Stride;
10839   if (Expr *Str = E->getStride()) {
10840     Stride = getDerived().TransformExpr(Str);
10841     if (Stride.isInvalid())
10842       return ExprError();
10843   }
10844 
10845   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10846       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10847     return E;
10848 
10849   return getDerived().RebuildOMPArraySectionExpr(
10850       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10851       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10852       E->getRBracketLoc());
10853 }
10854 
10855 template <typename Derived>
10856 ExprResult
10857 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10858   ExprResult Base = getDerived().TransformExpr(E->getBase());
10859   if (Base.isInvalid())
10860     return ExprError();
10861 
10862   SmallVector<Expr *, 4> Dims;
10863   bool ErrorFound = false;
10864   for (Expr *Dim : E->getDimensions()) {
10865     ExprResult DimRes = getDerived().TransformExpr(Dim);
10866     if (DimRes.isInvalid()) {
10867       ErrorFound = true;
10868       continue;
10869     }
10870     Dims.push_back(DimRes.get());
10871   }
10872 
10873   if (ErrorFound)
10874     return ExprError();
10875   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10876                                                  E->getRParenLoc(), Dims,
10877                                                  E->getBracketsRanges());
10878 }
10879 
10880 template <typename Derived>
10881 ExprResult
10882 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10883   unsigned NumIterators = E->numOfIterators();
10884   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10885 
10886   bool ErrorFound = false;
10887   bool NeedToRebuild = getDerived().AlwaysRebuild();
10888   for (unsigned I = 0; I < NumIterators; ++I) {
10889     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10890     Data[I].DeclIdent = D->getIdentifier();
10891     Data[I].DeclIdentLoc = D->getLocation();
10892     if (D->getLocation() == D->getBeginLoc()) {
10893       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10894              "Implicit type must be int.");
10895     } else {
10896       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10897       QualType DeclTy = getDerived().TransformType(D->getType());
10898       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10899     }
10900     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10901     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10902     ExprResult End = getDerived().TransformExpr(Range.End);
10903     ExprResult Step = getDerived().TransformExpr(Range.Step);
10904     ErrorFound = ErrorFound ||
10905                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10906                                                !Data[I].Type.get().isNull())) ||
10907                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10908     if (ErrorFound)
10909       continue;
10910     Data[I].Range.Begin = Begin.get();
10911     Data[I].Range.End = End.get();
10912     Data[I].Range.Step = Step.get();
10913     Data[I].AssignLoc = E->getAssignLoc(I);
10914     Data[I].ColonLoc = E->getColonLoc(I);
10915     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10916     NeedToRebuild =
10917         NeedToRebuild ||
10918         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10919                                        D->getType().getTypePtrOrNull()) ||
10920         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10921         Range.Step != Data[I].Range.Step;
10922   }
10923   if (ErrorFound)
10924     return ExprError();
10925   if (!NeedToRebuild)
10926     return E;
10927 
10928   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10929       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10930   if (!Res.isUsable())
10931     return Res;
10932   auto *IE = cast<OMPIteratorExpr>(Res.get());
10933   for (unsigned I = 0; I < NumIterators; ++I)
10934     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10935                                       IE->getIteratorDecl(I));
10936   return Res;
10937 }
10938 
10939 template<typename Derived>
10940 ExprResult
10941 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10942   // Transform the callee.
10943   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10944   if (Callee.isInvalid())
10945     return ExprError();
10946 
10947   // Transform arguments.
10948   bool ArgChanged = false;
10949   SmallVector<Expr*, 8> Args;
10950   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10951                                   &ArgChanged))
10952     return ExprError();
10953 
10954   if (!getDerived().AlwaysRebuild() &&
10955       Callee.get() == E->getCallee() &&
10956       !ArgChanged)
10957     return SemaRef.MaybeBindToTemporary(E);
10958 
10959   // FIXME: Wrong source location information for the '('.
10960   SourceLocation FakeLParenLoc
10961     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10962 
10963   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10964   if (E->hasStoredFPFeatures()) {
10965     FPOptionsOverride NewOverrides = E->getFPFeatures();
10966     getSema().CurFPFeatures =
10967         NewOverrides.applyOverrides(getSema().getLangOpts());
10968     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10969   }
10970 
10971   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10972                                       Args,
10973                                       E->getRParenLoc());
10974 }
10975 
10976 template<typename Derived>
10977 ExprResult
10978 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10979   ExprResult Base = getDerived().TransformExpr(E->getBase());
10980   if (Base.isInvalid())
10981     return ExprError();
10982 
10983   NestedNameSpecifierLoc QualifierLoc;
10984   if (E->hasQualifier()) {
10985     QualifierLoc
10986       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10987 
10988     if (!QualifierLoc)
10989       return ExprError();
10990   }
10991   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10992 
10993   ValueDecl *Member
10994     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10995                                                          E->getMemberDecl()));
10996   if (!Member)
10997     return ExprError();
10998 
10999   NamedDecl *FoundDecl = E->getFoundDecl();
11000   if (FoundDecl == E->getMemberDecl()) {
11001     FoundDecl = Member;
11002   } else {
11003     FoundDecl = cast_or_null<NamedDecl>(
11004                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
11005     if (!FoundDecl)
11006       return ExprError();
11007   }
11008 
11009   if (!getDerived().AlwaysRebuild() &&
11010       Base.get() == E->getBase() &&
11011       QualifierLoc == E->getQualifierLoc() &&
11012       Member == E->getMemberDecl() &&
11013       FoundDecl == E->getFoundDecl() &&
11014       !E->hasExplicitTemplateArgs()) {
11015 
11016     // Mark it referenced in the new context regardless.
11017     // FIXME: this is a bit instantiation-specific.
11018     SemaRef.MarkMemberReferenced(E);
11019 
11020     return E;
11021   }
11022 
11023   TemplateArgumentListInfo TransArgs;
11024   if (E->hasExplicitTemplateArgs()) {
11025     TransArgs.setLAngleLoc(E->getLAngleLoc());
11026     TransArgs.setRAngleLoc(E->getRAngleLoc());
11027     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11028                                                 E->getNumTemplateArgs(),
11029                                                 TransArgs))
11030       return ExprError();
11031   }
11032 
11033   // FIXME: Bogus source location for the operator
11034   SourceLocation FakeOperatorLoc =
11035       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
11036 
11037   // FIXME: to do this check properly, we will need to preserve the
11038   // first-qualifier-in-scope here, just in case we had a dependent
11039   // base (and therefore couldn't do the check) and a
11040   // nested-name-qualifier (and therefore could do the lookup).
11041   NamedDecl *FirstQualifierInScope = nullptr;
11042   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
11043   if (MemberNameInfo.getName()) {
11044     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11045     if (!MemberNameInfo.getName())
11046       return ExprError();
11047   }
11048 
11049   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11050                                         E->isArrow(),
11051                                         QualifierLoc,
11052                                         TemplateKWLoc,
11053                                         MemberNameInfo,
11054                                         Member,
11055                                         FoundDecl,
11056                                         (E->hasExplicitTemplateArgs()
11057                                            ? &TransArgs : nullptr),
11058                                         FirstQualifierInScope);
11059 }
11060 
11061 template<typename Derived>
11062 ExprResult
11063 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11064   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11065   if (LHS.isInvalid())
11066     return ExprError();
11067 
11068   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11069   if (RHS.isInvalid())
11070     return ExprError();
11071 
11072   if (!getDerived().AlwaysRebuild() &&
11073       LHS.get() == E->getLHS() &&
11074       RHS.get() == E->getRHS())
11075     return E;
11076 
11077   if (E->isCompoundAssignmentOp())
11078     // FPFeatures has already been established from trailing storage
11079     return getDerived().RebuildBinaryOperator(
11080         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11081   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11082   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11083   getSema().CurFPFeatures =
11084       NewOverrides.applyOverrides(getSema().getLangOpts());
11085   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11086   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11087                                             LHS.get(), RHS.get());
11088 }
11089 
11090 template <typename Derived>
11091 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11092     CXXRewrittenBinaryOperator *E) {
11093   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11094 
11095   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11096   if (LHS.isInvalid())
11097     return ExprError();
11098 
11099   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11100   if (RHS.isInvalid())
11101     return ExprError();
11102 
11103   // Extract the already-resolved callee declarations so that we can restrict
11104   // ourselves to using them as the unqualified lookup results when rebuilding.
11105   UnresolvedSet<2> UnqualLookups;
11106   bool ChangedAnyLookups = false;
11107   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11108                             const_cast<Expr *>(Decomp.InnerBinOp)};
11109   for (Expr *PossibleBinOp : PossibleBinOps) {
11110     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11111     if (!Op)
11112       continue;
11113     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11114     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11115       continue;
11116 
11117     // Transform the callee in case we built a call to a local extern
11118     // declaration.
11119     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11120         E->getOperatorLoc(), Callee->getFoundDecl()));
11121     if (!Found)
11122       return ExprError();
11123     if (Found != Callee->getFoundDecl())
11124       ChangedAnyLookups = true;
11125     UnqualLookups.addDecl(Found);
11126   }
11127 
11128   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11129       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11130     // Mark all functions used in the rewrite as referenced. Note that when
11131     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11132     // function calls, and/or there might be a user-defined conversion sequence
11133     // applied to the operands of the <.
11134     // FIXME: this is a bit instantiation-specific.
11135     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11136     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11137     return E;
11138   }
11139 
11140   return getDerived().RebuildCXXRewrittenBinaryOperator(
11141       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11142 }
11143 
11144 template<typename Derived>
11145 ExprResult
11146 TreeTransform<Derived>::TransformCompoundAssignOperator(
11147                                                       CompoundAssignOperator *E) {
11148   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11149   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11150   getSema().CurFPFeatures =
11151       NewOverrides.applyOverrides(getSema().getLangOpts());
11152   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11153   return getDerived().TransformBinaryOperator(E);
11154 }
11155 
11156 template<typename Derived>
11157 ExprResult TreeTransform<Derived>::
11158 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11159   // Just rebuild the common and RHS expressions and see whether we
11160   // get any changes.
11161 
11162   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11163   if (commonExpr.isInvalid())
11164     return ExprError();
11165 
11166   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11167   if (rhs.isInvalid())
11168     return ExprError();
11169 
11170   if (!getDerived().AlwaysRebuild() &&
11171       commonExpr.get() == e->getCommon() &&
11172       rhs.get() == e->getFalseExpr())
11173     return e;
11174 
11175   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11176                                                  e->getQuestionLoc(),
11177                                                  nullptr,
11178                                                  e->getColonLoc(),
11179                                                  rhs.get());
11180 }
11181 
11182 template<typename Derived>
11183 ExprResult
11184 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11185   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11186   if (Cond.isInvalid())
11187     return ExprError();
11188 
11189   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11190   if (LHS.isInvalid())
11191     return ExprError();
11192 
11193   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11194   if (RHS.isInvalid())
11195     return ExprError();
11196 
11197   if (!getDerived().AlwaysRebuild() &&
11198       Cond.get() == E->getCond() &&
11199       LHS.get() == E->getLHS() &&
11200       RHS.get() == E->getRHS())
11201     return E;
11202 
11203   return getDerived().RebuildConditionalOperator(Cond.get(),
11204                                                  E->getQuestionLoc(),
11205                                                  LHS.get(),
11206                                                  E->getColonLoc(),
11207                                                  RHS.get());
11208 }
11209 
11210 template<typename Derived>
11211 ExprResult
11212 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11213   // Implicit casts are eliminated during transformation, since they
11214   // will be recomputed by semantic analysis after transformation.
11215   return getDerived().TransformExpr(E->getSubExprAsWritten());
11216 }
11217 
11218 template<typename Derived>
11219 ExprResult
11220 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11221   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11222   if (!Type)
11223     return ExprError();
11224 
11225   ExprResult SubExpr
11226     = getDerived().TransformExpr(E->getSubExprAsWritten());
11227   if (SubExpr.isInvalid())
11228     return ExprError();
11229 
11230   if (!getDerived().AlwaysRebuild() &&
11231       Type == E->getTypeInfoAsWritten() &&
11232       SubExpr.get() == E->getSubExpr())
11233     return E;
11234 
11235   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11236                                             Type,
11237                                             E->getRParenLoc(),
11238                                             SubExpr.get());
11239 }
11240 
11241 template<typename Derived>
11242 ExprResult
11243 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11244   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11245   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11246   if (!NewT)
11247     return ExprError();
11248 
11249   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11250   if (Init.isInvalid())
11251     return ExprError();
11252 
11253   if (!getDerived().AlwaysRebuild() &&
11254       OldT == NewT &&
11255       Init.get() == E->getInitializer())
11256     return SemaRef.MaybeBindToTemporary(E);
11257 
11258   // Note: the expression type doesn't necessarily match the
11259   // type-as-written, but that's okay, because it should always be
11260   // derivable from the initializer.
11261 
11262   return getDerived().RebuildCompoundLiteralExpr(
11263       E->getLParenLoc(), NewT,
11264       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11265 }
11266 
11267 template<typename Derived>
11268 ExprResult
11269 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11270   ExprResult Base = getDerived().TransformExpr(E->getBase());
11271   if (Base.isInvalid())
11272     return ExprError();
11273 
11274   if (!getDerived().AlwaysRebuild() &&
11275       Base.get() == E->getBase())
11276     return E;
11277 
11278   // FIXME: Bad source location
11279   SourceLocation FakeOperatorLoc =
11280       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11281   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11282                                                   E->getAccessorLoc(),
11283                                                   E->getAccessor());
11284 }
11285 
11286 template<typename Derived>
11287 ExprResult
11288 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11289   if (InitListExpr *Syntactic = E->getSyntacticForm())
11290     E = Syntactic;
11291 
11292   bool InitChanged = false;
11293 
11294   EnterExpressionEvaluationContext Context(
11295       getSema(), EnterExpressionEvaluationContext::InitList);
11296 
11297   SmallVector<Expr*, 4> Inits;
11298   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11299                                   Inits, &InitChanged))
11300     return ExprError();
11301 
11302   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11303     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11304     // in some cases. We can't reuse it in general, because the syntactic and
11305     // semantic forms are linked, and we can't know that semantic form will
11306     // match even if the syntactic form does.
11307   }
11308 
11309   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11310                                       E->getRBraceLoc());
11311 }
11312 
11313 template<typename Derived>
11314 ExprResult
11315 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11316   Designation Desig;
11317 
11318   // transform the initializer value
11319   ExprResult Init = getDerived().TransformExpr(E->getInit());
11320   if (Init.isInvalid())
11321     return ExprError();
11322 
11323   // transform the designators.
11324   SmallVector<Expr*, 4> ArrayExprs;
11325   bool ExprChanged = false;
11326   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11327     if (D.isFieldDesignator()) {
11328       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11329                                                D.getDotLoc(),
11330                                                D.getFieldLoc()));
11331       if (D.getField()) {
11332         FieldDecl *Field = cast_or_null<FieldDecl>(
11333             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11334         if (Field != D.getField())
11335           // Rebuild the expression when the transformed FieldDecl is
11336           // different to the already assigned FieldDecl.
11337           ExprChanged = true;
11338       } else {
11339         // Ensure that the designator expression is rebuilt when there isn't
11340         // a resolved FieldDecl in the designator as we don't want to assign
11341         // a FieldDecl to a pattern designator that will be instantiated again.
11342         ExprChanged = true;
11343       }
11344       continue;
11345     }
11346 
11347     if (D.isArrayDesignator()) {
11348       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11349       if (Index.isInvalid())
11350         return ExprError();
11351 
11352       Desig.AddDesignator(
11353           Designator::getArray(Index.get(), D.getLBracketLoc()));
11354 
11355       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11356       ArrayExprs.push_back(Index.get());
11357       continue;
11358     }
11359 
11360     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11361     ExprResult Start
11362       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11363     if (Start.isInvalid())
11364       return ExprError();
11365 
11366     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11367     if (End.isInvalid())
11368       return ExprError();
11369 
11370     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11371                                                   End.get(),
11372                                                   D.getLBracketLoc(),
11373                                                   D.getEllipsisLoc()));
11374 
11375     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11376                   End.get() != E->getArrayRangeEnd(D);
11377 
11378     ArrayExprs.push_back(Start.get());
11379     ArrayExprs.push_back(End.get());
11380   }
11381 
11382   if (!getDerived().AlwaysRebuild() &&
11383       Init.get() == E->getInit() &&
11384       !ExprChanged)
11385     return E;
11386 
11387   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11388                                                 E->getEqualOrColonLoc(),
11389                                                 E->usesGNUSyntax(), Init.get());
11390 }
11391 
11392 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11393 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11394 template<typename Derived>
11395 ExprResult
11396 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11397     DesignatedInitUpdateExpr *E) {
11398   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11399                    "initializer");
11400   return ExprError();
11401 }
11402 
11403 template<typename Derived>
11404 ExprResult
11405 TreeTransform<Derived>::TransformNoInitExpr(
11406     NoInitExpr *E) {
11407   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11408   return ExprError();
11409 }
11410 
11411 template<typename Derived>
11412 ExprResult
11413 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11414   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11415   return ExprError();
11416 }
11417 
11418 template<typename Derived>
11419 ExprResult
11420 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11421   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11422   return ExprError();
11423 }
11424 
11425 template<typename Derived>
11426 ExprResult
11427 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11428                                                      ImplicitValueInitExpr *E) {
11429   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11430 
11431   // FIXME: Will we ever have proper type location here? Will we actually
11432   // need to transform the type?
11433   QualType T = getDerived().TransformType(E->getType());
11434   if (T.isNull())
11435     return ExprError();
11436 
11437   if (!getDerived().AlwaysRebuild() &&
11438       T == E->getType())
11439     return E;
11440 
11441   return getDerived().RebuildImplicitValueInitExpr(T);
11442 }
11443 
11444 template<typename Derived>
11445 ExprResult
11446 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11447   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11448   if (!TInfo)
11449     return ExprError();
11450 
11451   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11452   if (SubExpr.isInvalid())
11453     return ExprError();
11454 
11455   if (!getDerived().AlwaysRebuild() &&
11456       TInfo == E->getWrittenTypeInfo() &&
11457       SubExpr.get() == E->getSubExpr())
11458     return E;
11459 
11460   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11461                                        TInfo, E->getRParenLoc());
11462 }
11463 
11464 template<typename Derived>
11465 ExprResult
11466 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11467   bool ArgumentChanged = false;
11468   SmallVector<Expr*, 4> Inits;
11469   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11470                      &ArgumentChanged))
11471     return ExprError();
11472 
11473   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11474                                            Inits,
11475                                            E->getRParenLoc());
11476 }
11477 
11478 /// Transform an address-of-label expression.
11479 ///
11480 /// By default, the transformation of an address-of-label expression always
11481 /// rebuilds the expression, so that the label identifier can be resolved to
11482 /// the corresponding label statement by semantic analysis.
11483 template<typename Derived>
11484 ExprResult
11485 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11486   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11487                                         E->getLabel());
11488   if (!LD)
11489     return ExprError();
11490 
11491   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11492                                            cast<LabelDecl>(LD));
11493 }
11494 
11495 template<typename Derived>
11496 ExprResult
11497 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11498   SemaRef.ActOnStartStmtExpr();
11499   StmtResult SubStmt
11500     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11501   if (SubStmt.isInvalid()) {
11502     SemaRef.ActOnStmtExprError();
11503     return ExprError();
11504   }
11505 
11506   unsigned OldDepth = E->getTemplateDepth();
11507   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11508 
11509   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11510       SubStmt.get() == E->getSubStmt()) {
11511     // Calling this an 'error' is unintuitive, but it does the right thing.
11512     SemaRef.ActOnStmtExprError();
11513     return SemaRef.MaybeBindToTemporary(E);
11514   }
11515 
11516   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11517                                       E->getRParenLoc(), NewDepth);
11518 }
11519 
11520 template<typename Derived>
11521 ExprResult
11522 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11523   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11524   if (Cond.isInvalid())
11525     return ExprError();
11526 
11527   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11528   if (LHS.isInvalid())
11529     return ExprError();
11530 
11531   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11532   if (RHS.isInvalid())
11533     return ExprError();
11534 
11535   if (!getDerived().AlwaysRebuild() &&
11536       Cond.get() == E->getCond() &&
11537       LHS.get() == E->getLHS() &&
11538       RHS.get() == E->getRHS())
11539     return E;
11540 
11541   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11542                                         Cond.get(), LHS.get(), RHS.get(),
11543                                         E->getRParenLoc());
11544 }
11545 
11546 template<typename Derived>
11547 ExprResult
11548 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11549   return E;
11550 }
11551 
11552 template<typename Derived>
11553 ExprResult
11554 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11555   switch (E->getOperator()) {
11556   case OO_New:
11557   case OO_Delete:
11558   case OO_Array_New:
11559   case OO_Array_Delete:
11560     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11561 
11562   case OO_Subscript:
11563   case OO_Call: {
11564     // This is a call to an object's operator().
11565     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11566 
11567     // Transform the object itself.
11568     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11569     if (Object.isInvalid())
11570       return ExprError();
11571 
11572     // FIXME: Poor location information
11573     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11574         static_cast<Expr *>(Object.get())->getEndLoc());
11575 
11576     // Transform the call arguments.
11577     SmallVector<Expr*, 8> Args;
11578     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11579                                     Args))
11580       return ExprError();
11581 
11582     if (E->getOperator() == OO_Subscript)
11583       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11584                                                   Args, E->getEndLoc());
11585 
11586     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11587                                         E->getEndLoc());
11588   }
11589 
11590 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11591   case OO_##Name:                                                              \
11592     break;
11593 
11594 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11595 #include "clang/Basic/OperatorKinds.def"
11596 
11597   case OO_Conditional:
11598     llvm_unreachable("conditional operator is not actually overloadable");
11599 
11600   case OO_None:
11601   case NUM_OVERLOADED_OPERATORS:
11602     llvm_unreachable("not an overloaded operator?");
11603   }
11604 
11605   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11606   if (Callee.isInvalid())
11607     return ExprError();
11608 
11609   ExprResult First;
11610   if (E->getOperator() == OO_Amp)
11611     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11612   else
11613     First = getDerived().TransformExpr(E->getArg(0));
11614   if (First.isInvalid())
11615     return ExprError();
11616 
11617   ExprResult Second;
11618   if (E->getNumArgs() == 2) {
11619     Second = getDerived().TransformExpr(E->getArg(1));
11620     if (Second.isInvalid())
11621       return ExprError();
11622   }
11623 
11624   if (!getDerived().AlwaysRebuild() &&
11625       Callee.get() == E->getCallee() &&
11626       First.get() == E->getArg(0) &&
11627       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11628     return SemaRef.MaybeBindToTemporary(E);
11629 
11630   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11631   FPOptionsOverride NewOverrides(E->getFPFeatures());
11632   getSema().CurFPFeatures =
11633       NewOverrides.applyOverrides(getSema().getLangOpts());
11634   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11635 
11636   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11637                                                  E->getOperatorLoc(),
11638                                                  Callee.get(),
11639                                                  First.get(),
11640                                                  Second.get());
11641 }
11642 
11643 template<typename Derived>
11644 ExprResult
11645 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11646   return getDerived().TransformCallExpr(E);
11647 }
11648 
11649 template <typename Derived>
11650 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11651   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11652                          getSema().CurContext != E->getParentContext();
11653 
11654   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11655     return E;
11656 
11657   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
11658                                            E->getBeginLoc(), E->getEndLoc(),
11659                                            getSema().CurContext);
11660 }
11661 
11662 template<typename Derived>
11663 ExprResult
11664 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11665   // Transform the callee.
11666   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11667   if (Callee.isInvalid())
11668     return ExprError();
11669 
11670   // Transform exec config.
11671   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11672   if (EC.isInvalid())
11673     return ExprError();
11674 
11675   // Transform arguments.
11676   bool ArgChanged = false;
11677   SmallVector<Expr*, 8> Args;
11678   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11679                                   &ArgChanged))
11680     return ExprError();
11681 
11682   if (!getDerived().AlwaysRebuild() &&
11683       Callee.get() == E->getCallee() &&
11684       !ArgChanged)
11685     return SemaRef.MaybeBindToTemporary(E);
11686 
11687   // FIXME: Wrong source location information for the '('.
11688   SourceLocation FakeLParenLoc
11689     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11690   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11691                                       Args,
11692                                       E->getRParenLoc(), EC.get());
11693 }
11694 
11695 template<typename Derived>
11696 ExprResult
11697 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11698   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11699   if (!Type)
11700     return ExprError();
11701 
11702   ExprResult SubExpr
11703     = getDerived().TransformExpr(E->getSubExprAsWritten());
11704   if (SubExpr.isInvalid())
11705     return ExprError();
11706 
11707   if (!getDerived().AlwaysRebuild() &&
11708       Type == E->getTypeInfoAsWritten() &&
11709       SubExpr.get() == E->getSubExpr())
11710     return E;
11711   return getDerived().RebuildCXXNamedCastExpr(
11712       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11713       Type, E->getAngleBrackets().getEnd(),
11714       // FIXME. this should be '(' location
11715       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11716 }
11717 
11718 template<typename Derived>
11719 ExprResult
11720 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11721   TypeSourceInfo *TSI =
11722       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11723   if (!TSI)
11724     return ExprError();
11725 
11726   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11727   if (Sub.isInvalid())
11728     return ExprError();
11729 
11730   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11731                                                 Sub.get(), BCE->getEndLoc());
11732 }
11733 
11734 template<typename Derived>
11735 ExprResult
11736 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11737   return getDerived().TransformCXXNamedCastExpr(E);
11738 }
11739 
11740 template<typename Derived>
11741 ExprResult
11742 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11743   return getDerived().TransformCXXNamedCastExpr(E);
11744 }
11745 
11746 template<typename Derived>
11747 ExprResult
11748 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11749                                                       CXXReinterpretCastExpr *E) {
11750   return getDerived().TransformCXXNamedCastExpr(E);
11751 }
11752 
11753 template<typename Derived>
11754 ExprResult
11755 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11756   return getDerived().TransformCXXNamedCastExpr(E);
11757 }
11758 
11759 template<typename Derived>
11760 ExprResult
11761 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11762   return getDerived().TransformCXXNamedCastExpr(E);
11763 }
11764 
11765 template<typename Derived>
11766 ExprResult
11767 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11768                                                      CXXFunctionalCastExpr *E) {
11769   TypeSourceInfo *Type =
11770       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11771   if (!Type)
11772     return ExprError();
11773 
11774   ExprResult SubExpr
11775     = getDerived().TransformExpr(E->getSubExprAsWritten());
11776   if (SubExpr.isInvalid())
11777     return ExprError();
11778 
11779   if (!getDerived().AlwaysRebuild() &&
11780       Type == E->getTypeInfoAsWritten() &&
11781       SubExpr.get() == E->getSubExpr())
11782     return E;
11783 
11784   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11785                                                    E->getLParenLoc(),
11786                                                    SubExpr.get(),
11787                                                    E->getRParenLoc(),
11788                                                    E->isListInitialization());
11789 }
11790 
11791 template<typename Derived>
11792 ExprResult
11793 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11794   if (E->isTypeOperand()) {
11795     TypeSourceInfo *TInfo
11796       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11797     if (!TInfo)
11798       return ExprError();
11799 
11800     if (!getDerived().AlwaysRebuild() &&
11801         TInfo == E->getTypeOperandSourceInfo())
11802       return E;
11803 
11804     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11805                                              TInfo, E->getEndLoc());
11806   }
11807 
11808   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11809   // type.  We must not unilaterally enter unevaluated context here, as then
11810   // semantic processing can re-transform an already transformed operand.
11811   Expr *Op = E->getExprOperand();
11812   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11813   if (E->isGLValue())
11814     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11815       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11816         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11817 
11818   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11819                                                Sema::ReuseLambdaContextDecl);
11820 
11821   ExprResult SubExpr = getDerived().TransformExpr(Op);
11822   if (SubExpr.isInvalid())
11823     return ExprError();
11824 
11825   if (!getDerived().AlwaysRebuild() &&
11826       SubExpr.get() == E->getExprOperand())
11827     return E;
11828 
11829   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11830                                            SubExpr.get(), E->getEndLoc());
11831 }
11832 
11833 template<typename Derived>
11834 ExprResult
11835 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11836   if (E->isTypeOperand()) {
11837     TypeSourceInfo *TInfo
11838       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11839     if (!TInfo)
11840       return ExprError();
11841 
11842     if (!getDerived().AlwaysRebuild() &&
11843         TInfo == E->getTypeOperandSourceInfo())
11844       return E;
11845 
11846     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11847                                              TInfo, E->getEndLoc());
11848   }
11849 
11850   EnterExpressionEvaluationContext Unevaluated(
11851       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11852 
11853   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11854   if (SubExpr.isInvalid())
11855     return ExprError();
11856 
11857   if (!getDerived().AlwaysRebuild() &&
11858       SubExpr.get() == E->getExprOperand())
11859     return E;
11860 
11861   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11862                                            SubExpr.get(), E->getEndLoc());
11863 }
11864 
11865 template<typename Derived>
11866 ExprResult
11867 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11868   return E;
11869 }
11870 
11871 template<typename Derived>
11872 ExprResult
11873 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11874                                                      CXXNullPtrLiteralExpr *E) {
11875   return E;
11876 }
11877 
11878 template<typename Derived>
11879 ExprResult
11880 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11881   QualType T = getSema().getCurrentThisType();
11882 
11883   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11884     // Mark it referenced in the new context regardless.
11885     // FIXME: this is a bit instantiation-specific.
11886     getSema().MarkThisReferenced(E);
11887     return E;
11888   }
11889 
11890   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11891 }
11892 
11893 template<typename Derived>
11894 ExprResult
11895 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11896   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11897   if (SubExpr.isInvalid())
11898     return ExprError();
11899 
11900   if (!getDerived().AlwaysRebuild() &&
11901       SubExpr.get() == E->getSubExpr())
11902     return E;
11903 
11904   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11905                                           E->isThrownVariableInScope());
11906 }
11907 
11908 template<typename Derived>
11909 ExprResult
11910 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11911   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11912       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11913   if (!Param)
11914     return ExprError();
11915 
11916   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11917       E->getUsedContext() == SemaRef.CurContext)
11918     return E;
11919 
11920   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11921 }
11922 
11923 template<typename Derived>
11924 ExprResult
11925 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11926   FieldDecl *Field = cast_or_null<FieldDecl>(
11927       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11928   if (!Field)
11929     return ExprError();
11930 
11931   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11932       E->getUsedContext() == SemaRef.CurContext)
11933     return E;
11934 
11935   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11936 }
11937 
11938 template<typename Derived>
11939 ExprResult
11940 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11941                                                     CXXScalarValueInitExpr *E) {
11942   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11943   if (!T)
11944     return ExprError();
11945 
11946   if (!getDerived().AlwaysRebuild() &&
11947       T == E->getTypeSourceInfo())
11948     return E;
11949 
11950   return getDerived().RebuildCXXScalarValueInitExpr(T,
11951                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11952                                                     E->getRParenLoc());
11953 }
11954 
11955 template<typename Derived>
11956 ExprResult
11957 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11958   // Transform the type that we're allocating
11959   TypeSourceInfo *AllocTypeInfo =
11960       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11961   if (!AllocTypeInfo)
11962     return ExprError();
11963 
11964   // Transform the size of the array we're allocating (if any).
11965   Optional<Expr *> ArraySize;
11966   if (E->isArray()) {
11967     ExprResult NewArraySize;
11968     if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11969       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11970       if (NewArraySize.isInvalid())
11971         return ExprError();
11972     }
11973     ArraySize = NewArraySize.get();
11974   }
11975 
11976   // Transform the placement arguments (if any).
11977   bool ArgumentChanged = false;
11978   SmallVector<Expr*, 8> PlacementArgs;
11979   if (getDerived().TransformExprs(E->getPlacementArgs(),
11980                                   E->getNumPlacementArgs(), true,
11981                                   PlacementArgs, &ArgumentChanged))
11982     return ExprError();
11983 
11984   // Transform the initializer (if any).
11985   Expr *OldInit = E->getInitializer();
11986   ExprResult NewInit;
11987   if (OldInit)
11988     NewInit = getDerived().TransformInitializer(OldInit, true);
11989   if (NewInit.isInvalid())
11990     return ExprError();
11991 
11992   // Transform new operator and delete operator.
11993   FunctionDecl *OperatorNew = nullptr;
11994   if (E->getOperatorNew()) {
11995     OperatorNew = cast_or_null<FunctionDecl>(
11996         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11997     if (!OperatorNew)
11998       return ExprError();
11999   }
12000 
12001   FunctionDecl *OperatorDelete = nullptr;
12002   if (E->getOperatorDelete()) {
12003     OperatorDelete = cast_or_null<FunctionDecl>(
12004         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12005     if (!OperatorDelete)
12006       return ExprError();
12007   }
12008 
12009   if (!getDerived().AlwaysRebuild() &&
12010       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
12011       ArraySize == E->getArraySize() &&
12012       NewInit.get() == OldInit &&
12013       OperatorNew == E->getOperatorNew() &&
12014       OperatorDelete == E->getOperatorDelete() &&
12015       !ArgumentChanged) {
12016     // Mark any declarations we need as referenced.
12017     // FIXME: instantiation-specific.
12018     if (OperatorNew)
12019       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
12020     if (OperatorDelete)
12021       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12022 
12023     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
12024       QualType ElementType
12025         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
12026       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
12027         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
12028         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
12029           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
12030         }
12031       }
12032     }
12033 
12034     return E;
12035   }
12036 
12037   QualType AllocType = AllocTypeInfo->getType();
12038   if (!ArraySize) {
12039     // If no array size was specified, but the new expression was
12040     // instantiated with an array type (e.g., "new T" where T is
12041     // instantiated with "int[4]"), extract the outer bound from the
12042     // array type as our array size. We do this with constant and
12043     // dependently-sized array types.
12044     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12045     if (!ArrayT) {
12046       // Do nothing
12047     } else if (const ConstantArrayType *ConsArrayT
12048                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12049       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12050                                          SemaRef.Context.getSizeType(),
12051                                          /*FIXME:*/ E->getBeginLoc());
12052       AllocType = ConsArrayT->getElementType();
12053     } else if (const DependentSizedArrayType *DepArrayT
12054                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12055       if (DepArrayT->getSizeExpr()) {
12056         ArraySize = DepArrayT->getSizeExpr();
12057         AllocType = DepArrayT->getElementType();
12058       }
12059     }
12060   }
12061 
12062   return getDerived().RebuildCXXNewExpr(
12063       E->getBeginLoc(), E->isGlobalNew(),
12064       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12065       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12066       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12067 }
12068 
12069 template<typename Derived>
12070 ExprResult
12071 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12072   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12073   if (Operand.isInvalid())
12074     return ExprError();
12075 
12076   // Transform the delete operator, if known.
12077   FunctionDecl *OperatorDelete = nullptr;
12078   if (E->getOperatorDelete()) {
12079     OperatorDelete = cast_or_null<FunctionDecl>(
12080         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12081     if (!OperatorDelete)
12082       return ExprError();
12083   }
12084 
12085   if (!getDerived().AlwaysRebuild() &&
12086       Operand.get() == E->getArgument() &&
12087       OperatorDelete == E->getOperatorDelete()) {
12088     // Mark any declarations we need as referenced.
12089     // FIXME: instantiation-specific.
12090     if (OperatorDelete)
12091       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12092 
12093     if (!E->getArgument()->isTypeDependent()) {
12094       QualType Destroyed = SemaRef.Context.getBaseElementType(
12095                                                          E->getDestroyedType());
12096       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12097         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12098         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12099                                        SemaRef.LookupDestructor(Record));
12100       }
12101     }
12102 
12103     return E;
12104   }
12105 
12106   return getDerived().RebuildCXXDeleteExpr(
12107       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12108 }
12109 
12110 template<typename Derived>
12111 ExprResult
12112 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12113                                                      CXXPseudoDestructorExpr *E) {
12114   ExprResult Base = getDerived().TransformExpr(E->getBase());
12115   if (Base.isInvalid())
12116     return ExprError();
12117 
12118   ParsedType ObjectTypePtr;
12119   bool MayBePseudoDestructor = false;
12120   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12121                                               E->getOperatorLoc(),
12122                                         E->isArrow()? tok::arrow : tok::period,
12123                                               ObjectTypePtr,
12124                                               MayBePseudoDestructor);
12125   if (Base.isInvalid())
12126     return ExprError();
12127 
12128   QualType ObjectType = ObjectTypePtr.get();
12129   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12130   if (QualifierLoc) {
12131     QualifierLoc
12132       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12133     if (!QualifierLoc)
12134       return ExprError();
12135   }
12136   CXXScopeSpec SS;
12137   SS.Adopt(QualifierLoc);
12138 
12139   PseudoDestructorTypeStorage Destroyed;
12140   if (E->getDestroyedTypeInfo()) {
12141     TypeSourceInfo *DestroyedTypeInfo
12142       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12143                                                 ObjectType, nullptr, SS);
12144     if (!DestroyedTypeInfo)
12145       return ExprError();
12146     Destroyed = DestroyedTypeInfo;
12147   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12148     // We aren't likely to be able to resolve the identifier down to a type
12149     // now anyway, so just retain the identifier.
12150     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12151                                             E->getDestroyedTypeLoc());
12152   } else {
12153     // Look for a destructor known with the given name.
12154     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12155                                               *E->getDestroyedTypeIdentifier(),
12156                                                 E->getDestroyedTypeLoc(),
12157                                                 /*Scope=*/nullptr,
12158                                                 SS, ObjectTypePtr,
12159                                                 false);
12160     if (!T)
12161       return ExprError();
12162 
12163     Destroyed
12164       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12165                                                  E->getDestroyedTypeLoc());
12166   }
12167 
12168   TypeSourceInfo *ScopeTypeInfo = nullptr;
12169   if (E->getScopeTypeInfo()) {
12170     CXXScopeSpec EmptySS;
12171     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12172                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12173     if (!ScopeTypeInfo)
12174       return ExprError();
12175   }
12176 
12177   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12178                                                      E->getOperatorLoc(),
12179                                                      E->isArrow(),
12180                                                      SS,
12181                                                      ScopeTypeInfo,
12182                                                      E->getColonColonLoc(),
12183                                                      E->getTildeLoc(),
12184                                                      Destroyed);
12185 }
12186 
12187 template <typename Derived>
12188 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12189                                                         bool RequiresADL,
12190                                                         LookupResult &R) {
12191   // Transform all the decls.
12192   bool AllEmptyPacks = true;
12193   for (auto *OldD : Old->decls()) {
12194     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12195     if (!InstD) {
12196       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12197       // This can happen because of dependent hiding.
12198       if (isa<UsingShadowDecl>(OldD))
12199         continue;
12200       else {
12201         R.clear();
12202         return true;
12203       }
12204     }
12205 
12206     // Expand using pack declarations.
12207     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12208     ArrayRef<NamedDecl*> Decls = SingleDecl;
12209     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12210       Decls = UPD->expansions();
12211 
12212     // Expand using declarations.
12213     for (auto *D : Decls) {
12214       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12215         for (auto *SD : UD->shadows())
12216           R.addDecl(SD);
12217       } else {
12218         R.addDecl(D);
12219       }
12220     }
12221 
12222     AllEmptyPacks &= Decls.empty();
12223   };
12224 
12225   // C++ [temp.res]/8.4.2:
12226   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12227   //   a name in the template definition found a using-declaration, but the
12228   //   lookup in the corresponding scope in the instantiation odoes not find
12229   //   any declarations because the using-declaration was a pack expansion and
12230   //   the corresponding pack is empty
12231   if (AllEmptyPacks && !RequiresADL) {
12232     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12233         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12234     return true;
12235   }
12236 
12237   // Resolve a kind, but don't do any further analysis.  If it's
12238   // ambiguous, the callee needs to deal with it.
12239   R.resolveKind();
12240   return false;
12241 }
12242 
12243 template<typename Derived>
12244 ExprResult
12245 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12246                                                   UnresolvedLookupExpr *Old) {
12247   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12248                  Sema::LookupOrdinaryName);
12249 
12250   // Transform the declaration set.
12251   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12252     return ExprError();
12253 
12254   // Rebuild the nested-name qualifier, if present.
12255   CXXScopeSpec SS;
12256   if (Old->getQualifierLoc()) {
12257     NestedNameSpecifierLoc QualifierLoc
12258       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12259     if (!QualifierLoc)
12260       return ExprError();
12261 
12262     SS.Adopt(QualifierLoc);
12263   }
12264 
12265   if (Old->getNamingClass()) {
12266     CXXRecordDecl *NamingClass
12267       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12268                                                             Old->getNameLoc(),
12269                                                         Old->getNamingClass()));
12270     if (!NamingClass) {
12271       R.clear();
12272       return ExprError();
12273     }
12274 
12275     R.setNamingClass(NamingClass);
12276   }
12277 
12278   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12279 
12280   // If we have neither explicit template arguments, nor the template keyword,
12281   // it's a normal declaration name or member reference.
12282   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12283     NamedDecl *D = R.getAsSingle<NamedDecl>();
12284     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12285     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12286     // give a good diagnostic.
12287     if (D && D->isCXXInstanceMember()) {
12288       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12289                                                      /*TemplateArgs=*/nullptr,
12290                                                      /*Scope=*/nullptr);
12291     }
12292 
12293     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12294   }
12295 
12296   // If we have template arguments, rebuild them, then rebuild the
12297   // templateid expression.
12298   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12299   if (Old->hasExplicitTemplateArgs() &&
12300       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12301                                               Old->getNumTemplateArgs(),
12302                                               TransArgs)) {
12303     R.clear();
12304     return ExprError();
12305   }
12306 
12307   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12308                                             Old->requiresADL(), &TransArgs);
12309 }
12310 
12311 template<typename Derived>
12312 ExprResult
12313 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12314   bool ArgChanged = false;
12315   SmallVector<TypeSourceInfo *, 4> Args;
12316   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12317     TypeSourceInfo *From = E->getArg(I);
12318     TypeLoc FromTL = From->getTypeLoc();
12319     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12320       TypeLocBuilder TLB;
12321       TLB.reserve(FromTL.getFullDataSize());
12322       QualType To = getDerived().TransformType(TLB, FromTL);
12323       if (To.isNull())
12324         return ExprError();
12325 
12326       if (To == From->getType())
12327         Args.push_back(From);
12328       else {
12329         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12330         ArgChanged = true;
12331       }
12332       continue;
12333     }
12334 
12335     ArgChanged = true;
12336 
12337     // We have a pack expansion. Instantiate it.
12338     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12339     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12340     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12341     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12342 
12343     // Determine whether the set of unexpanded parameter packs can and should
12344     // be expanded.
12345     bool Expand = true;
12346     bool RetainExpansion = false;
12347     Optional<unsigned> OrigNumExpansions =
12348         ExpansionTL.getTypePtr()->getNumExpansions();
12349     Optional<unsigned> NumExpansions = OrigNumExpansions;
12350     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12351                                              PatternTL.getSourceRange(),
12352                                              Unexpanded,
12353                                              Expand, RetainExpansion,
12354                                              NumExpansions))
12355       return ExprError();
12356 
12357     if (!Expand) {
12358       // The transform has determined that we should perform a simple
12359       // transformation on the pack expansion, producing another pack
12360       // expansion.
12361       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12362 
12363       TypeLocBuilder TLB;
12364       TLB.reserve(From->getTypeLoc().getFullDataSize());
12365 
12366       QualType To = getDerived().TransformType(TLB, PatternTL);
12367       if (To.isNull())
12368         return ExprError();
12369 
12370       To = getDerived().RebuildPackExpansionType(To,
12371                                                  PatternTL.getSourceRange(),
12372                                                  ExpansionTL.getEllipsisLoc(),
12373                                                  NumExpansions);
12374       if (To.isNull())
12375         return ExprError();
12376 
12377       PackExpansionTypeLoc ToExpansionTL
12378         = TLB.push<PackExpansionTypeLoc>(To);
12379       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12380       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12381       continue;
12382     }
12383 
12384     // Expand the pack expansion by substituting for each argument in the
12385     // pack(s).
12386     for (unsigned I = 0; I != *NumExpansions; ++I) {
12387       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12388       TypeLocBuilder TLB;
12389       TLB.reserve(PatternTL.getFullDataSize());
12390       QualType To = getDerived().TransformType(TLB, PatternTL);
12391       if (To.isNull())
12392         return ExprError();
12393 
12394       if (To->containsUnexpandedParameterPack()) {
12395         To = getDerived().RebuildPackExpansionType(To,
12396                                                    PatternTL.getSourceRange(),
12397                                                    ExpansionTL.getEllipsisLoc(),
12398                                                    NumExpansions);
12399         if (To.isNull())
12400           return ExprError();
12401 
12402         PackExpansionTypeLoc ToExpansionTL
12403           = TLB.push<PackExpansionTypeLoc>(To);
12404         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12405       }
12406 
12407       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12408     }
12409 
12410     if (!RetainExpansion)
12411       continue;
12412 
12413     // If we're supposed to retain a pack expansion, do so by temporarily
12414     // forgetting the partially-substituted parameter pack.
12415     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12416 
12417     TypeLocBuilder TLB;
12418     TLB.reserve(From->getTypeLoc().getFullDataSize());
12419 
12420     QualType To = getDerived().TransformType(TLB, PatternTL);
12421     if (To.isNull())
12422       return ExprError();
12423 
12424     To = getDerived().RebuildPackExpansionType(To,
12425                                                PatternTL.getSourceRange(),
12426                                                ExpansionTL.getEllipsisLoc(),
12427                                                NumExpansions);
12428     if (To.isNull())
12429       return ExprError();
12430 
12431     PackExpansionTypeLoc ToExpansionTL
12432       = TLB.push<PackExpansionTypeLoc>(To);
12433     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12434     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12435   }
12436 
12437   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12438     return E;
12439 
12440   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12441                                        E->getEndLoc());
12442 }
12443 
12444 template<typename Derived>
12445 ExprResult
12446 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12447                                                  ConceptSpecializationExpr *E) {
12448   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12449   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12450   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12451                                               Old->NumTemplateArgs, TransArgs))
12452     return ExprError();
12453 
12454   return getDerived().RebuildConceptSpecializationExpr(
12455       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12456       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12457       &TransArgs);
12458 }
12459 
12460 template<typename Derived>
12461 ExprResult
12462 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12463   SmallVector<ParmVarDecl*, 4> TransParams;
12464   SmallVector<QualType, 4> TransParamTypes;
12465   Sema::ExtParameterInfoBuilder ExtParamInfos;
12466 
12467   // C++2a [expr.prim.req]p2
12468   // Expressions appearing within a requirement-body are unevaluated operands.
12469   EnterExpressionEvaluationContext Ctx(
12470       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12471 
12472   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12473       getSema().Context, getSema().CurContext,
12474       E->getBody()->getBeginLoc());
12475 
12476   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12477 
12478   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12479                                                E->getLocalParameters(),
12480                                                /*ParamTypes=*/nullptr,
12481                                                /*ParamInfos=*/nullptr,
12482                                                TransParamTypes, &TransParams,
12483                                                ExtParamInfos))
12484     return ExprError();
12485 
12486   for (ParmVarDecl *Param : TransParams)
12487     Param->setDeclContext(Body);
12488 
12489   SmallVector<concepts::Requirement *, 4> TransReqs;
12490   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12491                                                      TransReqs))
12492     return ExprError();
12493 
12494   for (concepts::Requirement *Req : TransReqs) {
12495     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12496       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12497         ER->getReturnTypeRequirement()
12498                 .getTypeConstraintTemplateParameterList()->getParam(0)
12499                 ->setDeclContext(Body);
12500       }
12501     }
12502   }
12503 
12504   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12505                                           TransParams, TransReqs,
12506                                           E->getRBraceLoc());
12507 }
12508 
12509 template<typename Derived>
12510 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12511     ArrayRef<concepts::Requirement *> Reqs,
12512     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12513   for (concepts::Requirement *Req : Reqs) {
12514     concepts::Requirement *TransReq = nullptr;
12515     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12516       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12517     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12518       TransReq = getDerived().TransformExprRequirement(ExprReq);
12519     else
12520       TransReq = getDerived().TransformNestedRequirement(
12521                      cast<concepts::NestedRequirement>(Req));
12522     if (!TransReq)
12523       return true;
12524     Transformed.push_back(TransReq);
12525   }
12526   return false;
12527 }
12528 
12529 template<typename Derived>
12530 concepts::TypeRequirement *
12531 TreeTransform<Derived>::TransformTypeRequirement(
12532     concepts::TypeRequirement *Req) {
12533   if (Req->isSubstitutionFailure()) {
12534     if (getDerived().AlwaysRebuild())
12535       return getDerived().RebuildTypeRequirement(
12536               Req->getSubstitutionDiagnostic());
12537     return Req;
12538   }
12539   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12540   if (!TransType)
12541     return nullptr;
12542   return getDerived().RebuildTypeRequirement(TransType);
12543 }
12544 
12545 template<typename Derived>
12546 concepts::ExprRequirement *
12547 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12548   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12549   if (Req->isExprSubstitutionFailure())
12550     TransExpr = Req->getExprSubstitutionDiagnostic();
12551   else {
12552     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12553     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12554       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12555     if (TransExprRes.isInvalid())
12556       return nullptr;
12557     TransExpr = TransExprRes.get();
12558   }
12559 
12560   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12561   const auto &RetReq = Req->getReturnTypeRequirement();
12562   if (RetReq.isEmpty())
12563     TransRetReq.emplace();
12564   else if (RetReq.isSubstitutionFailure())
12565     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12566   else if (RetReq.isTypeConstraint()) {
12567     TemplateParameterList *OrigTPL =
12568         RetReq.getTypeConstraintTemplateParameterList();
12569     TemplateParameterList *TPL =
12570         getDerived().TransformTemplateParameterList(OrigTPL);
12571     if (!TPL)
12572       return nullptr;
12573     TransRetReq.emplace(TPL);
12574   }
12575   assert(TransRetReq.hasValue() &&
12576          "All code paths leading here must set TransRetReq");
12577   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12578     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12579                                                Req->getNoexceptLoc(),
12580                                                std::move(*TransRetReq));
12581   return getDerived().RebuildExprRequirement(
12582       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12583       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12584 }
12585 
12586 template<typename Derived>
12587 concepts::NestedRequirement *
12588 TreeTransform<Derived>::TransformNestedRequirement(
12589     concepts::NestedRequirement *Req) {
12590   if (Req->isSubstitutionFailure()) {
12591     if (getDerived().AlwaysRebuild())
12592       return getDerived().RebuildNestedRequirement(
12593           Req->getSubstitutionDiagnostic());
12594     return Req;
12595   }
12596   ExprResult TransConstraint =
12597       getDerived().TransformExpr(Req->getConstraintExpr());
12598   if (TransConstraint.isInvalid())
12599     return nullptr;
12600   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12601 }
12602 
12603 template<typename Derived>
12604 ExprResult
12605 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12606   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12607   if (!T)
12608     return ExprError();
12609 
12610   if (!getDerived().AlwaysRebuild() &&
12611       T == E->getQueriedTypeSourceInfo())
12612     return E;
12613 
12614   ExprResult SubExpr;
12615   {
12616     EnterExpressionEvaluationContext Unevaluated(
12617         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12618     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12619     if (SubExpr.isInvalid())
12620       return ExprError();
12621 
12622     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12623       return E;
12624   }
12625 
12626   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12627                                             SubExpr.get(), E->getEndLoc());
12628 }
12629 
12630 template<typename Derived>
12631 ExprResult
12632 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12633   ExprResult SubExpr;
12634   {
12635     EnterExpressionEvaluationContext Unevaluated(
12636         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12637     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12638     if (SubExpr.isInvalid())
12639       return ExprError();
12640 
12641     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12642       return E;
12643   }
12644 
12645   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12646                                              SubExpr.get(), E->getEndLoc());
12647 }
12648 
12649 template <typename Derived>
12650 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12651     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12652     TypeSourceInfo **RecoveryTSI) {
12653   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12654       DRE, AddrTaken, RecoveryTSI);
12655 
12656   // Propagate both errors and recovered types, which return ExprEmpty.
12657   if (!NewDRE.isUsable())
12658     return NewDRE;
12659 
12660   // We got an expr, wrap it up in parens.
12661   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12662     return PE;
12663   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12664                                        PE->getRParen());
12665 }
12666 
12667 template <typename Derived>
12668 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12669     DependentScopeDeclRefExpr *E) {
12670   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12671                                             nullptr);
12672 }
12673 
12674 template <typename Derived>
12675 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12676     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12677     TypeSourceInfo **RecoveryTSI) {
12678   assert(E->getQualifierLoc());
12679   NestedNameSpecifierLoc QualifierLoc =
12680       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12681   if (!QualifierLoc)
12682     return ExprError();
12683   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12684 
12685   // TODO: If this is a conversion-function-id, verify that the
12686   // destination type name (if present) resolves the same way after
12687   // instantiation as it did in the local scope.
12688 
12689   DeclarationNameInfo NameInfo =
12690       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12691   if (!NameInfo.getName())
12692     return ExprError();
12693 
12694   if (!E->hasExplicitTemplateArgs()) {
12695     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12696         // Note: it is sufficient to compare the Name component of NameInfo:
12697         // if name has not changed, DNLoc has not changed either.
12698         NameInfo.getName() == E->getDeclName())
12699       return E;
12700 
12701     return getDerived().RebuildDependentScopeDeclRefExpr(
12702         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12703         IsAddressOfOperand, RecoveryTSI);
12704   }
12705 
12706   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12707   if (getDerived().TransformTemplateArguments(
12708           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12709     return ExprError();
12710 
12711   return getDerived().RebuildDependentScopeDeclRefExpr(
12712       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12713       RecoveryTSI);
12714 }
12715 
12716 template<typename Derived>
12717 ExprResult
12718 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12719   // CXXConstructExprs other than for list-initialization and
12720   // CXXTemporaryObjectExpr are always implicit, so when we have
12721   // a 1-argument construction we just transform that argument.
12722   if (getDerived().AllowSkippingCXXConstructExpr() &&
12723       ((E->getNumArgs() == 1 ||
12724         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12725        (!getDerived().DropCallArgument(E->getArg(0))) &&
12726        !E->isListInitialization()))
12727     return getDerived().TransformInitializer(E->getArg(0),
12728                                              /*DirectInit*/ false);
12729 
12730   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12731 
12732   QualType T = getDerived().TransformType(E->getType());
12733   if (T.isNull())
12734     return ExprError();
12735 
12736   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12737       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12738   if (!Constructor)
12739     return ExprError();
12740 
12741   bool ArgumentChanged = false;
12742   SmallVector<Expr*, 8> Args;
12743   {
12744     EnterExpressionEvaluationContext Context(
12745         getSema(), EnterExpressionEvaluationContext::InitList,
12746         E->isListInitialization());
12747     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12748                                     &ArgumentChanged))
12749       return ExprError();
12750   }
12751 
12752   if (!getDerived().AlwaysRebuild() &&
12753       T == E->getType() &&
12754       Constructor == E->getConstructor() &&
12755       !ArgumentChanged) {
12756     // Mark the constructor as referenced.
12757     // FIXME: Instantiation-specific
12758     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12759     return E;
12760   }
12761 
12762   return getDerived().RebuildCXXConstructExpr(
12763       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12764       E->hadMultipleCandidates(), E->isListInitialization(),
12765       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12766       E->getConstructionKind(), E->getParenOrBraceRange());
12767 }
12768 
12769 template<typename Derived>
12770 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12771     CXXInheritedCtorInitExpr *E) {
12772   QualType T = getDerived().TransformType(E->getType());
12773   if (T.isNull())
12774     return ExprError();
12775 
12776   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12777       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12778   if (!Constructor)
12779     return ExprError();
12780 
12781   if (!getDerived().AlwaysRebuild() &&
12782       T == E->getType() &&
12783       Constructor == E->getConstructor()) {
12784     // Mark the constructor as referenced.
12785     // FIXME: Instantiation-specific
12786     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12787     return E;
12788   }
12789 
12790   return getDerived().RebuildCXXInheritedCtorInitExpr(
12791       T, E->getLocation(), Constructor,
12792       E->constructsVBase(), E->inheritedFromVBase());
12793 }
12794 
12795 /// Transform a C++ temporary-binding expression.
12796 ///
12797 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12798 /// transform the subexpression and return that.
12799 template<typename Derived>
12800 ExprResult
12801 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12802   if (auto *Dtor = E->getTemporary()->getDestructor())
12803     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12804                                    const_cast<CXXDestructorDecl *>(Dtor));
12805   return getDerived().TransformExpr(E->getSubExpr());
12806 }
12807 
12808 /// Transform a C++ expression that contains cleanups that should
12809 /// be run after the expression is evaluated.
12810 ///
12811 /// Since ExprWithCleanups nodes are implicitly generated, we
12812 /// just transform the subexpression and return that.
12813 template<typename Derived>
12814 ExprResult
12815 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12816   return getDerived().TransformExpr(E->getSubExpr());
12817 }
12818 
12819 template<typename Derived>
12820 ExprResult
12821 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12822                                                     CXXTemporaryObjectExpr *E) {
12823   TypeSourceInfo *T =
12824       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12825   if (!T)
12826     return ExprError();
12827 
12828   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12829       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12830   if (!Constructor)
12831     return ExprError();
12832 
12833   bool ArgumentChanged = false;
12834   SmallVector<Expr*, 8> Args;
12835   Args.reserve(E->getNumArgs());
12836   {
12837     EnterExpressionEvaluationContext Context(
12838         getSema(), EnterExpressionEvaluationContext::InitList,
12839         E->isListInitialization());
12840     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12841                        &ArgumentChanged))
12842       return ExprError();
12843   }
12844 
12845   if (!getDerived().AlwaysRebuild() &&
12846       T == E->getTypeSourceInfo() &&
12847       Constructor == E->getConstructor() &&
12848       !ArgumentChanged) {
12849     // FIXME: Instantiation-specific
12850     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12851     return SemaRef.MaybeBindToTemporary(E);
12852   }
12853 
12854   // FIXME: We should just pass E->isListInitialization(), but we're not
12855   // prepared to handle list-initialization without a child InitListExpr.
12856   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12857   return getDerived().RebuildCXXTemporaryObjectExpr(
12858       T, LParenLoc, Args, E->getEndLoc(),
12859       /*ListInitialization=*/LParenLoc.isInvalid());
12860 }
12861 
12862 template<typename Derived>
12863 ExprResult
12864 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12865   // Transform any init-capture expressions before entering the scope of the
12866   // lambda body, because they are not semantically within that scope.
12867   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12868   struct TransformedInitCapture {
12869     // The location of the ... if the result is retaining a pack expansion.
12870     SourceLocation EllipsisLoc;
12871     // Zero or more expansions of the init-capture.
12872     SmallVector<InitCaptureInfoTy, 4> Expansions;
12873   };
12874   SmallVector<TransformedInitCapture, 4> InitCaptures;
12875   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12876   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12877                                     CEnd = E->capture_end();
12878        C != CEnd; ++C) {
12879     if (!E->isInitCapture(C))
12880       continue;
12881 
12882     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12883     VarDecl *OldVD = C->getCapturedVar();
12884 
12885     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12886                                 Optional<unsigned> NumExpansions) {
12887       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12888           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12889 
12890       if (NewExprInitResult.isInvalid()) {
12891         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12892         return;
12893       }
12894       Expr *NewExprInit = NewExprInitResult.get();
12895 
12896       QualType NewInitCaptureType =
12897           getSema().buildLambdaInitCaptureInitialization(
12898               C->getLocation(), OldVD->getType()->isReferenceType(),
12899               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12900               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12901               NewExprInit);
12902       Result.Expansions.push_back(
12903           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12904     };
12905 
12906     // If this is an init-capture pack, consider expanding the pack now.
12907     if (OldVD->isParameterPack()) {
12908       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12909                                              ->getTypeLoc()
12910                                              .castAs<PackExpansionTypeLoc>();
12911       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12912       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12913 
12914       // Determine whether the set of unexpanded parameter packs can and should
12915       // be expanded.
12916       bool Expand = true;
12917       bool RetainExpansion = false;
12918       Optional<unsigned> OrigNumExpansions =
12919           ExpansionTL.getTypePtr()->getNumExpansions();
12920       Optional<unsigned> NumExpansions = OrigNumExpansions;
12921       if (getDerived().TryExpandParameterPacks(
12922               ExpansionTL.getEllipsisLoc(),
12923               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12924               RetainExpansion, NumExpansions))
12925         return ExprError();
12926       if (Expand) {
12927         for (unsigned I = 0; I != *NumExpansions; ++I) {
12928           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12929           SubstInitCapture(SourceLocation(), None);
12930         }
12931       }
12932       if (!Expand || RetainExpansion) {
12933         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12934         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12935         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12936       }
12937     } else {
12938       SubstInitCapture(SourceLocation(), None);
12939     }
12940   }
12941 
12942   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12943   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12944 
12945   // Transform the template parameters, and add them to the current
12946   // instantiation scope. The null case is handled correctly.
12947   auto TPL = getDerived().TransformTemplateParameterList(
12948       E->getTemplateParameterList());
12949   LSI->GLTemplateParameterList = TPL;
12950 
12951   // Transform the type of the original lambda's call operator.
12952   // The transformation MUST be done in the CurrentInstantiationScope since
12953   // it introduces a mapping of the original to the newly created
12954   // transformed parameters.
12955   TypeSourceInfo *NewCallOpTSI = nullptr;
12956   {
12957     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12958     FunctionProtoTypeLoc OldCallOpFPTL =
12959         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12960 
12961     TypeLocBuilder NewCallOpTLBuilder;
12962     SmallVector<QualType, 4> ExceptionStorage;
12963     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12964     QualType NewCallOpType = TransformFunctionProtoType(
12965         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12966         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12967           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12968                                               ExceptionStorage, Changed);
12969         });
12970     if (NewCallOpType.isNull())
12971       return ExprError();
12972     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12973                                                         NewCallOpType);
12974   }
12975 
12976   // Transform the trailing requires clause
12977   ExprResult NewTrailingRequiresClause;
12978   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12979     // FIXME: Concepts: Substitution into requires clause should only happen
12980     //                  when checking satisfaction.
12981     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12982 
12983   // Create the local class that will describe the lambda.
12984 
12985   // FIXME: DependencyKind below is wrong when substituting inside a templated
12986   // context that isn't a DeclContext (such as a variable template), or when
12987   // substituting an unevaluated lambda inside of a function's parameter's type
12988   // - as parameter types are not instantiated from within a function's DC. We
12989   // use isUnevaluatedContext() to distinguish the function parameter case.
12990   CXXRecordDecl::LambdaDependencyKind DependencyKind =
12991       CXXRecordDecl::LDK_Unknown;
12992   if (getSema().isUnevaluatedContext() &&
12993       (getSema().CurContext->isFileContext() ||
12994        !getSema().CurContext->getParent()->isDependentContext()))
12995     DependencyKind = CXXRecordDecl::LDK_NeverDependent;
12996 
12997   CXXRecordDecl *OldClass = E->getLambdaClass();
12998   CXXRecordDecl *Class =
12999       getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI,
13000                                         DependencyKind, E->getCaptureDefault());
13001 
13002   getDerived().transformedLocalDecl(OldClass, {Class});
13003 
13004   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
13005   if (getDerived().ReplacingOriginal())
13006     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
13007                                OldClass->getLambdaManglingNumber(),
13008                                OldClass->getDeviceLambdaManglingNumber(),
13009                                OldClass->getLambdaContextDecl());
13010 
13011   // Build the call operator.
13012   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
13013       Class, E->getIntroducerRange(), NewCallOpTSI,
13014       E->getCallOperator()->getEndLoc(),
13015       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
13016       E->getCallOperator()->getConstexprKind(),
13017       NewTrailingRequiresClause.get());
13018 
13019   LSI->CallOperator = NewCallOperator;
13020 
13021   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
13022   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
13023 
13024   // Number the lambda for linkage purposes if necessary.
13025   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
13026 
13027   // Introduce the context of the call operator.
13028   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
13029                                  /*NewThisContext*/false);
13030 
13031   // Enter the scope of the lambda.
13032   getSema().buildLambdaScope(LSI, NewCallOperator,
13033                              E->getIntroducerRange(),
13034                              E->getCaptureDefault(),
13035                              E->getCaptureDefaultLoc(),
13036                              E->hasExplicitParameters(),
13037                              E->hasExplicitResultType(),
13038                              E->isMutable());
13039 
13040   bool Invalid = false;
13041 
13042   // Transform captures.
13043   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13044                                  CEnd = E->capture_end();
13045        C != CEnd; ++C) {
13046     // When we hit the first implicit capture, tell Sema that we've finished
13047     // the list of explicit captures.
13048     if (C->isImplicit())
13049       break;
13050 
13051     // Capturing 'this' is trivial.
13052     if (C->capturesThis()) {
13053       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13054                                     /*BuildAndDiagnose*/ true, nullptr,
13055                                     C->getCaptureKind() == LCK_StarThis);
13056       continue;
13057     }
13058     // Captured expression will be recaptured during captured variables
13059     // rebuilding.
13060     if (C->capturesVLAType())
13061       continue;
13062 
13063     // Rebuild init-captures, including the implied field declaration.
13064     if (E->isInitCapture(C)) {
13065       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13066 
13067       VarDecl *OldVD = C->getCapturedVar();
13068       llvm::SmallVector<Decl*, 4> NewVDs;
13069 
13070       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13071         ExprResult Init = Info.first;
13072         QualType InitQualType = Info.second;
13073         if (Init.isInvalid() || InitQualType.isNull()) {
13074           Invalid = true;
13075           break;
13076         }
13077         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13078             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13079             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13080         if (!NewVD) {
13081           Invalid = true;
13082           break;
13083         }
13084         NewVDs.push_back(NewVD);
13085         getSema().addInitCapture(LSI, NewVD);
13086       }
13087 
13088       if (Invalid)
13089         break;
13090 
13091       getDerived().transformedLocalDecl(OldVD, NewVDs);
13092       continue;
13093     }
13094 
13095     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13096 
13097     // Determine the capture kind for Sema.
13098     Sema::TryCaptureKind Kind
13099       = C->isImplicit()? Sema::TryCapture_Implicit
13100                        : C->getCaptureKind() == LCK_ByCopy
13101                            ? Sema::TryCapture_ExplicitByVal
13102                            : Sema::TryCapture_ExplicitByRef;
13103     SourceLocation EllipsisLoc;
13104     if (C->isPackExpansion()) {
13105       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13106       bool ShouldExpand = false;
13107       bool RetainExpansion = false;
13108       Optional<unsigned> NumExpansions;
13109       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13110                                                C->getLocation(),
13111                                                Unexpanded,
13112                                                ShouldExpand, RetainExpansion,
13113                                                NumExpansions)) {
13114         Invalid = true;
13115         continue;
13116       }
13117 
13118       if (ShouldExpand) {
13119         // The transform has determined that we should perform an expansion;
13120         // transform and capture each of the arguments.
13121         // expansion of the pattern. Do so.
13122         VarDecl *Pack = C->getCapturedVar();
13123         for (unsigned I = 0; I != *NumExpansions; ++I) {
13124           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13125           VarDecl *CapturedVar
13126             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13127                                                                Pack));
13128           if (!CapturedVar) {
13129             Invalid = true;
13130             continue;
13131           }
13132 
13133           // Capture the transformed variable.
13134           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13135         }
13136 
13137         // FIXME: Retain a pack expansion if RetainExpansion is true.
13138 
13139         continue;
13140       }
13141 
13142       EllipsisLoc = C->getEllipsisLoc();
13143     }
13144 
13145     // Transform the captured variable.
13146     VarDecl *CapturedVar
13147       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13148                                                          C->getCapturedVar()));
13149     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13150       Invalid = true;
13151       continue;
13152     }
13153 
13154     // Capture the transformed variable.
13155     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13156                                  EllipsisLoc);
13157   }
13158   getSema().finishLambdaExplicitCaptures(LSI);
13159 
13160   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13161   // evaluation context even if we're not transforming the function body.
13162   getSema().PushExpressionEvaluationContext(
13163       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13164 
13165   // Instantiate the body of the lambda expression.
13166   StmtResult Body =
13167       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13168 
13169   // ActOnLambda* will pop the function scope for us.
13170   FuncScopeCleanup.disable();
13171 
13172   if (Body.isInvalid()) {
13173     SavedContext.pop();
13174     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13175                                /*IsInstantiation=*/true);
13176     return ExprError();
13177   }
13178 
13179   // Copy the LSI before ActOnFinishFunctionBody removes it.
13180   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13181   // the call operator.
13182   auto LSICopy = *LSI;
13183   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13184                                     /*IsInstantiation*/ true);
13185   SavedContext.pop();
13186 
13187   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13188                                    &LSICopy);
13189 }
13190 
13191 template<typename Derived>
13192 StmtResult
13193 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13194   return TransformStmt(S);
13195 }
13196 
13197 template<typename Derived>
13198 StmtResult
13199 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13200   // Transform captures.
13201   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13202                                  CEnd = E->capture_end();
13203        C != CEnd; ++C) {
13204     // When we hit the first implicit capture, tell Sema that we've finished
13205     // the list of explicit captures.
13206     if (!C->isImplicit())
13207       continue;
13208 
13209     // Capturing 'this' is trivial.
13210     if (C->capturesThis()) {
13211       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13212                                     /*BuildAndDiagnose*/ true, nullptr,
13213                                     C->getCaptureKind() == LCK_StarThis);
13214       continue;
13215     }
13216     // Captured expression will be recaptured during captured variables
13217     // rebuilding.
13218     if (C->capturesVLAType())
13219       continue;
13220 
13221     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13222     assert(!E->isInitCapture(C) && "implicit init-capture?");
13223 
13224     // Transform the captured variable.
13225     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13226         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13227     if (!CapturedVar || CapturedVar->isInvalidDecl())
13228       return StmtError();
13229 
13230     // Capture the transformed variable.
13231     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13232   }
13233 
13234   return S;
13235 }
13236 
13237 template<typename Derived>
13238 ExprResult
13239 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13240                                                   CXXUnresolvedConstructExpr *E) {
13241   TypeSourceInfo *T =
13242       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13243   if (!T)
13244     return ExprError();
13245 
13246   bool ArgumentChanged = false;
13247   SmallVector<Expr*, 8> Args;
13248   Args.reserve(E->getNumArgs());
13249   {
13250     EnterExpressionEvaluationContext Context(
13251         getSema(), EnterExpressionEvaluationContext::InitList,
13252         E->isListInitialization());
13253     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13254                                     &ArgumentChanged))
13255       return ExprError();
13256   }
13257 
13258   if (!getDerived().AlwaysRebuild() &&
13259       T == E->getTypeSourceInfo() &&
13260       !ArgumentChanged)
13261     return E;
13262 
13263   // FIXME: we're faking the locations of the commas
13264   return getDerived().RebuildCXXUnresolvedConstructExpr(
13265       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13266 }
13267 
13268 template<typename Derived>
13269 ExprResult
13270 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13271                                              CXXDependentScopeMemberExpr *E) {
13272   // Transform the base of the expression.
13273   ExprResult Base((Expr*) nullptr);
13274   Expr *OldBase;
13275   QualType BaseType;
13276   QualType ObjectType;
13277   if (!E->isImplicitAccess()) {
13278     OldBase = E->getBase();
13279     Base = getDerived().TransformExpr(OldBase);
13280     if (Base.isInvalid())
13281       return ExprError();
13282 
13283     // Start the member reference and compute the object's type.
13284     ParsedType ObjectTy;
13285     bool MayBePseudoDestructor = false;
13286     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13287                                                 E->getOperatorLoc(),
13288                                       E->isArrow()? tok::arrow : tok::period,
13289                                                 ObjectTy,
13290                                                 MayBePseudoDestructor);
13291     if (Base.isInvalid())
13292       return ExprError();
13293 
13294     ObjectType = ObjectTy.get();
13295     BaseType = ((Expr*) Base.get())->getType();
13296   } else {
13297     OldBase = nullptr;
13298     BaseType = getDerived().TransformType(E->getBaseType());
13299     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13300   }
13301 
13302   // Transform the first part of the nested-name-specifier that qualifies
13303   // the member name.
13304   NamedDecl *FirstQualifierInScope
13305     = getDerived().TransformFirstQualifierInScope(
13306                                             E->getFirstQualifierFoundInScope(),
13307                                             E->getQualifierLoc().getBeginLoc());
13308 
13309   NestedNameSpecifierLoc QualifierLoc;
13310   if (E->getQualifier()) {
13311     QualifierLoc
13312       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13313                                                      ObjectType,
13314                                                      FirstQualifierInScope);
13315     if (!QualifierLoc)
13316       return ExprError();
13317   }
13318 
13319   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13320 
13321   // TODO: If this is a conversion-function-id, verify that the
13322   // destination type name (if present) resolves the same way after
13323   // instantiation as it did in the local scope.
13324 
13325   DeclarationNameInfo NameInfo
13326     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13327   if (!NameInfo.getName())
13328     return ExprError();
13329 
13330   if (!E->hasExplicitTemplateArgs()) {
13331     // This is a reference to a member without an explicitly-specified
13332     // template argument list. Optimize for this common case.
13333     if (!getDerived().AlwaysRebuild() &&
13334         Base.get() == OldBase &&
13335         BaseType == E->getBaseType() &&
13336         QualifierLoc == E->getQualifierLoc() &&
13337         NameInfo.getName() == E->getMember() &&
13338         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13339       return E;
13340 
13341     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13342                                                        BaseType,
13343                                                        E->isArrow(),
13344                                                        E->getOperatorLoc(),
13345                                                        QualifierLoc,
13346                                                        TemplateKWLoc,
13347                                                        FirstQualifierInScope,
13348                                                        NameInfo,
13349                                                        /*TemplateArgs*/nullptr);
13350   }
13351 
13352   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13353   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13354                                               E->getNumTemplateArgs(),
13355                                               TransArgs))
13356     return ExprError();
13357 
13358   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13359                                                      BaseType,
13360                                                      E->isArrow(),
13361                                                      E->getOperatorLoc(),
13362                                                      QualifierLoc,
13363                                                      TemplateKWLoc,
13364                                                      FirstQualifierInScope,
13365                                                      NameInfo,
13366                                                      &TransArgs);
13367 }
13368 
13369 template <typename Derived>
13370 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13371     UnresolvedMemberExpr *Old) {
13372   // Transform the base of the expression.
13373   ExprResult Base((Expr *)nullptr);
13374   QualType BaseType;
13375   if (!Old->isImplicitAccess()) {
13376     Base = getDerived().TransformExpr(Old->getBase());
13377     if (Base.isInvalid())
13378       return ExprError();
13379     Base =
13380         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13381     if (Base.isInvalid())
13382       return ExprError();
13383     BaseType = Base.get()->getType();
13384   } else {
13385     BaseType = getDerived().TransformType(Old->getBaseType());
13386   }
13387 
13388   NestedNameSpecifierLoc QualifierLoc;
13389   if (Old->getQualifierLoc()) {
13390     QualifierLoc =
13391         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13392     if (!QualifierLoc)
13393       return ExprError();
13394   }
13395 
13396   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13397 
13398   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13399 
13400   // Transform the declaration set.
13401   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13402     return ExprError();
13403 
13404   // Determine the naming class.
13405   if (Old->getNamingClass()) {
13406     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13407         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13408     if (!NamingClass)
13409       return ExprError();
13410 
13411     R.setNamingClass(NamingClass);
13412   }
13413 
13414   TemplateArgumentListInfo TransArgs;
13415   if (Old->hasExplicitTemplateArgs()) {
13416     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13417     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13418     if (getDerived().TransformTemplateArguments(
13419             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13420       return ExprError();
13421   }
13422 
13423   // FIXME: to do this check properly, we will need to preserve the
13424   // first-qualifier-in-scope here, just in case we had a dependent
13425   // base (and therefore couldn't do the check) and a
13426   // nested-name-qualifier (and therefore could do the lookup).
13427   NamedDecl *FirstQualifierInScope = nullptr;
13428 
13429   return getDerived().RebuildUnresolvedMemberExpr(
13430       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13431       TemplateKWLoc, FirstQualifierInScope, R,
13432       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13433 }
13434 
13435 template<typename Derived>
13436 ExprResult
13437 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13438   EnterExpressionEvaluationContext Unevaluated(
13439       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13440   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13441   if (SubExpr.isInvalid())
13442     return ExprError();
13443 
13444   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13445     return E;
13446 
13447   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13448 }
13449 
13450 template<typename Derived>
13451 ExprResult
13452 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13453   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13454   if (Pattern.isInvalid())
13455     return ExprError();
13456 
13457   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13458     return E;
13459 
13460   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13461                                            E->getNumExpansions());
13462 }
13463 
13464 template<typename Derived>
13465 ExprResult
13466 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13467   // If E is not value-dependent, then nothing will change when we transform it.
13468   // Note: This is an instantiation-centric view.
13469   if (!E->isValueDependent())
13470     return E;
13471 
13472   EnterExpressionEvaluationContext Unevaluated(
13473       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13474 
13475   ArrayRef<TemplateArgument> PackArgs;
13476   TemplateArgument ArgStorage;
13477 
13478   // Find the argument list to transform.
13479   if (E->isPartiallySubstituted()) {
13480     PackArgs = E->getPartialArguments();
13481   } else if (E->isValueDependent()) {
13482     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13483     bool ShouldExpand = false;
13484     bool RetainExpansion = false;
13485     Optional<unsigned> NumExpansions;
13486     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13487                                              Unexpanded,
13488                                              ShouldExpand, RetainExpansion,
13489                                              NumExpansions))
13490       return ExprError();
13491 
13492     // If we need to expand the pack, build a template argument from it and
13493     // expand that.
13494     if (ShouldExpand) {
13495       auto *Pack = E->getPack();
13496       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13497         ArgStorage = getSema().Context.getPackExpansionType(
13498             getSema().Context.getTypeDeclType(TTPD), None);
13499       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13500         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13501       } else {
13502         auto *VD = cast<ValueDecl>(Pack);
13503         ExprResult DRE = getSema().BuildDeclRefExpr(
13504             VD, VD->getType().getNonLValueExprType(getSema().Context),
13505             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13506             E->getPackLoc());
13507         if (DRE.isInvalid())
13508           return ExprError();
13509         ArgStorage = new (getSema().Context) PackExpansionExpr(
13510             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13511       }
13512       PackArgs = ArgStorage;
13513     }
13514   }
13515 
13516   // If we're not expanding the pack, just transform the decl.
13517   if (!PackArgs.size()) {
13518     auto *Pack = cast_or_null<NamedDecl>(
13519         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13520     if (!Pack)
13521       return ExprError();
13522     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13523                                               E->getPackLoc(),
13524                                               E->getRParenLoc(), None, None);
13525   }
13526 
13527   // Try to compute the result without performing a partial substitution.
13528   Optional<unsigned> Result = 0;
13529   for (const TemplateArgument &Arg : PackArgs) {
13530     if (!Arg.isPackExpansion()) {
13531       Result = *Result + 1;
13532       continue;
13533     }
13534 
13535     TemplateArgumentLoc ArgLoc;
13536     InventTemplateArgumentLoc(Arg, ArgLoc);
13537 
13538     // Find the pattern of the pack expansion.
13539     SourceLocation Ellipsis;
13540     Optional<unsigned> OrigNumExpansions;
13541     TemplateArgumentLoc Pattern =
13542         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13543                                                           OrigNumExpansions);
13544 
13545     // Substitute under the pack expansion. Do not expand the pack (yet).
13546     TemplateArgumentLoc OutPattern;
13547     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13548     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13549                                                /*Uneval*/ true))
13550       return true;
13551 
13552     // See if we can determine the number of arguments from the result.
13553     Optional<unsigned> NumExpansions =
13554         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13555     if (!NumExpansions) {
13556       // No: we must be in an alias template expansion, and we're going to need
13557       // to actually expand the packs.
13558       Result = None;
13559       break;
13560     }
13561 
13562     Result = *Result + *NumExpansions;
13563   }
13564 
13565   // Common case: we could determine the number of expansions without
13566   // substituting.
13567   if (Result)
13568     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13569                                               E->getPackLoc(),
13570                                               E->getRParenLoc(), *Result, None);
13571 
13572   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13573                                                E->getPackLoc());
13574   {
13575     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13576     typedef TemplateArgumentLocInventIterator<
13577         Derived, const TemplateArgument*> PackLocIterator;
13578     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13579                                    PackLocIterator(*this, PackArgs.end()),
13580                                    TransformedPackArgs, /*Uneval*/true))
13581       return ExprError();
13582   }
13583 
13584   // Check whether we managed to fully-expand the pack.
13585   // FIXME: Is it possible for us to do so and not hit the early exit path?
13586   SmallVector<TemplateArgument, 8> Args;
13587   bool PartialSubstitution = false;
13588   for (auto &Loc : TransformedPackArgs.arguments()) {
13589     Args.push_back(Loc.getArgument());
13590     if (Loc.getArgument().isPackExpansion())
13591       PartialSubstitution = true;
13592   }
13593 
13594   if (PartialSubstitution)
13595     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13596                                               E->getPackLoc(),
13597                                               E->getRParenLoc(), None, Args);
13598 
13599   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13600                                             E->getPackLoc(), E->getRParenLoc(),
13601                                             Args.size(), None);
13602 }
13603 
13604 template<typename Derived>
13605 ExprResult
13606 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13607                                           SubstNonTypeTemplateParmPackExpr *E) {
13608   // Default behavior is to do nothing with this transformation.
13609   return E;
13610 }
13611 
13612 template<typename Derived>
13613 ExprResult
13614 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13615                                           SubstNonTypeTemplateParmExpr *E) {
13616   // Default behavior is to do nothing with this transformation.
13617   return E;
13618 }
13619 
13620 template<typename Derived>
13621 ExprResult
13622 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13623   // Default behavior is to do nothing with this transformation.
13624   return E;
13625 }
13626 
13627 template<typename Derived>
13628 ExprResult
13629 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13630                                                   MaterializeTemporaryExpr *E) {
13631   return getDerived().TransformExpr(E->getSubExpr());
13632 }
13633 
13634 template<typename Derived>
13635 ExprResult
13636 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13637   UnresolvedLookupExpr *Callee = nullptr;
13638   if (Expr *OldCallee = E->getCallee()) {
13639     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13640     if (CalleeResult.isInvalid())
13641       return ExprError();
13642     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13643   }
13644 
13645   Expr *Pattern = E->getPattern();
13646 
13647   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13648   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13649   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13650 
13651   // Determine whether the set of unexpanded parameter packs can and should
13652   // be expanded.
13653   bool Expand = true;
13654   bool RetainExpansion = false;
13655   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13656                      NumExpansions = OrigNumExpansions;
13657   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13658                                            Pattern->getSourceRange(),
13659                                            Unexpanded,
13660                                            Expand, RetainExpansion,
13661                                            NumExpansions))
13662     return true;
13663 
13664   if (!Expand) {
13665     // Do not expand any packs here, just transform and rebuild a fold
13666     // expression.
13667     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13668 
13669     ExprResult LHS =
13670         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13671     if (LHS.isInvalid())
13672       return true;
13673 
13674     ExprResult RHS =
13675         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13676     if (RHS.isInvalid())
13677       return true;
13678 
13679     if (!getDerived().AlwaysRebuild() &&
13680         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13681       return E;
13682 
13683     return getDerived().RebuildCXXFoldExpr(
13684         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13685         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13686   }
13687 
13688   // Formally a fold expression expands to nested parenthesized expressions.
13689   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13690   // them.
13691   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13692     SemaRef.Diag(E->getEllipsisLoc(),
13693                  clang::diag::err_fold_expression_limit_exceeded)
13694         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13695         << E->getSourceRange();
13696     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13697     return ExprError();
13698   }
13699 
13700   // The transform has determined that we should perform an elementwise
13701   // expansion of the pattern. Do so.
13702   ExprResult Result = getDerived().TransformExpr(E->getInit());
13703   if (Result.isInvalid())
13704     return true;
13705   bool LeftFold = E->isLeftFold();
13706 
13707   // If we're retaining an expansion for a right fold, it is the innermost
13708   // component and takes the init (if any).
13709   if (!LeftFold && RetainExpansion) {
13710     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13711 
13712     ExprResult Out = getDerived().TransformExpr(Pattern);
13713     if (Out.isInvalid())
13714       return true;
13715 
13716     Result = getDerived().RebuildCXXFoldExpr(
13717         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13718         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13719     if (Result.isInvalid())
13720       return true;
13721   }
13722 
13723   for (unsigned I = 0; I != *NumExpansions; ++I) {
13724     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13725         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13726     ExprResult Out = getDerived().TransformExpr(Pattern);
13727     if (Out.isInvalid())
13728       return true;
13729 
13730     if (Out.get()->containsUnexpandedParameterPack()) {
13731       // We still have a pack; retain a pack expansion for this slice.
13732       Result = getDerived().RebuildCXXFoldExpr(
13733           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13734           E->getOperator(), E->getEllipsisLoc(),
13735           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13736           OrigNumExpansions);
13737     } else if (Result.isUsable()) {
13738       // We've got down to a single element; build a binary operator.
13739       Expr *LHS = LeftFold ? Result.get() : Out.get();
13740       Expr *RHS = LeftFold ? Out.get() : Result.get();
13741       if (Callee)
13742         Result = getDerived().RebuildCXXOperatorCallExpr(
13743             BinaryOperator::getOverloadedOperator(E->getOperator()),
13744             E->getEllipsisLoc(), Callee, LHS, RHS);
13745       else
13746         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13747                                                     E->getOperator(), LHS, RHS);
13748     } else
13749       Result = Out;
13750 
13751     if (Result.isInvalid())
13752       return true;
13753   }
13754 
13755   // If we're retaining an expansion for a left fold, it is the outermost
13756   // component and takes the complete expansion so far as its init (if any).
13757   if (LeftFold && RetainExpansion) {
13758     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13759 
13760     ExprResult Out = getDerived().TransformExpr(Pattern);
13761     if (Out.isInvalid())
13762       return true;
13763 
13764     Result = getDerived().RebuildCXXFoldExpr(
13765         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13766         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13767     if (Result.isInvalid())
13768       return true;
13769   }
13770 
13771   // If we had no init and an empty pack, and we're not retaining an expansion,
13772   // then produce a fallback value or error.
13773   if (Result.isUnset())
13774     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13775                                                 E->getOperator());
13776 
13777   return Result;
13778 }
13779 
13780 template<typename Derived>
13781 ExprResult
13782 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13783     CXXStdInitializerListExpr *E) {
13784   return getDerived().TransformExpr(E->getSubExpr());
13785 }
13786 
13787 template<typename Derived>
13788 ExprResult
13789 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13790   return SemaRef.MaybeBindToTemporary(E);
13791 }
13792 
13793 template<typename Derived>
13794 ExprResult
13795 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13796   return E;
13797 }
13798 
13799 template<typename Derived>
13800 ExprResult
13801 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13802   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13803   if (SubExpr.isInvalid())
13804     return ExprError();
13805 
13806   if (!getDerived().AlwaysRebuild() &&
13807       SubExpr.get() == E->getSubExpr())
13808     return E;
13809 
13810   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13811 }
13812 
13813 template<typename Derived>
13814 ExprResult
13815 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13816   // Transform each of the elements.
13817   SmallVector<Expr *, 8> Elements;
13818   bool ArgChanged = false;
13819   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13820                                   /*IsCall=*/false, Elements, &ArgChanged))
13821     return ExprError();
13822 
13823   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13824     return SemaRef.MaybeBindToTemporary(E);
13825 
13826   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13827                                               Elements.data(),
13828                                               Elements.size());
13829 }
13830 
13831 template<typename Derived>
13832 ExprResult
13833 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13834                                                     ObjCDictionaryLiteral *E) {
13835   // Transform each of the elements.
13836   SmallVector<ObjCDictionaryElement, 8> Elements;
13837   bool ArgChanged = false;
13838   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13839     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13840 
13841     if (OrigElement.isPackExpansion()) {
13842       // This key/value element is a pack expansion.
13843       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13844       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13845       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13846       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13847 
13848       // Determine whether the set of unexpanded parameter packs can
13849       // and should be expanded.
13850       bool Expand = true;
13851       bool RetainExpansion = false;
13852       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13853       Optional<unsigned> NumExpansions = OrigNumExpansions;
13854       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13855                                OrigElement.Value->getEndLoc());
13856       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13857                                                PatternRange, Unexpanded, Expand,
13858                                                RetainExpansion, NumExpansions))
13859         return ExprError();
13860 
13861       if (!Expand) {
13862         // The transform has determined that we should perform a simple
13863         // transformation on the pack expansion, producing another pack
13864         // expansion.
13865         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13866         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13867         if (Key.isInvalid())
13868           return ExprError();
13869 
13870         if (Key.get() != OrigElement.Key)
13871           ArgChanged = true;
13872 
13873         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13874         if (Value.isInvalid())
13875           return ExprError();
13876 
13877         if (Value.get() != OrigElement.Value)
13878           ArgChanged = true;
13879 
13880         ObjCDictionaryElement Expansion = {
13881           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13882         };
13883         Elements.push_back(Expansion);
13884         continue;
13885       }
13886 
13887       // Record right away that the argument was changed.  This needs
13888       // to happen even if the array expands to nothing.
13889       ArgChanged = true;
13890 
13891       // The transform has determined that we should perform an elementwise
13892       // expansion of the pattern. Do so.
13893       for (unsigned I = 0; I != *NumExpansions; ++I) {
13894         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13895         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13896         if (Key.isInvalid())
13897           return ExprError();
13898 
13899         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13900         if (Value.isInvalid())
13901           return ExprError();
13902 
13903         ObjCDictionaryElement Element = {
13904           Key.get(), Value.get(), SourceLocation(), NumExpansions
13905         };
13906 
13907         // If any unexpanded parameter packs remain, we still have a
13908         // pack expansion.
13909         // FIXME: Can this really happen?
13910         if (Key.get()->containsUnexpandedParameterPack() ||
13911             Value.get()->containsUnexpandedParameterPack())
13912           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13913 
13914         Elements.push_back(Element);
13915       }
13916 
13917       // FIXME: Retain a pack expansion if RetainExpansion is true.
13918 
13919       // We've finished with this pack expansion.
13920       continue;
13921     }
13922 
13923     // Transform and check key.
13924     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13925     if (Key.isInvalid())
13926       return ExprError();
13927 
13928     if (Key.get() != OrigElement.Key)
13929       ArgChanged = true;
13930 
13931     // Transform and check value.
13932     ExprResult Value
13933       = getDerived().TransformExpr(OrigElement.Value);
13934     if (Value.isInvalid())
13935       return ExprError();
13936 
13937     if (Value.get() != OrigElement.Value)
13938       ArgChanged = true;
13939 
13940     ObjCDictionaryElement Element = {
13941       Key.get(), Value.get(), SourceLocation(), None
13942     };
13943     Elements.push_back(Element);
13944   }
13945 
13946   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13947     return SemaRef.MaybeBindToTemporary(E);
13948 
13949   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13950                                                    Elements);
13951 }
13952 
13953 template<typename Derived>
13954 ExprResult
13955 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13956   TypeSourceInfo *EncodedTypeInfo
13957     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13958   if (!EncodedTypeInfo)
13959     return ExprError();
13960 
13961   if (!getDerived().AlwaysRebuild() &&
13962       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13963     return E;
13964 
13965   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13966                                             EncodedTypeInfo,
13967                                             E->getRParenLoc());
13968 }
13969 
13970 template<typename Derived>
13971 ExprResult TreeTransform<Derived>::
13972 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13973   // This is a kind of implicit conversion, and it needs to get dropped
13974   // and recomputed for the same general reasons that ImplicitCastExprs
13975   // do, as well a more specific one: this expression is only valid when
13976   // it appears *immediately* as an argument expression.
13977   return getDerived().TransformExpr(E->getSubExpr());
13978 }
13979 
13980 template<typename Derived>
13981 ExprResult TreeTransform<Derived>::
13982 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13983   TypeSourceInfo *TSInfo
13984     = getDerived().TransformType(E->getTypeInfoAsWritten());
13985   if (!TSInfo)
13986     return ExprError();
13987 
13988   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13989   if (Result.isInvalid())
13990     return ExprError();
13991 
13992   if (!getDerived().AlwaysRebuild() &&
13993       TSInfo == E->getTypeInfoAsWritten() &&
13994       Result.get() == E->getSubExpr())
13995     return E;
13996 
13997   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13998                                       E->getBridgeKeywordLoc(), TSInfo,
13999                                       Result.get());
14000 }
14001 
14002 template <typename Derived>
14003 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
14004     ObjCAvailabilityCheckExpr *E) {
14005   return E;
14006 }
14007 
14008 template<typename Derived>
14009 ExprResult
14010 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
14011   // Transform arguments.
14012   bool ArgChanged = false;
14013   SmallVector<Expr*, 8> Args;
14014   Args.reserve(E->getNumArgs());
14015   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
14016                                   &ArgChanged))
14017     return ExprError();
14018 
14019   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
14020     // Class message: transform the receiver type.
14021     TypeSourceInfo *ReceiverTypeInfo
14022       = getDerived().TransformType(E->getClassReceiverTypeInfo());
14023     if (!ReceiverTypeInfo)
14024       return ExprError();
14025 
14026     // If nothing changed, just retain the existing message send.
14027     if (!getDerived().AlwaysRebuild() &&
14028         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
14029       return SemaRef.MaybeBindToTemporary(E);
14030 
14031     // Build a new class message send.
14032     SmallVector<SourceLocation, 16> SelLocs;
14033     E->getSelectorLocs(SelLocs);
14034     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
14035                                                E->getSelector(),
14036                                                SelLocs,
14037                                                E->getMethodDecl(),
14038                                                E->getLeftLoc(),
14039                                                Args,
14040                                                E->getRightLoc());
14041   }
14042   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
14043            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
14044     if (!E->getMethodDecl())
14045       return ExprError();
14046 
14047     // Build a new class message send to 'super'.
14048     SmallVector<SourceLocation, 16> SelLocs;
14049     E->getSelectorLocs(SelLocs);
14050     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
14051                                                E->getSelector(),
14052                                                SelLocs,
14053                                                E->getReceiverType(),
14054                                                E->getMethodDecl(),
14055                                                E->getLeftLoc(),
14056                                                Args,
14057                                                E->getRightLoc());
14058   }
14059 
14060   // Instance message: transform the receiver
14061   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14062          "Only class and instance messages may be instantiated");
14063   ExprResult Receiver
14064     = getDerived().TransformExpr(E->getInstanceReceiver());
14065   if (Receiver.isInvalid())
14066     return ExprError();
14067 
14068   // If nothing changed, just retain the existing message send.
14069   if (!getDerived().AlwaysRebuild() &&
14070       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14071     return SemaRef.MaybeBindToTemporary(E);
14072 
14073   // Build a new instance message send.
14074   SmallVector<SourceLocation, 16> SelLocs;
14075   E->getSelectorLocs(SelLocs);
14076   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14077                                              E->getSelector(),
14078                                              SelLocs,
14079                                              E->getMethodDecl(),
14080                                              E->getLeftLoc(),
14081                                              Args,
14082                                              E->getRightLoc());
14083 }
14084 
14085 template<typename Derived>
14086 ExprResult
14087 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14088   return E;
14089 }
14090 
14091 template<typename Derived>
14092 ExprResult
14093 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14094   return E;
14095 }
14096 
14097 template<typename Derived>
14098 ExprResult
14099 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14100   // Transform the base expression.
14101   ExprResult Base = getDerived().TransformExpr(E->getBase());
14102   if (Base.isInvalid())
14103     return ExprError();
14104 
14105   // We don't need to transform the ivar; it will never change.
14106 
14107   // If nothing changed, just retain the existing expression.
14108   if (!getDerived().AlwaysRebuild() &&
14109       Base.get() == E->getBase())
14110     return E;
14111 
14112   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14113                                              E->getLocation(),
14114                                              E->isArrow(), E->isFreeIvar());
14115 }
14116 
14117 template<typename Derived>
14118 ExprResult
14119 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14120   // 'super' and types never change. Property never changes. Just
14121   // retain the existing expression.
14122   if (!E->isObjectReceiver())
14123     return E;
14124 
14125   // Transform the base expression.
14126   ExprResult Base = getDerived().TransformExpr(E->getBase());
14127   if (Base.isInvalid())
14128     return ExprError();
14129 
14130   // We don't need to transform the property; it will never change.
14131 
14132   // If nothing changed, just retain the existing expression.
14133   if (!getDerived().AlwaysRebuild() &&
14134       Base.get() == E->getBase())
14135     return E;
14136 
14137   if (E->isExplicitProperty())
14138     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14139                                                    E->getExplicitProperty(),
14140                                                    E->getLocation());
14141 
14142   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14143                                                  SemaRef.Context.PseudoObjectTy,
14144                                                  E->getImplicitPropertyGetter(),
14145                                                  E->getImplicitPropertySetter(),
14146                                                  E->getLocation());
14147 }
14148 
14149 template<typename Derived>
14150 ExprResult
14151 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14152   // Transform the base expression.
14153   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14154   if (Base.isInvalid())
14155     return ExprError();
14156 
14157   // Transform the key expression.
14158   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14159   if (Key.isInvalid())
14160     return ExprError();
14161 
14162   // If nothing changed, just retain the existing expression.
14163   if (!getDerived().AlwaysRebuild() &&
14164       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14165     return E;
14166 
14167   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14168                                                   Base.get(), Key.get(),
14169                                                   E->getAtIndexMethodDecl(),
14170                                                   E->setAtIndexMethodDecl());
14171 }
14172 
14173 template<typename Derived>
14174 ExprResult
14175 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14176   // Transform the base expression.
14177   ExprResult Base = getDerived().TransformExpr(E->getBase());
14178   if (Base.isInvalid())
14179     return ExprError();
14180 
14181   // If nothing changed, just retain the existing expression.
14182   if (!getDerived().AlwaysRebuild() &&
14183       Base.get() == E->getBase())
14184     return E;
14185 
14186   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14187                                          E->getOpLoc(),
14188                                          E->isArrow());
14189 }
14190 
14191 template<typename Derived>
14192 ExprResult
14193 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14194   bool ArgumentChanged = false;
14195   SmallVector<Expr*, 8> SubExprs;
14196   SubExprs.reserve(E->getNumSubExprs());
14197   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14198                                   SubExprs, &ArgumentChanged))
14199     return ExprError();
14200 
14201   if (!getDerived().AlwaysRebuild() &&
14202       !ArgumentChanged)
14203     return E;
14204 
14205   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14206                                                SubExprs,
14207                                                E->getRParenLoc());
14208 }
14209 
14210 template<typename Derived>
14211 ExprResult
14212 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14213   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14214   if (SrcExpr.isInvalid())
14215     return ExprError();
14216 
14217   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14218   if (!Type)
14219     return ExprError();
14220 
14221   if (!getDerived().AlwaysRebuild() &&
14222       Type == E->getTypeSourceInfo() &&
14223       SrcExpr.get() == E->getSrcExpr())
14224     return E;
14225 
14226   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14227                                                SrcExpr.get(), Type,
14228                                                E->getRParenLoc());
14229 }
14230 
14231 template<typename Derived>
14232 ExprResult
14233 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14234   BlockDecl *oldBlock = E->getBlockDecl();
14235 
14236   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14237   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14238 
14239   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14240   blockScope->TheDecl->setBlockMissingReturnType(
14241                          oldBlock->blockMissingReturnType());
14242 
14243   SmallVector<ParmVarDecl*, 4> params;
14244   SmallVector<QualType, 4> paramTypes;
14245 
14246   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14247 
14248   // Parameter substitution.
14249   Sema::ExtParameterInfoBuilder extParamInfos;
14250   if (getDerived().TransformFunctionTypeParams(
14251           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14252           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14253           extParamInfos)) {
14254     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14255     return ExprError();
14256   }
14257 
14258   QualType exprResultType =
14259       getDerived().TransformType(exprFunctionType->getReturnType());
14260 
14261   auto epi = exprFunctionType->getExtProtoInfo();
14262   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14263 
14264   QualType functionType =
14265     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14266   blockScope->FunctionType = functionType;
14267 
14268   // Set the parameters on the block decl.
14269   if (!params.empty())
14270     blockScope->TheDecl->setParams(params);
14271 
14272   if (!oldBlock->blockMissingReturnType()) {
14273     blockScope->HasImplicitReturnType = false;
14274     blockScope->ReturnType = exprResultType;
14275   }
14276 
14277   // Transform the body
14278   StmtResult body = getDerived().TransformStmt(E->getBody());
14279   if (body.isInvalid()) {
14280     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14281     return ExprError();
14282   }
14283 
14284 #ifndef NDEBUG
14285   // In builds with assertions, make sure that we captured everything we
14286   // captured before.
14287   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14288     for (const auto &I : oldBlock->captures()) {
14289       VarDecl *oldCapture = I.getVariable();
14290 
14291       // Ignore parameter packs.
14292       if (oldCapture->isParameterPack())
14293         continue;
14294 
14295       VarDecl *newCapture =
14296         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14297                                                  oldCapture));
14298       assert(blockScope->CaptureMap.count(newCapture));
14299     }
14300     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14301   }
14302 #endif
14303 
14304   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14305                                     /*Scope=*/nullptr);
14306 }
14307 
14308 template<typename Derived>
14309 ExprResult
14310 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14311   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14312   if (SrcExpr.isInvalid())
14313     return ExprError();
14314 
14315   QualType Type = getDerived().TransformType(E->getType());
14316 
14317   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14318                                  E->getRParenLoc());
14319 }
14320 
14321 template<typename Derived>
14322 ExprResult
14323 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14324   bool ArgumentChanged = false;
14325   SmallVector<Expr*, 8> SubExprs;
14326   SubExprs.reserve(E->getNumSubExprs());
14327   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14328                                   SubExprs, &ArgumentChanged))
14329     return ExprError();
14330 
14331   if (!getDerived().AlwaysRebuild() &&
14332       !ArgumentChanged)
14333     return E;
14334 
14335   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14336                                         E->getOp(), E->getRParenLoc());
14337 }
14338 
14339 //===----------------------------------------------------------------------===//
14340 // Type reconstruction
14341 //===----------------------------------------------------------------------===//
14342 
14343 template<typename Derived>
14344 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14345                                                     SourceLocation Star) {
14346   return SemaRef.BuildPointerType(PointeeType, Star,
14347                                   getDerived().getBaseEntity());
14348 }
14349 
14350 template<typename Derived>
14351 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14352                                                          SourceLocation Star) {
14353   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14354                                        getDerived().getBaseEntity());
14355 }
14356 
14357 template<typename Derived>
14358 QualType
14359 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14360                                              bool WrittenAsLValue,
14361                                              SourceLocation Sigil) {
14362   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14363                                     Sigil, getDerived().getBaseEntity());
14364 }
14365 
14366 template<typename Derived>
14367 QualType
14368 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14369                                                  QualType ClassType,
14370                                                  SourceLocation Sigil) {
14371   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14372                                         getDerived().getBaseEntity());
14373 }
14374 
14375 template<typename Derived>
14376 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14377            const ObjCTypeParamDecl *Decl,
14378            SourceLocation ProtocolLAngleLoc,
14379            ArrayRef<ObjCProtocolDecl *> Protocols,
14380            ArrayRef<SourceLocation> ProtocolLocs,
14381            SourceLocation ProtocolRAngleLoc) {
14382   return SemaRef.BuildObjCTypeParamType(Decl,
14383                                         ProtocolLAngleLoc, Protocols,
14384                                         ProtocolLocs, ProtocolRAngleLoc,
14385                                         /*FailOnError=*/true);
14386 }
14387 
14388 template<typename Derived>
14389 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14390            QualType BaseType,
14391            SourceLocation Loc,
14392            SourceLocation TypeArgsLAngleLoc,
14393            ArrayRef<TypeSourceInfo *> TypeArgs,
14394            SourceLocation TypeArgsRAngleLoc,
14395            SourceLocation ProtocolLAngleLoc,
14396            ArrayRef<ObjCProtocolDecl *> Protocols,
14397            ArrayRef<SourceLocation> ProtocolLocs,
14398            SourceLocation ProtocolRAngleLoc) {
14399   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14400                                      TypeArgs, TypeArgsRAngleLoc,
14401                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14402                                      ProtocolRAngleLoc,
14403                                      /*FailOnError=*/true);
14404 }
14405 
14406 template<typename Derived>
14407 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14408            QualType PointeeType,
14409            SourceLocation Star) {
14410   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14411 }
14412 
14413 template<typename Derived>
14414 QualType
14415 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14416                                          ArrayType::ArraySizeModifier SizeMod,
14417                                          const llvm::APInt *Size,
14418                                          Expr *SizeExpr,
14419                                          unsigned IndexTypeQuals,
14420                                          SourceRange BracketsRange) {
14421   if (SizeExpr || !Size)
14422     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14423                                   IndexTypeQuals, BracketsRange,
14424                                   getDerived().getBaseEntity());
14425 
14426   QualType Types[] = {
14427     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14428     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14429     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14430   };
14431   const unsigned NumTypes = llvm::array_lengthof(Types);
14432   QualType SizeType;
14433   for (unsigned I = 0; I != NumTypes; ++I)
14434     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14435       SizeType = Types[I];
14436       break;
14437     }
14438 
14439   // Note that we can return a VariableArrayType here in the case where
14440   // the element type was a dependent VariableArrayType.
14441   IntegerLiteral *ArraySize
14442       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14443                                /*FIXME*/BracketsRange.getBegin());
14444   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14445                                 IndexTypeQuals, BracketsRange,
14446                                 getDerived().getBaseEntity());
14447 }
14448 
14449 template<typename Derived>
14450 QualType
14451 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14452                                                  ArrayType::ArraySizeModifier SizeMod,
14453                                                  const llvm::APInt &Size,
14454                                                  Expr *SizeExpr,
14455                                                  unsigned IndexTypeQuals,
14456                                                  SourceRange BracketsRange) {
14457   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14458                                         IndexTypeQuals, BracketsRange);
14459 }
14460 
14461 template<typename Derived>
14462 QualType
14463 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14464                                           ArrayType::ArraySizeModifier SizeMod,
14465                                                  unsigned IndexTypeQuals,
14466                                                    SourceRange BracketsRange) {
14467   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14468                                        IndexTypeQuals, BracketsRange);
14469 }
14470 
14471 template<typename Derived>
14472 QualType
14473 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14474                                           ArrayType::ArraySizeModifier SizeMod,
14475                                                  Expr *SizeExpr,
14476                                                  unsigned IndexTypeQuals,
14477                                                  SourceRange BracketsRange) {
14478   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14479                                        SizeExpr,
14480                                        IndexTypeQuals, BracketsRange);
14481 }
14482 
14483 template<typename Derived>
14484 QualType
14485 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14486                                           ArrayType::ArraySizeModifier SizeMod,
14487                                                        Expr *SizeExpr,
14488                                                        unsigned IndexTypeQuals,
14489                                                    SourceRange BracketsRange) {
14490   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14491                                        SizeExpr,
14492                                        IndexTypeQuals, BracketsRange);
14493 }
14494 
14495 template <typename Derived>
14496 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14497     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14498   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14499                                           AttributeLoc);
14500 }
14501 
14502 template <typename Derived>
14503 QualType
14504 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14505                                           unsigned NumElements,
14506                                           VectorType::VectorKind VecKind) {
14507   // FIXME: semantic checking!
14508   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14509 }
14510 
14511 template <typename Derived>
14512 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14513     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14514     VectorType::VectorKind VecKind) {
14515   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14516 }
14517 
14518 template<typename Derived>
14519 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14520                                                       unsigned NumElements,
14521                                                  SourceLocation AttributeLoc) {
14522   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14523                           NumElements, true);
14524   IntegerLiteral *VectorSize
14525     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14526                              AttributeLoc);
14527   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14528 }
14529 
14530 template<typename Derived>
14531 QualType
14532 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14533                                                            Expr *SizeExpr,
14534                                                   SourceLocation AttributeLoc) {
14535   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14536 }
14537 
14538 template <typename Derived>
14539 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14540     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14541   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14542                                                NumColumns);
14543 }
14544 
14545 template <typename Derived>
14546 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14547     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14548     SourceLocation AttributeLoc) {
14549   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14550                                  AttributeLoc);
14551 }
14552 
14553 template<typename Derived>
14554 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14555     QualType T,
14556     MutableArrayRef<QualType> ParamTypes,
14557     const FunctionProtoType::ExtProtoInfo &EPI) {
14558   return SemaRef.BuildFunctionType(T, ParamTypes,
14559                                    getDerived().getBaseLocation(),
14560                                    getDerived().getBaseEntity(),
14561                                    EPI);
14562 }
14563 
14564 template<typename Derived>
14565 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14566   return SemaRef.Context.getFunctionNoProtoType(T);
14567 }
14568 
14569 template<typename Derived>
14570 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14571                                                             Decl *D) {
14572   assert(D && "no decl found");
14573   if (D->isInvalidDecl()) return QualType();
14574 
14575   // FIXME: Doesn't account for ObjCInterfaceDecl!
14576   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14577     // A valid resolved using typename pack expansion decl can have multiple
14578     // UsingDecls, but they must each have exactly one type, and it must be
14579     // the same type in every case. But we must have at least one expansion!
14580     if (UPD->expansions().empty()) {
14581       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14582           << UPD->isCXXClassMember() << UPD;
14583       return QualType();
14584     }
14585 
14586     // We might still have some unresolved types. Try to pick a resolved type
14587     // if we can. The final instantiation will check that the remaining
14588     // unresolved types instantiate to the type we pick.
14589     QualType FallbackT;
14590     QualType T;
14591     for (auto *E : UPD->expansions()) {
14592       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14593       if (ThisT.isNull())
14594         continue;
14595       else if (ThisT->getAs<UnresolvedUsingType>())
14596         FallbackT = ThisT;
14597       else if (T.isNull())
14598         T = ThisT;
14599       else
14600         assert(getSema().Context.hasSameType(ThisT, T) &&
14601                "mismatched resolved types in using pack expansion");
14602     }
14603     return T.isNull() ? FallbackT : T;
14604   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14605     assert(Using->hasTypename() &&
14606            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14607 
14608     // A valid resolved using typename decl points to exactly one type decl.
14609     assert(++Using->shadow_begin() == Using->shadow_end());
14610 
14611     UsingShadowDecl *Shadow = *Using->shadow_begin();
14612     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14613       return QualType();
14614     return SemaRef.Context.getUsingType(
14615         Shadow, SemaRef.Context.getTypeDeclType(
14616                     cast<TypeDecl>(Shadow->getTargetDecl())));
14617   } else {
14618     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14619            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14620     return SemaRef.Context.getTypeDeclType(
14621         cast<UnresolvedUsingTypenameDecl>(D));
14622   }
14623 }
14624 
14625 template <typename Derived>
14626 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14627                                                        SourceLocation) {
14628   return SemaRef.BuildTypeofExprType(E);
14629 }
14630 
14631 template<typename Derived>
14632 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14633   return SemaRef.Context.getTypeOfType(Underlying);
14634 }
14635 
14636 template <typename Derived>
14637 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14638   return SemaRef.BuildDecltypeType(E);
14639 }
14640 
14641 template<typename Derived>
14642 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14643                                             UnaryTransformType::UTTKind UKind,
14644                                             SourceLocation Loc) {
14645   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14646 }
14647 
14648 template<typename Derived>
14649 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14650                                                       TemplateName Template,
14651                                              SourceLocation TemplateNameLoc,
14652                                      TemplateArgumentListInfo &TemplateArgs) {
14653   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14654 }
14655 
14656 template<typename Derived>
14657 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14658                                                    SourceLocation KWLoc) {
14659   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14660 }
14661 
14662 template<typename Derived>
14663 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14664                                                  SourceLocation KWLoc,
14665                                                  bool isReadPipe) {
14666   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14667                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14668 }
14669 
14670 template <typename Derived>
14671 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14672                                                    unsigned NumBits,
14673                                                    SourceLocation Loc) {
14674   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14675                         NumBits, true);
14676   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14677                                                 SemaRef.Context.IntTy, Loc);
14678   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14679 }
14680 
14681 template <typename Derived>
14682 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14683     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14684   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14685 }
14686 
14687 template<typename Derived>
14688 TemplateName
14689 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14690                                             bool TemplateKW,
14691                                             TemplateDecl *Template) {
14692   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14693                                                   Template);
14694 }
14695 
14696 template<typename Derived>
14697 TemplateName
14698 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14699                                             SourceLocation TemplateKWLoc,
14700                                             const IdentifierInfo &Name,
14701                                             SourceLocation NameLoc,
14702                                             QualType ObjectType,
14703                                             NamedDecl *FirstQualifierInScope,
14704                                             bool AllowInjectedClassName) {
14705   UnqualifiedId TemplateName;
14706   TemplateName.setIdentifier(&Name, NameLoc);
14707   Sema::TemplateTy Template;
14708   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14709                               TemplateName, ParsedType::make(ObjectType),
14710                               /*EnteringContext=*/false, Template,
14711                               AllowInjectedClassName);
14712   return Template.get();
14713 }
14714 
14715 template<typename Derived>
14716 TemplateName
14717 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14718                                             SourceLocation TemplateKWLoc,
14719                                             OverloadedOperatorKind Operator,
14720                                             SourceLocation NameLoc,
14721                                             QualType ObjectType,
14722                                             bool AllowInjectedClassName) {
14723   UnqualifiedId Name;
14724   // FIXME: Bogus location information.
14725   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14726   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14727   Sema::TemplateTy Template;
14728   getSema().ActOnTemplateName(
14729       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14730       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14731   return Template.get();
14732 }
14733 
14734 template<typename Derived>
14735 ExprResult
14736 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14737                                                    SourceLocation OpLoc,
14738                                                    Expr *OrigCallee,
14739                                                    Expr *First,
14740                                                    Expr *Second) {
14741   Expr *Callee = OrigCallee->IgnoreParenCasts();
14742   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14743 
14744   if (First->getObjectKind() == OK_ObjCProperty) {
14745     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14746     if (BinaryOperator::isAssignmentOp(Opc))
14747       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14748                                                  First, Second);
14749     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14750     if (Result.isInvalid())
14751       return ExprError();
14752     First = Result.get();
14753   }
14754 
14755   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14756     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14757     if (Result.isInvalid())
14758       return ExprError();
14759     Second = Result.get();
14760   }
14761 
14762   // Determine whether this should be a builtin operation.
14763   if (Op == OO_Subscript) {
14764     if (!First->getType()->isOverloadableType() &&
14765         !Second->getType()->isOverloadableType())
14766       return getSema().CreateBuiltinArraySubscriptExpr(
14767           First, Callee->getBeginLoc(), Second, OpLoc);
14768   } else if (Op == OO_Arrow) {
14769     // It is possible that the type refers to a RecoveryExpr created earlier
14770     // in the tree transformation.
14771     if (First->getType()->isDependentType())
14772       return ExprError();
14773     // -> is never a builtin operation.
14774     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14775   } else if (Second == nullptr || isPostIncDec) {
14776     if (!First->getType()->isOverloadableType() ||
14777         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14778       // The argument is not of overloadable type, or this is an expression
14779       // of the form &Class::member, so try to create a built-in unary
14780       // operation.
14781       UnaryOperatorKind Opc
14782         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14783 
14784       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14785     }
14786   } else {
14787     if (!First->getType()->isOverloadableType() &&
14788         !Second->getType()->isOverloadableType()) {
14789       // Neither of the arguments is an overloadable type, so try to
14790       // create a built-in binary operation.
14791       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14792       ExprResult Result
14793         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14794       if (Result.isInvalid())
14795         return ExprError();
14796 
14797       return Result;
14798     }
14799   }
14800 
14801   // Compute the transformed set of functions (and function templates) to be
14802   // used during overload resolution.
14803   UnresolvedSet<16> Functions;
14804   bool RequiresADL;
14805 
14806   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14807     Functions.append(ULE->decls_begin(), ULE->decls_end());
14808     // If the overload could not be resolved in the template definition
14809     // (because we had a dependent argument), ADL is performed as part of
14810     // template instantiation.
14811     RequiresADL = ULE->requiresADL();
14812   } else {
14813     // If we've resolved this to a particular non-member function, just call
14814     // that function. If we resolved it to a member function,
14815     // CreateOverloaded* will find that function for us.
14816     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14817     if (!isa<CXXMethodDecl>(ND))
14818       Functions.addDecl(ND);
14819     RequiresADL = false;
14820   }
14821 
14822   // Add any functions found via argument-dependent lookup.
14823   Expr *Args[2] = { First, Second };
14824   unsigned NumArgs = 1 + (Second != nullptr);
14825 
14826   // Create the overloaded operator invocation for unary operators.
14827   if (NumArgs == 1 || isPostIncDec) {
14828     UnaryOperatorKind Opc
14829       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14830     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14831                                            RequiresADL);
14832   }
14833 
14834   if (Op == OO_Subscript) {
14835     SourceLocation LBrace;
14836     SourceLocation RBrace;
14837 
14838     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14839       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14840       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14841       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14842     } else {
14843       LBrace = Callee->getBeginLoc();
14844       RBrace = OpLoc;
14845     }
14846 
14847     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14848                                                       First, Second);
14849   }
14850 
14851   // Create the overloaded operator invocation for binary operators.
14852   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14853   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14854       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14855   if (Result.isInvalid())
14856     return ExprError();
14857 
14858   return Result;
14859 }
14860 
14861 template<typename Derived>
14862 ExprResult
14863 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14864                                                      SourceLocation OperatorLoc,
14865                                                        bool isArrow,
14866                                                        CXXScopeSpec &SS,
14867                                                      TypeSourceInfo *ScopeType,
14868                                                        SourceLocation CCLoc,
14869                                                        SourceLocation TildeLoc,
14870                                         PseudoDestructorTypeStorage Destroyed) {
14871   QualType BaseType = Base->getType();
14872   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14873       (!isArrow && !BaseType->getAs<RecordType>()) ||
14874       (isArrow && BaseType->getAs<PointerType>() &&
14875        !BaseType->castAs<PointerType>()->getPointeeType()
14876                                               ->template getAs<RecordType>())){
14877     // This pseudo-destructor expression is still a pseudo-destructor.
14878     return SemaRef.BuildPseudoDestructorExpr(
14879         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14880         CCLoc, TildeLoc, Destroyed);
14881   }
14882 
14883   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14884   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14885                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14886   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14887   NameInfo.setNamedTypeInfo(DestroyedType);
14888 
14889   // The scope type is now known to be a valid nested name specifier
14890   // component. Tack it on to the end of the nested name specifier.
14891   if (ScopeType) {
14892     if (!ScopeType->getType()->getAs<TagType>()) {
14893       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14894                      diag::err_expected_class_or_namespace)
14895           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14896       return ExprError();
14897     }
14898     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14899               CCLoc);
14900   }
14901 
14902   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14903   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14904                                             OperatorLoc, isArrow,
14905                                             SS, TemplateKWLoc,
14906                                             /*FIXME: FirstQualifier*/ nullptr,
14907                                             NameInfo,
14908                                             /*TemplateArgs*/ nullptr,
14909                                             /*S*/nullptr);
14910 }
14911 
14912 template<typename Derived>
14913 StmtResult
14914 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14915   SourceLocation Loc = S->getBeginLoc();
14916   CapturedDecl *CD = S->getCapturedDecl();
14917   unsigned NumParams = CD->getNumParams();
14918   unsigned ContextParamPos = CD->getContextParamPosition();
14919   SmallVector<Sema::CapturedParamNameType, 4> Params;
14920   for (unsigned I = 0; I < NumParams; ++I) {
14921     if (I != ContextParamPos) {
14922       Params.push_back(
14923              std::make_pair(
14924                   CD->getParam(I)->getName(),
14925                   getDerived().TransformType(CD->getParam(I)->getType())));
14926     } else {
14927       Params.push_back(std::make_pair(StringRef(), QualType()));
14928     }
14929   }
14930   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14931                                      S->getCapturedRegionKind(), Params);
14932   StmtResult Body;
14933   {
14934     Sema::CompoundScopeRAII CompoundScope(getSema());
14935     Body = getDerived().TransformStmt(S->getCapturedStmt());
14936   }
14937 
14938   if (Body.isInvalid()) {
14939     getSema().ActOnCapturedRegionError();
14940     return StmtError();
14941   }
14942 
14943   return getSema().ActOnCapturedRegionEnd(Body.get());
14944 }
14945 
14946 } // end namespace clang
14947 
14948 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14949