xref: /openbsd/gnu/llvm/clang/lib/Sema/TreeTransform.h (revision 12c85518)
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 #include <optional>
44 
45 using namespace llvm::omp;
46 
47 namespace clang {
48 using namespace sema;
49 
50 /// A semantic tree transformation that allows one to transform one
51 /// abstract syntax tree into another.
52 ///
53 /// A new tree transformation is defined by creating a new subclass \c X of
54 /// \c TreeTransform<X> and then overriding certain operations to provide
55 /// behavior specific to that transformation. For example, template
56 /// instantiation is implemented as a tree transformation where the
57 /// transformation of TemplateTypeParmType nodes involves substituting the
58 /// template arguments for their corresponding template parameters; a similar
59 /// transformation is performed for non-type template parameters and
60 /// template template parameters.
61 ///
62 /// This tree-transformation template uses static polymorphism to allow
63 /// subclasses to customize any of its operations. Thus, a subclass can
64 /// override any of the transformation or rebuild operators by providing an
65 /// operation with the same signature as the default implementation. The
66 /// overriding function should not be virtual.
67 ///
68 /// Semantic tree transformations are split into two stages, either of which
69 /// can be replaced by a subclass. The "transform" step transforms an AST node
70 /// or the parts of an AST node using the various transformation functions,
71 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
72 /// node of the appropriate kind from the pieces. The default transformation
73 /// routines recursively transform the operands to composite AST nodes (e.g.,
74 /// the pointee type of a PointerType node) and, if any of those operand nodes
75 /// were changed by the transformation, invokes the rebuild operation to create
76 /// a new AST node.
77 ///
78 /// Subclasses can customize the transformation at various levels. The
79 /// most coarse-grained transformations involve replacing TransformType(),
80 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
81 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
82 /// new implementations.
83 ///
84 /// For more fine-grained transformations, subclasses can replace any of the
85 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
86 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
87 /// replacing TransformTemplateTypeParmType() allows template instantiation
88 /// to substitute template arguments for their corresponding template
89 /// parameters. Additionally, subclasses can override the \c RebuildXXX
90 /// functions to control how AST nodes are rebuilt when their operands change.
91 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
92 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
93 /// be able to use more efficient rebuild steps.
94 ///
95 /// There are a handful of other functions that can be overridden, allowing one
96 /// to avoid traversing nodes that don't need any transformation
97 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
98 /// operands have not changed (\c AlwaysRebuild()), and customize the
99 /// default locations and entity names used for type-checking
100 /// (\c getBaseLocation(), \c getBaseEntity()).
101 template<typename Derived>
102 class TreeTransform {
103   /// Private RAII object that helps us forget and then re-remember
104   /// the template argument corresponding to a partially-substituted parameter
105   /// pack.
106   class ForgetPartiallySubstitutedPackRAII {
107     Derived &Self;
108     TemplateArgument Old;
109 
110   public:
ForgetPartiallySubstitutedPackRAII(Derived & Self)111     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
112       Old = Self.ForgetPartiallySubstitutedPack();
113     }
114 
~ForgetPartiallySubstitutedPackRAII()115     ~ForgetPartiallySubstitutedPackRAII() {
116       Self.RememberPartiallySubstitutedPack(Old);
117     }
118   };
119 
120 protected:
121   Sema &SemaRef;
122 
123   /// The set of local declarations that have been transformed, for
124   /// cases where we are forced to build new declarations within the transformer
125   /// rather than in the subclass (e.g., lambda closure types).
126   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
127 
128 public:
129   /// Initializes a new tree transformer.
TreeTransform(Sema & SemaRef)130   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
131 
132   /// Retrieves a reference to the derived class.
getDerived()133   Derived &getDerived() { return static_cast<Derived&>(*this); }
134 
135   /// Retrieves a reference to the derived class.
getDerived()136   const Derived &getDerived() const {
137     return static_cast<const Derived&>(*this);
138   }
139 
Owned(Expr * E)140   static inline ExprResult Owned(Expr *E) { return E; }
Owned(Stmt * S)141   static inline StmtResult Owned(Stmt *S) { return S; }
142 
143   /// Retrieves a reference to the semantic analysis object used for
144   /// this tree transform.
getSema()145   Sema &getSema() const { return SemaRef; }
146 
147   /// Whether the transformation should always rebuild AST nodes, even
148   /// if none of the children have changed.
149   ///
150   /// Subclasses may override this function to specify when the transformation
151   /// should rebuild all AST nodes.
152   ///
153   /// We must always rebuild all AST nodes when performing variadic template
154   /// pack expansion, in order to avoid violating the AST invariant that each
155   /// statement node appears at most once in its containing declaration.
AlwaysRebuild()156   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
157 
158   /// Whether the transformation is forming an expression or statement that
159   /// replaces the original. In this case, we'll reuse mangling numbers from
160   /// existing lambdas.
ReplacingOriginal()161   bool ReplacingOriginal() { return false; }
162 
163   /// Wether CXXConstructExpr can be skipped when they are implicit.
164   /// They will be reconstructed when used if needed.
165   /// This is useful when the user that cause rebuilding of the
166   /// CXXConstructExpr is outside of the expression at which the TreeTransform
167   /// started.
AllowSkippingCXXConstructExpr()168   bool AllowSkippingCXXConstructExpr() { return true; }
169 
170   /// Returns the location of the entity being transformed, if that
171   /// information was not available elsewhere in the AST.
172   ///
173   /// By default, returns no source-location information. Subclasses can
174   /// provide an alternative implementation that provides better location
175   /// information.
getBaseLocation()176   SourceLocation getBaseLocation() { return SourceLocation(); }
177 
178   /// Returns the name of the entity being transformed, if that
179   /// information was not available elsewhere in the AST.
180   ///
181   /// By default, returns an empty name. Subclasses can provide an alternative
182   /// implementation with a more precise name.
getBaseEntity()183   DeclarationName getBaseEntity() { return DeclarationName(); }
184 
185   /// Sets the "base" location and entity when that
186   /// information is known based on another transformation.
187   ///
188   /// By default, the source location and entity are ignored. Subclasses can
189   /// override this function to provide a customized implementation.
setBase(SourceLocation Loc,DeclarationName Entity)190   void setBase(SourceLocation Loc, DeclarationName Entity) { }
191 
192   /// RAII object that temporarily sets the base location and entity
193   /// used for reporting diagnostics in types.
194   class TemporaryBase {
195     TreeTransform &Self;
196     SourceLocation OldLocation;
197     DeclarationName OldEntity;
198 
199   public:
TemporaryBase(TreeTransform & Self,SourceLocation Location,DeclarationName Entity)200     TemporaryBase(TreeTransform &Self, SourceLocation Location,
201                   DeclarationName Entity) : Self(Self) {
202       OldLocation = Self.getDerived().getBaseLocation();
203       OldEntity = Self.getDerived().getBaseEntity();
204 
205       if (Location.isValid())
206         Self.getDerived().setBase(Location, Entity);
207     }
208 
~TemporaryBase()209     ~TemporaryBase() {
210       Self.getDerived().setBase(OldLocation, OldEntity);
211     }
212   };
213 
214   /// Determine whether the given type \p T has already been
215   /// transformed.
216   ///
217   /// Subclasses can provide an alternative implementation of this routine
218   /// to short-circuit evaluation when it is known that a given type will
219   /// not change. For example, template instantiation need not traverse
220   /// non-dependent types.
AlreadyTransformed(QualType T)221   bool AlreadyTransformed(QualType T) {
222     return T.isNull();
223   }
224 
225   /// Transform a template parameter depth level.
226   ///
227   /// During a transformation that transforms template parameters, this maps
228   /// an old template parameter depth to a new depth.
TransformTemplateDepth(unsigned Depth)229   unsigned TransformTemplateDepth(unsigned Depth) {
230     return Depth;
231   }
232 
233   /// Determine whether the given call argument should be dropped, e.g.,
234   /// because it is a default argument.
235   ///
236   /// Subclasses can provide an alternative implementation of this routine to
237   /// determine which kinds of call arguments get dropped. By default,
238   /// CXXDefaultArgument nodes are dropped (prior to transformation).
DropCallArgument(Expr * E)239   bool DropCallArgument(Expr *E) {
240     return E->isDefaultArgument();
241   }
242 
243   /// Determine whether we should expand a pack expansion with the
244   /// given set of parameter packs into separate arguments by repeatedly
245   /// transforming the pattern.
246   ///
247   /// By default, the transformer never tries to expand pack expansions.
248   /// Subclasses can override this routine to provide different behavior.
249   ///
250   /// \param EllipsisLoc The location of the ellipsis that identifies the
251   /// pack expansion.
252   ///
253   /// \param PatternRange The source range that covers the entire pattern of
254   /// the pack expansion.
255   ///
256   /// \param Unexpanded The set of unexpanded parameter packs within the
257   /// pattern.
258   ///
259   /// \param ShouldExpand Will be set to \c true if the transformer should
260   /// expand the corresponding pack expansions into separate arguments. When
261   /// set, \c NumExpansions must also be set.
262   ///
263   /// \param RetainExpansion Whether the caller should add an unexpanded
264   /// pack expansion after all of the expanded arguments. This is used
265   /// when extending explicitly-specified template argument packs per
266   /// C++0x [temp.arg.explicit]p9.
267   ///
268   /// \param NumExpansions The number of separate arguments that will be in
269   /// the expanded form of the corresponding pack expansion. This is both an
270   /// input and an output parameter, which can be set by the caller if the
271   /// number of expansions is known a priori (e.g., due to a prior substitution)
272   /// and will be set by the callee when the number of expansions is known.
273   /// The callee must set this value when \c ShouldExpand is \c true; it may
274   /// set this value in other cases.
275   ///
276   /// \returns true if an error occurred (e.g., because the parameter packs
277   /// are to be instantiated with arguments of different lengths), false
278   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
279   /// must be set.
TryExpandParameterPacks(SourceLocation EllipsisLoc,SourceRange PatternRange,ArrayRef<UnexpandedParameterPack> Unexpanded,bool & ShouldExpand,bool & RetainExpansion,std::optional<unsigned> & NumExpansions)280   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
281                                SourceRange PatternRange,
282                                ArrayRef<UnexpandedParameterPack> Unexpanded,
283                                bool &ShouldExpand, bool &RetainExpansion,
284                                std::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.
ForgetPartiallySubstitutedPack()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.
RememberPartiallySubstitutedPack(TemplateArgument Arg)303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
ExpandingFunctionParameterPack(ParmVarDecl * Pack)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.
TransformDecl(SourceLocation Loc,Decl * D)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.
transformAttrs(Decl * Old,Decl * New)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.
transformedLocalDecl(Decl * Old,ArrayRef<Decl * > New)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.
TransformDefinition(SourceLocation Loc,Decl * D)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.
TransformFirstQualifierInScope(NamedDecl * D,SourceLocation Loc)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.
InventTypeSourceInfo(QualType T)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   QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
640                                          TemplateTypeParmTypeLoc TL,
641                                          bool SuppressObjCLifetime);
642   QualType
643   TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
644                                          SubstTemplateTypeParmPackTypeLoc TL,
645                                          bool SuppressObjCLifetime);
646 
647   template<typename Fn>
648   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
649                                       FunctionProtoTypeLoc TL,
650                                       CXXRecordDecl *ThisContext,
651                                       Qualifiers ThisTypeQuals,
652                                       Fn TransformExceptionSpec);
653 
654   bool TransformExceptionSpec(SourceLocation Loc,
655                               FunctionProtoType::ExceptionSpecInfo &ESI,
656                               SmallVectorImpl<QualType> &Exceptions,
657                               bool &Changed);
658 
659   StmtResult TransformSEHHandler(Stmt *Handler);
660 
661   QualType
662   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
663                                       TemplateSpecializationTypeLoc TL,
664                                       TemplateName Template);
665 
666   QualType
667   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
668                                       DependentTemplateSpecializationTypeLoc TL,
669                                                TemplateName Template,
670                                                CXXScopeSpec &SS);
671 
672   QualType TransformDependentTemplateSpecializationType(
673       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
674       NestedNameSpecifierLoc QualifierLoc);
675 
676   /// Transforms the parameters of a function type into the
677   /// given vectors.
678   ///
679   /// The result vectors should be kept in sync; null entries in the
680   /// variables vector are acceptable.
681   ///
682   /// LastParamTransformed, if non-null, will be set to the index of the last
683   /// parameter on which transfromation was started. In the event of an error,
684   /// this will contain the parameter which failed to instantiate.
685   ///
686   /// Return true on error.
687   bool TransformFunctionTypeParams(
688       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
689       const QualType *ParamTypes,
690       const FunctionProtoType::ExtParameterInfo *ParamInfos,
691       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
692       Sema::ExtParameterInfoBuilder &PInfos, unsigned *LastParamTransformed);
693 
TransformFunctionTypeParams(SourceLocation Loc,ArrayRef<ParmVarDecl * > Params,const QualType * ParamTypes,const FunctionProtoType::ExtParameterInfo * ParamInfos,SmallVectorImpl<QualType> & PTypes,SmallVectorImpl<ParmVarDecl * > * PVars,Sema::ExtParameterInfoBuilder & PInfos)694   bool TransformFunctionTypeParams(
695       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
696       const QualType *ParamTypes,
697       const FunctionProtoType::ExtParameterInfo *ParamInfos,
698       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
699       Sema::ExtParameterInfoBuilder &PInfos) {
700     return getDerived().TransformFunctionTypeParams(
701         Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos, nullptr);
702   }
703 
704   /// Transforms the parameters of a requires expresison into the given vectors.
705   ///
706   /// The result vectors should be kept in sync; null entries in the
707   /// variables vector are acceptable.
708   ///
709   /// Returns an unset ExprResult on success.  Returns an ExprResult the 'not
710   /// satisfied' RequiresExpr if subsitution failed, OR an ExprError, both of
711   /// which are cases where transformation shouldn't continue.
TransformRequiresTypeParams(SourceLocation KWLoc,SourceLocation RBraceLoc,const RequiresExpr * RE,RequiresExprBodyDecl * Body,ArrayRef<ParmVarDecl * > Params,SmallVectorImpl<QualType> & PTypes,SmallVectorImpl<ParmVarDecl * > & TransParams,Sema::ExtParameterInfoBuilder & PInfos)712   ExprResult TransformRequiresTypeParams(
713       SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE,
714       RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params,
715       SmallVectorImpl<QualType> &PTypes,
716       SmallVectorImpl<ParmVarDecl *> &TransParams,
717       Sema::ExtParameterInfoBuilder &PInfos) {
718     if (getDerived().TransformFunctionTypeParams(
719             KWLoc, Params, /*ParamTypes=*/nullptr,
720             /*ParamInfos=*/nullptr, PTypes, &TransParams, PInfos))
721       return ExprError();
722 
723     return ExprResult{};
724   }
725 
726   /// Transforms a single function-type parameter.  Return null
727   /// on error.
728   ///
729   /// \param indexAdjustment - A number to add to the parameter's
730   ///   scope index;  can be negative
731   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
732                                           int indexAdjustment,
733                                           std::optional<unsigned> NumExpansions,
734                                           bool ExpectParameterPack);
735 
736   /// Transform the body of a lambda-expression.
737   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
738   /// Alternative implementation of TransformLambdaBody that skips transforming
739   /// the body.
740   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
741 
742   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
743 
744   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
745   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
746 
TransformTemplateParameterList(TemplateParameterList * TPL)747   TemplateParameterList *TransformTemplateParameterList(
748         TemplateParameterList *TPL) {
749     return TPL;
750   }
751 
752   ExprResult TransformAddressOfOperand(Expr *E);
753 
754   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
755                                                 bool IsAddressOfOperand,
756                                                 TypeSourceInfo **RecoveryTSI);
757 
758   ExprResult TransformParenDependentScopeDeclRefExpr(
759       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
760       TypeSourceInfo **RecoveryTSI);
761 
762   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
763 
764 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
765 // amount of stack usage with clang.
766 #define STMT(Node, Parent)                        \
767   LLVM_ATTRIBUTE_NOINLINE \
768   StmtResult Transform##Node(Node *S);
769 #define VALUESTMT(Node, Parent)                   \
770   LLVM_ATTRIBUTE_NOINLINE \
771   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
772 #define EXPR(Node, Parent)                        \
773   LLVM_ATTRIBUTE_NOINLINE \
774   ExprResult Transform##Node(Node *E);
775 #define ABSTRACT_STMT(Stmt)
776 #include "clang/AST/StmtNodes.inc"
777 
778 #define GEN_CLANG_CLAUSE_CLASS
779 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
780   LLVM_ATTRIBUTE_NOINLINE                                                      \
781   OMPClause *Transform##Class(Class *S);
782 #include "llvm/Frontend/OpenMP/OMP.inc"
783 
784   /// Build a new qualified type given its unqualified type and type location.
785   ///
786   /// By default, this routine adds type qualifiers only to types that can
787   /// have qualifiers, and silently suppresses those qualifiers that are not
788   /// permitted. Subclasses may override this routine to provide different
789   /// behavior.
790   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
791 
792   /// Build a new pointer type given its pointee type.
793   ///
794   /// By default, performs semantic analysis when building the pointer type.
795   /// Subclasses may override this routine to provide different behavior.
796   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
797 
798   /// Build a new block pointer type given its pointee type.
799   ///
800   /// By default, performs semantic analysis when building the block pointer
801   /// type. Subclasses may override this routine to provide different behavior.
802   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
803 
804   /// Build a new reference type given the type it references.
805   ///
806   /// By default, performs semantic analysis when building the
807   /// reference type. Subclasses may override this routine to provide
808   /// different behavior.
809   ///
810   /// \param LValue whether the type was written with an lvalue sigil
811   /// or an rvalue sigil.
812   QualType RebuildReferenceType(QualType ReferentType,
813                                 bool LValue,
814                                 SourceLocation Sigil);
815 
816   /// Build a new member pointer type given the pointee type and the
817   /// class type it refers into.
818   ///
819   /// By default, performs semantic analysis when building the member pointer
820   /// type. Subclasses may override this routine to provide different behavior.
821   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
822                                     SourceLocation Sigil);
823 
824   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
825                                     SourceLocation ProtocolLAngleLoc,
826                                     ArrayRef<ObjCProtocolDecl *> Protocols,
827                                     ArrayRef<SourceLocation> ProtocolLocs,
828                                     SourceLocation ProtocolRAngleLoc);
829 
830   /// Build an Objective-C object type.
831   ///
832   /// By default, performs semantic analysis when building the object type.
833   /// Subclasses may override this routine to provide different behavior.
834   QualType RebuildObjCObjectType(QualType BaseType,
835                                  SourceLocation Loc,
836                                  SourceLocation TypeArgsLAngleLoc,
837                                  ArrayRef<TypeSourceInfo *> TypeArgs,
838                                  SourceLocation TypeArgsRAngleLoc,
839                                  SourceLocation ProtocolLAngleLoc,
840                                  ArrayRef<ObjCProtocolDecl *> Protocols,
841                                  ArrayRef<SourceLocation> ProtocolLocs,
842                                  SourceLocation ProtocolRAngleLoc);
843 
844   /// Build a new Objective-C object pointer type given the pointee type.
845   ///
846   /// By default, directly builds the pointer type, with no additional semantic
847   /// analysis.
848   QualType RebuildObjCObjectPointerType(QualType PointeeType,
849                                         SourceLocation Star);
850 
851   /// Build a new array type given the element type, size
852   /// modifier, size of the array (if known), size expression, and index type
853   /// qualifiers.
854   ///
855   /// By default, performs semantic analysis when building the array type.
856   /// Subclasses may override this routine to provide different behavior.
857   /// Also by default, all of the other Rebuild*Array
858   QualType RebuildArrayType(QualType ElementType,
859                             ArrayType::ArraySizeModifier SizeMod,
860                             const llvm::APInt *Size,
861                             Expr *SizeExpr,
862                             unsigned IndexTypeQuals,
863                             SourceRange BracketsRange);
864 
865   /// Build a new constant array type given the element type, size
866   /// modifier, (known) size of the array, and index type qualifiers.
867   ///
868   /// By default, performs semantic analysis when building the array type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildConstantArrayType(QualType ElementType,
871                                     ArrayType::ArraySizeModifier SizeMod,
872                                     const llvm::APInt &Size,
873                                     Expr *SizeExpr,
874                                     unsigned IndexTypeQuals,
875                                     SourceRange BracketsRange);
876 
877   /// Build a new incomplete array type given the element type, size
878   /// modifier, and index type qualifiers.
879   ///
880   /// By default, performs semantic analysis when building the array type.
881   /// Subclasses may override this routine to provide different behavior.
882   QualType RebuildIncompleteArrayType(QualType ElementType,
883                                       ArrayType::ArraySizeModifier SizeMod,
884                                       unsigned IndexTypeQuals,
885                                       SourceRange BracketsRange);
886 
887   /// Build a new variable-length array type given the element type,
888   /// size modifier, size expression, and index type qualifiers.
889   ///
890   /// By default, performs semantic analysis when building the array type.
891   /// Subclasses may override this routine to provide different behavior.
892   QualType RebuildVariableArrayType(QualType ElementType,
893                                     ArrayType::ArraySizeModifier SizeMod,
894                                     Expr *SizeExpr,
895                                     unsigned IndexTypeQuals,
896                                     SourceRange BracketsRange);
897 
898   /// Build a new dependent-sized array type given the element type,
899   /// size modifier, size expression, and index type qualifiers.
900   ///
901   /// By default, performs semantic analysis when building the array type.
902   /// Subclasses may override this routine to provide different behavior.
903   QualType RebuildDependentSizedArrayType(QualType ElementType,
904                                           ArrayType::ArraySizeModifier SizeMod,
905                                           Expr *SizeExpr,
906                                           unsigned IndexTypeQuals,
907                                           SourceRange BracketsRange);
908 
909   /// Build a new vector type given the element type and
910   /// number of elements.
911   ///
912   /// By default, performs semantic analysis when building the vector type.
913   /// Subclasses may override this routine to provide different behavior.
914   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
915                              VectorType::VectorKind VecKind);
916 
917   /// Build a new potentially dependently-sized extended vector type
918   /// given the element type and number of elements.
919   ///
920   /// By default, performs semantic analysis when building the vector type.
921   /// Subclasses may override this routine to provide different behavior.
922   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
923                                            SourceLocation AttributeLoc,
924                                            VectorType::VectorKind);
925 
926   /// Build a new extended vector type given the element type and
927   /// number of elements.
928   ///
929   /// By default, performs semantic analysis when building the vector type.
930   /// Subclasses may override this routine to provide different behavior.
931   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
932                                 SourceLocation AttributeLoc);
933 
934   /// Build a new potentially dependently-sized extended vector type
935   /// given the element type and number of elements.
936   ///
937   /// By default, performs semantic analysis when building the vector type.
938   /// Subclasses may override this routine to provide different behavior.
939   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
940                                               Expr *SizeExpr,
941                                               SourceLocation AttributeLoc);
942 
943   /// Build a new matrix type given the element type and dimensions.
944   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
945                                      unsigned NumColumns);
946 
947   /// Build a new matrix type given the type and dependently-defined
948   /// dimensions.
949   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
950                                            Expr *ColumnExpr,
951                                            SourceLocation AttributeLoc);
952 
953   /// Build a new DependentAddressSpaceType or return the pointee
954   /// type variable with the correct address space (retrieved from
955   /// AddrSpaceExpr) applied to it. The former will be returned in cases
956   /// where the address space remains dependent.
957   ///
958   /// By default, performs semantic analysis when building the type with address
959   /// space applied. Subclasses may override this routine to provide different
960   /// behavior.
961   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
962                                             Expr *AddrSpaceExpr,
963                                             SourceLocation AttributeLoc);
964 
965   /// Build a new function type.
966   ///
967   /// By default, performs semantic analysis when building the function type.
968   /// Subclasses may override this routine to provide different behavior.
969   QualType RebuildFunctionProtoType(QualType T,
970                                     MutableArrayRef<QualType> ParamTypes,
971                                     const FunctionProtoType::ExtProtoInfo &EPI);
972 
973   /// Build a new unprototyped function type.
974   QualType RebuildFunctionNoProtoType(QualType ResultType);
975 
976   /// Rebuild an unresolved typename type, given the decl that
977   /// the UnresolvedUsingTypenameDecl was transformed to.
978   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
979 
980   /// Build a new type found via an alias.
RebuildUsingType(UsingShadowDecl * Found,QualType Underlying)981   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
982     return SemaRef.Context.getUsingType(Found, Underlying);
983   }
984 
985   /// Build a new typedef type.
RebuildTypedefType(TypedefNameDecl * Typedef)986   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
987     return SemaRef.Context.getTypeDeclType(Typedef);
988   }
989 
990   /// Build a new MacroDefined type.
RebuildMacroQualifiedType(QualType T,const IdentifierInfo * MacroII)991   QualType RebuildMacroQualifiedType(QualType T,
992                                      const IdentifierInfo *MacroII) {
993     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
994   }
995 
996   /// Build a new class/struct/union type.
RebuildRecordType(RecordDecl * Record)997   QualType RebuildRecordType(RecordDecl *Record) {
998     return SemaRef.Context.getTypeDeclType(Record);
999   }
1000 
1001   /// Build a new Enum type.
RebuildEnumType(EnumDecl * Enum)1002   QualType RebuildEnumType(EnumDecl *Enum) {
1003     return SemaRef.Context.getTypeDeclType(Enum);
1004   }
1005 
1006   /// Build a new typeof(expr) type.
1007   ///
1008   /// By default, performs semantic analysis when building the typeof type.
1009   /// Subclasses may override this routine to provide different behavior.
1010   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc,
1011                                  TypeOfKind Kind);
1012 
1013   /// Build a new typeof(type) type.
1014   ///
1015   /// By default, builds a new TypeOfType with the given underlying type.
1016   QualType RebuildTypeOfType(QualType Underlying, TypeOfKind Kind);
1017 
1018   /// Build a new unary transform type.
1019   QualType RebuildUnaryTransformType(QualType BaseType,
1020                                      UnaryTransformType::UTTKind UKind,
1021                                      SourceLocation Loc);
1022 
1023   /// Build a new C++11 decltype type.
1024   ///
1025   /// By default, performs semantic analysis when building the decltype type.
1026   /// Subclasses may override this routine to provide different behavior.
1027   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
1028 
1029   /// Build a new C++11 auto type.
1030   ///
1031   /// By default, builds a new AutoType with the given deduced type.
RebuildAutoType(QualType Deduced,AutoTypeKeyword Keyword,ConceptDecl * TypeConstraintConcept,ArrayRef<TemplateArgument> TypeConstraintArgs)1032   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
1033                            ConceptDecl *TypeConstraintConcept,
1034                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
1035     // Note, IsDependent is always false here: we implicitly convert an 'auto'
1036     // which has been deduced to a dependent type into an undeduced 'auto', so
1037     // that we'll retry deduction after the transformation.
1038     return SemaRef.Context.getAutoType(Deduced, Keyword,
1039                                        /*IsDependent*/ false, /*IsPack=*/false,
1040                                        TypeConstraintConcept,
1041                                        TypeConstraintArgs);
1042   }
1043 
1044   /// By default, builds a new DeducedTemplateSpecializationType with the given
1045   /// deduced type.
RebuildDeducedTemplateSpecializationType(TemplateName Template,QualType Deduced)1046   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1047       QualType Deduced) {
1048     return SemaRef.Context.getDeducedTemplateSpecializationType(
1049         Template, Deduced, /*IsDependent*/ false);
1050   }
1051 
1052   /// Build a new template specialization type.
1053   ///
1054   /// By default, performs semantic analysis when building the template
1055   /// specialization type. Subclasses may override this routine to provide
1056   /// different behavior.
1057   QualType RebuildTemplateSpecializationType(TemplateName Template,
1058                                              SourceLocation TemplateLoc,
1059                                              TemplateArgumentListInfo &Args);
1060 
1061   /// Build a new parenthesized type.
1062   ///
1063   /// By default, builds a new ParenType type from the inner type.
1064   /// Subclasses may override this routine to provide different behavior.
RebuildParenType(QualType InnerType)1065   QualType RebuildParenType(QualType InnerType) {
1066     return SemaRef.BuildParenType(InnerType);
1067   }
1068 
1069   /// Build a new qualified name type.
1070   ///
1071   /// By default, builds a new ElaboratedType type from the keyword,
1072   /// the nested-name-specifier and the named type.
1073   /// Subclasses may override this routine to provide different behavior.
RebuildElaboratedType(SourceLocation KeywordLoc,ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,QualType Named)1074   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1075                                  ElaboratedTypeKeyword Keyword,
1076                                  NestedNameSpecifierLoc QualifierLoc,
1077                                  QualType Named) {
1078     return SemaRef.Context.getElaboratedType(Keyword,
1079                                          QualifierLoc.getNestedNameSpecifier(),
1080                                              Named);
1081   }
1082 
1083   /// Build a new typename type that refers to a template-id.
1084   ///
1085   /// By default, builds a new DependentNameType type from the
1086   /// nested-name-specifier and the given type. Subclasses may override
1087   /// this routine to provide different behavior.
RebuildDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const IdentifierInfo * Name,SourceLocation NameLoc,TemplateArgumentListInfo & Args,bool AllowInjectedClassName)1088   QualType RebuildDependentTemplateSpecializationType(
1089                                           ElaboratedTypeKeyword Keyword,
1090                                           NestedNameSpecifierLoc QualifierLoc,
1091                                           SourceLocation TemplateKWLoc,
1092                                           const IdentifierInfo *Name,
1093                                           SourceLocation NameLoc,
1094                                           TemplateArgumentListInfo &Args,
1095                                           bool AllowInjectedClassName) {
1096     // Rebuild the template name.
1097     // TODO: avoid TemplateName abstraction
1098     CXXScopeSpec SS;
1099     SS.Adopt(QualifierLoc);
1100     TemplateName InstName = getDerived().RebuildTemplateName(
1101         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1102         AllowInjectedClassName);
1103 
1104     if (InstName.isNull())
1105       return QualType();
1106 
1107     // If it's still dependent, make a dependent specialization.
1108     if (InstName.getAsDependentTemplateName())
1109       return SemaRef.Context.getDependentTemplateSpecializationType(
1110           Keyword, QualifierLoc.getNestedNameSpecifier(), Name,
1111           Args.arguments());
1112 
1113     // Otherwise, make an elaborated type wrapping a non-dependent
1114     // specialization.
1115     QualType T =
1116         getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1117     if (T.isNull())
1118       return QualType();
1119     return SemaRef.Context.getElaboratedType(
1120         Keyword, QualifierLoc.getNestedNameSpecifier(), T);
1121   }
1122 
1123   /// Build a new typename type that refers to an identifier.
1124   ///
1125   /// By default, performs semantic analysis when building the typename type
1126   /// (or elaborated type). Subclasses may override this routine to provide
1127   /// different behavior.
RebuildDependentNameType(ElaboratedTypeKeyword Keyword,SourceLocation KeywordLoc,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Id,SourceLocation IdLoc,bool DeducedTSTContext)1128   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1129                                     SourceLocation KeywordLoc,
1130                                     NestedNameSpecifierLoc QualifierLoc,
1131                                     const IdentifierInfo *Id,
1132                                     SourceLocation IdLoc,
1133                                     bool DeducedTSTContext) {
1134     CXXScopeSpec SS;
1135     SS.Adopt(QualifierLoc);
1136 
1137     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1138       // If the name is still dependent, just build a new dependent name type.
1139       if (!SemaRef.computeDeclContext(SS))
1140         return SemaRef.Context.getDependentNameType(Keyword,
1141                                           QualifierLoc.getNestedNameSpecifier(),
1142                                                     Id);
1143     }
1144 
1145     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1146       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1147                                        *Id, IdLoc, DeducedTSTContext);
1148     }
1149 
1150     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1151 
1152     // We had a dependent elaborated-type-specifier that has been transformed
1153     // into a non-dependent elaborated-type-specifier. Find the tag we're
1154     // referring to.
1155     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1156     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1157     if (!DC)
1158       return QualType();
1159 
1160     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1161       return QualType();
1162 
1163     TagDecl *Tag = nullptr;
1164     SemaRef.LookupQualifiedName(Result, DC);
1165     switch (Result.getResultKind()) {
1166       case LookupResult::NotFound:
1167       case LookupResult::NotFoundInCurrentInstantiation:
1168         break;
1169 
1170       case LookupResult::Found:
1171         Tag = Result.getAsSingle<TagDecl>();
1172         break;
1173 
1174       case LookupResult::FoundOverloaded:
1175       case LookupResult::FoundUnresolvedValue:
1176         llvm_unreachable("Tag lookup cannot find non-tags");
1177 
1178       case LookupResult::Ambiguous:
1179         // Let the LookupResult structure handle ambiguities.
1180         return QualType();
1181     }
1182 
1183     if (!Tag) {
1184       // Check where the name exists but isn't a tag type and use that to emit
1185       // better diagnostics.
1186       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1187       SemaRef.LookupQualifiedName(Result, DC);
1188       switch (Result.getResultKind()) {
1189         case LookupResult::Found:
1190         case LookupResult::FoundOverloaded:
1191         case LookupResult::FoundUnresolvedValue: {
1192           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1193           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1194           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1195                                                                << NTK << Kind;
1196           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1197           break;
1198         }
1199         default:
1200           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1201               << Kind << Id << DC << QualifierLoc.getSourceRange();
1202           break;
1203       }
1204       return QualType();
1205     }
1206 
1207     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1208                                               IdLoc, Id)) {
1209       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1210       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1211       return QualType();
1212     }
1213 
1214     // Build the elaborated-type-specifier type.
1215     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1216     return SemaRef.Context.getElaboratedType(Keyword,
1217                                          QualifierLoc.getNestedNameSpecifier(),
1218                                              T);
1219   }
1220 
1221   /// Build a new pack expansion type.
1222   ///
1223   /// By default, builds a new PackExpansionType type from the given pattern.
1224   /// Subclasses may override this routine to provide different behavior.
RebuildPackExpansionType(QualType Pattern,SourceRange PatternRange,SourceLocation EllipsisLoc,std::optional<unsigned> NumExpansions)1225   QualType RebuildPackExpansionType(QualType Pattern, SourceRange PatternRange,
1226                                     SourceLocation EllipsisLoc,
1227                                     std::optional<unsigned> NumExpansions) {
1228     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1229                                         NumExpansions);
1230   }
1231 
1232   /// Build a new atomic type given its value type.
1233   ///
1234   /// By default, performs semantic analysis when building the atomic type.
1235   /// Subclasses may override this routine to provide different behavior.
1236   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1237 
1238   /// Build a new pipe type given its value type.
1239   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1240                            bool isReadPipe);
1241 
1242   /// Build a bit-precise int given its value type.
1243   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1244                              SourceLocation Loc);
1245 
1246   /// Build a dependent bit-precise int given its value type.
1247   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1248                                       SourceLocation Loc);
1249 
1250   /// Build a new template name given a nested name specifier, a flag
1251   /// indicating whether the "template" keyword was provided, and the template
1252   /// that the template name refers to.
1253   ///
1254   /// By default, builds the new template name directly. Subclasses may override
1255   /// this routine to provide different behavior.
1256   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1257                                    bool TemplateKW,
1258                                    TemplateDecl *Template);
1259 
1260   /// Build a new template name given a nested name specifier and the
1261   /// name that is referred to as a template.
1262   ///
1263   /// By default, performs semantic analysis to determine whether the name can
1264   /// be resolved to a specific template, then builds the appropriate kind of
1265   /// template name. Subclasses may override this routine to provide different
1266   /// behavior.
1267   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1268                                    SourceLocation TemplateKWLoc,
1269                                    const IdentifierInfo &Name,
1270                                    SourceLocation NameLoc, QualType ObjectType,
1271                                    NamedDecl *FirstQualifierInScope,
1272                                    bool AllowInjectedClassName);
1273 
1274   /// Build a new template name given a nested name specifier and the
1275   /// overloaded operator name that is referred to as a template.
1276   ///
1277   /// By default, performs semantic analysis to determine whether the name can
1278   /// be resolved to a specific template, then builds the appropriate kind of
1279   /// template name. Subclasses may override this routine to provide different
1280   /// behavior.
1281   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1282                                    SourceLocation TemplateKWLoc,
1283                                    OverloadedOperatorKind Operator,
1284                                    SourceLocation NameLoc, QualType ObjectType,
1285                                    bool AllowInjectedClassName);
1286 
1287   /// Build a new template name given a template template parameter pack
1288   /// and the
1289   ///
1290   /// By default, performs semantic analysis to determine whether the name can
1291   /// be resolved to a specific template, then builds the appropriate kind of
1292   /// template name. Subclasses may override this routine to provide different
1293   /// behavior.
RebuildTemplateName(const TemplateArgument & ArgPack,Decl * AssociatedDecl,unsigned Index,bool Final)1294   TemplateName RebuildTemplateName(const TemplateArgument &ArgPack,
1295                                    Decl *AssociatedDecl, unsigned Index,
1296                                    bool Final) {
1297     return getSema().Context.getSubstTemplateTemplateParmPack(
1298         ArgPack, AssociatedDecl, Index, Final);
1299   }
1300 
1301   /// Build a new compound statement.
1302   ///
1303   /// By default, performs semantic analysis to build the new statement.
1304   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundStmt(SourceLocation LBraceLoc,MultiStmtArg Statements,SourceLocation RBraceLoc,bool IsStmtExpr)1305   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1306                                        MultiStmtArg Statements,
1307                                        SourceLocation RBraceLoc,
1308                                        bool IsStmtExpr) {
1309     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1310                                        IsStmtExpr);
1311   }
1312 
1313   /// Build a new case statement.
1314   ///
1315   /// By default, performs semantic analysis to build the new statement.
1316   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmt(SourceLocation CaseLoc,Expr * LHS,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation ColonLoc)1317   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1318                                    Expr *LHS,
1319                                    SourceLocation EllipsisLoc,
1320                                    Expr *RHS,
1321                                    SourceLocation ColonLoc) {
1322     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1323                                    ColonLoc);
1324   }
1325 
1326   /// Attach the body to a new case statement.
1327   ///
1328   /// By default, performs semantic analysis to build the new statement.
1329   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmtBody(Stmt * S,Stmt * Body)1330   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1331     getSema().ActOnCaseStmtBody(S, Body);
1332     return S;
1333   }
1334 
1335   /// Build a new default statement.
1336   ///
1337   /// By default, performs semantic analysis to build the new statement.
1338   /// Subclasses may override this routine to provide different behavior.
RebuildDefaultStmt(SourceLocation DefaultLoc,SourceLocation ColonLoc,Stmt * SubStmt)1339   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1340                                       SourceLocation ColonLoc,
1341                                       Stmt *SubStmt) {
1342     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1343                                       /*CurScope=*/nullptr);
1344   }
1345 
1346   /// Build a new label statement.
1347   ///
1348   /// By default, performs semantic analysis to build the new statement.
1349   /// Subclasses may override this routine to provide different behavior.
RebuildLabelStmt(SourceLocation IdentLoc,LabelDecl * L,SourceLocation ColonLoc,Stmt * SubStmt)1350   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1351                               SourceLocation ColonLoc, Stmt *SubStmt) {
1352     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1353   }
1354 
1355   /// Build a new attributed statement.
1356   ///
1357   /// By default, performs semantic analysis to build the new statement.
1358   /// Subclasses may override this routine to provide different behavior.
RebuildAttributedStmt(SourceLocation AttrLoc,ArrayRef<const Attr * > Attrs,Stmt * SubStmt)1359   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1360                                    ArrayRef<const Attr *> Attrs,
1361                                    Stmt *SubStmt) {
1362     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1363   }
1364 
1365   /// Build a new "if" statement.
1366   ///
1367   /// By default, performs semantic analysis to build the new statement.
1368   /// Subclasses may override this routine to provide different behavior.
RebuildIfStmt(SourceLocation IfLoc,IfStatementKind Kind,SourceLocation LParenLoc,Sema::ConditionResult Cond,SourceLocation RParenLoc,Stmt * Init,Stmt * Then,SourceLocation ElseLoc,Stmt * Else)1369   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1370                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1371                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1372                            SourceLocation ElseLoc, Stmt *Else) {
1373     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1374                                  Then, ElseLoc, Else);
1375   }
1376 
1377   /// Start building a new switch statement.
1378   ///
1379   /// By default, performs semantic analysis to build the new statement.
1380   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtStart(SourceLocation SwitchLoc,SourceLocation LParenLoc,Stmt * Init,Sema::ConditionResult Cond,SourceLocation RParenLoc)1381   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1382                                     SourceLocation LParenLoc, Stmt *Init,
1383                                     Sema::ConditionResult Cond,
1384                                     SourceLocation RParenLoc) {
1385     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1386                                             RParenLoc);
1387   }
1388 
1389   /// Attach the body to the switch statement.
1390   ///
1391   /// By default, performs semantic analysis to build the new statement.
1392   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtBody(SourceLocation SwitchLoc,Stmt * Switch,Stmt * Body)1393   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1394                                    Stmt *Switch, Stmt *Body) {
1395     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1396   }
1397 
1398   /// Build a new while statement.
1399   ///
1400   /// By default, performs semantic analysis to build the new statement.
1401   /// Subclasses may override this routine to provide different behavior.
RebuildWhileStmt(SourceLocation WhileLoc,SourceLocation LParenLoc,Sema::ConditionResult Cond,SourceLocation RParenLoc,Stmt * Body)1402   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1403                               Sema::ConditionResult Cond,
1404                               SourceLocation RParenLoc, Stmt *Body) {
1405     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1406   }
1407 
1408   /// Build a new do-while statement.
1409   ///
1410   /// By default, performs semantic analysis to build the new statement.
1411   /// Subclasses may override this routine to provide different behavior.
RebuildDoStmt(SourceLocation DoLoc,Stmt * Body,SourceLocation WhileLoc,SourceLocation LParenLoc,Expr * Cond,SourceLocation RParenLoc)1412   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1413                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1414                            Expr *Cond, SourceLocation RParenLoc) {
1415     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1416                                  Cond, RParenLoc);
1417   }
1418 
1419   /// Build a new for statement.
1420   ///
1421   /// By default, performs semantic analysis to build the new statement.
1422   /// Subclasses may override this routine to provide different behavior.
RebuildForStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * Init,Sema::ConditionResult Cond,Sema::FullExprArg Inc,SourceLocation RParenLoc,Stmt * Body)1423   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1424                             Stmt *Init, Sema::ConditionResult Cond,
1425                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1426                             Stmt *Body) {
1427     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1428                                   Inc, RParenLoc, Body);
1429   }
1430 
1431   /// Build a new goto statement.
1432   ///
1433   /// By default, performs semantic analysis to build the new statement.
1434   /// Subclasses may override this routine to provide different behavior.
RebuildGotoStmt(SourceLocation GotoLoc,SourceLocation LabelLoc,LabelDecl * Label)1435   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1436                              LabelDecl *Label) {
1437     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1438   }
1439 
1440   /// Build a new indirect goto statement.
1441   ///
1442   /// By default, performs semantic analysis to build the new statement.
1443   /// Subclasses may override this routine to provide different behavior.
RebuildIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,Expr * Target)1444   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1445                                      SourceLocation StarLoc,
1446                                      Expr *Target) {
1447     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1448   }
1449 
1450   /// Build a new return statement.
1451   ///
1452   /// By default, performs semantic analysis to build the new statement.
1453   /// Subclasses may override this routine to provide different behavior.
RebuildReturnStmt(SourceLocation ReturnLoc,Expr * Result)1454   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1455     return getSema().BuildReturnStmt(ReturnLoc, Result);
1456   }
1457 
1458   /// Build a new declaration statement.
1459   ///
1460   /// By default, performs semantic analysis to build the new statement.
1461   /// Subclasses may override this routine to provide different behavior.
RebuildDeclStmt(MutableArrayRef<Decl * > Decls,SourceLocation StartLoc,SourceLocation EndLoc)1462   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1463                              SourceLocation StartLoc, SourceLocation EndLoc) {
1464     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1465     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1466   }
1467 
1468   /// Build a new inline asm statement.
1469   ///
1470   /// By default, performs semantic analysis to build the new statement.
1471   /// Subclasses may override this routine to provide different behavior.
RebuildGCCAsmStmt(SourceLocation AsmLoc,bool IsSimple,bool IsVolatile,unsigned NumOutputs,unsigned NumInputs,IdentifierInfo ** Names,MultiExprArg Constraints,MultiExprArg Exprs,Expr * AsmString,MultiExprArg Clobbers,unsigned NumLabels,SourceLocation RParenLoc)1472   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1473                                bool IsVolatile, unsigned NumOutputs,
1474                                unsigned NumInputs, IdentifierInfo **Names,
1475                                MultiExprArg Constraints, MultiExprArg Exprs,
1476                                Expr *AsmString, MultiExprArg Clobbers,
1477                                unsigned NumLabels,
1478                                SourceLocation RParenLoc) {
1479     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1480                                      NumInputs, Names, Constraints, Exprs,
1481                                      AsmString, Clobbers, NumLabels, RParenLoc);
1482   }
1483 
1484   /// Build a new MS style inline asm statement.
1485   ///
1486   /// By default, performs semantic analysis to build the new statement.
1487   /// Subclasses may override this routine to provide different behavior.
RebuildMSAsmStmt(SourceLocation AsmLoc,SourceLocation LBraceLoc,ArrayRef<Token> AsmToks,StringRef AsmString,unsigned NumOutputs,unsigned NumInputs,ArrayRef<StringRef> Constraints,ArrayRef<StringRef> Clobbers,ArrayRef<Expr * > Exprs,SourceLocation EndLoc)1488   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1489                               ArrayRef<Token> AsmToks,
1490                               StringRef AsmString,
1491                               unsigned NumOutputs, unsigned NumInputs,
1492                               ArrayRef<StringRef> Constraints,
1493                               ArrayRef<StringRef> Clobbers,
1494                               ArrayRef<Expr*> Exprs,
1495                               SourceLocation EndLoc) {
1496     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1497                                     NumOutputs, NumInputs,
1498                                     Constraints, Clobbers, Exprs, EndLoc);
1499   }
1500 
1501   /// Build a new co_return statement.
1502   ///
1503   /// By default, performs semantic analysis to build the new statement.
1504   /// Subclasses may override this routine to provide different behavior.
RebuildCoreturnStmt(SourceLocation CoreturnLoc,Expr * Result,bool IsImplicit)1505   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1506                                  bool IsImplicit) {
1507     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1508   }
1509 
1510   /// Build a new co_await expression.
1511   ///
1512   /// By default, performs semantic analysis to build the new expression.
1513   /// Subclasses may override this routine to provide different behavior.
RebuildCoawaitExpr(SourceLocation CoawaitLoc,Expr * Operand,UnresolvedLookupExpr * OpCoawaitLookup,bool IsImplicit)1514   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand,
1515                                 UnresolvedLookupExpr *OpCoawaitLookup,
1516                                 bool IsImplicit) {
1517     // This function rebuilds a coawait-expr given its operator.
1518     // For an explicit coawait-expr, the rebuild involves the full set
1519     // of transformations performed by BuildUnresolvedCoawaitExpr(),
1520     // including calling await_transform().
1521     // For an implicit coawait-expr, we need to rebuild the "operator
1522     // coawait" but not await_transform(), so use BuildResolvedCoawaitExpr().
1523     // This mirrors how the implicit CoawaitExpr is originally created
1524     // in Sema::ActOnCoroutineBodyStart().
1525     if (IsImplicit) {
1526       ExprResult Suspend = getSema().BuildOperatorCoawaitCall(
1527           CoawaitLoc, Operand, OpCoawaitLookup);
1528       if (Suspend.isInvalid())
1529         return ExprError();
1530       return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Operand,
1531                                                 Suspend.get(), true);
1532     }
1533 
1534     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Operand,
1535                                                 OpCoawaitLookup);
1536   }
1537 
1538   /// Build a new co_await expression.
1539   ///
1540   /// By default, performs semantic analysis to build the new expression.
1541   /// Subclasses may override this routine to provide different behavior.
RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,Expr * Result,UnresolvedLookupExpr * Lookup)1542   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1543                                          Expr *Result,
1544                                          UnresolvedLookupExpr *Lookup) {
1545     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1546   }
1547 
1548   /// Build a new co_yield expression.
1549   ///
1550   /// By default, performs semantic analysis to build the new expression.
1551   /// Subclasses may override this routine to provide different behavior.
RebuildCoyieldExpr(SourceLocation CoyieldLoc,Expr * Result)1552   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1553     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1554   }
1555 
RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args)1556   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1557     return getSema().BuildCoroutineBodyStmt(Args);
1558   }
1559 
1560   /// Build a new Objective-C \@try statement.
1561   ///
1562   /// By default, performs semantic analysis to build the new statement.
1563   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtTryStmt(SourceLocation AtLoc,Stmt * TryBody,MultiStmtArg CatchStmts,Stmt * Finally)1564   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1565                                         Stmt *TryBody,
1566                                         MultiStmtArg CatchStmts,
1567                                         Stmt *Finally) {
1568     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1569                                         Finally);
1570   }
1571 
1572   /// Rebuild an Objective-C exception declaration.
1573   ///
1574   /// By default, performs semantic analysis to build the new declaration.
1575   /// Subclasses may override this routine to provide different behavior.
RebuildObjCExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * TInfo,QualType T)1576   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1577                                     TypeSourceInfo *TInfo, QualType T) {
1578     return getSema().BuildObjCExceptionDecl(TInfo, T,
1579                                             ExceptionDecl->getInnerLocStart(),
1580                                             ExceptionDecl->getLocation(),
1581                                             ExceptionDecl->getIdentifier());
1582   }
1583 
1584   /// Build a new Objective-C \@catch statement.
1585   ///
1586   /// By default, performs semantic analysis to build the new statement.
1587   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtCatchStmt(SourceLocation AtLoc,SourceLocation RParenLoc,VarDecl * Var,Stmt * Body)1588   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1589                                           SourceLocation RParenLoc,
1590                                           VarDecl *Var,
1591                                           Stmt *Body) {
1592     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1593                                           Var, Body);
1594   }
1595 
1596   /// Build a new Objective-C \@finally statement.
1597   ///
1598   /// By default, performs semantic analysis to build the new statement.
1599   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtFinallyStmt(SourceLocation AtLoc,Stmt * Body)1600   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1601                                             Stmt *Body) {
1602     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1603   }
1604 
1605   /// Build a new Objective-C \@throw statement.
1606   ///
1607   /// By default, performs semantic analysis to build the new statement.
1608   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtThrowStmt(SourceLocation AtLoc,Expr * Operand)1609   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1610                                           Expr *Operand) {
1611     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1612   }
1613 
1614   /// Build a new OpenMP Canonical loop.
1615   ///
1616   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1617   /// OMPCanonicalLoop.
RebuildOMPCanonicalLoop(Stmt * LoopStmt)1618   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1619     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1620   }
1621 
1622   /// Build a new OpenMP executable directive.
1623   ///
1624   /// By default, performs semantic analysis to build the new statement.
1625   /// Subclasses may override this routine to provide different behavior.
RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,DeclarationNameInfo DirName,OpenMPDirectiveKind CancelRegion,ArrayRef<OMPClause * > Clauses,Stmt * AStmt,SourceLocation StartLoc,SourceLocation EndLoc)1626   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1627                                            DeclarationNameInfo DirName,
1628                                            OpenMPDirectiveKind CancelRegion,
1629                                            ArrayRef<OMPClause *> Clauses,
1630                                            Stmt *AStmt, SourceLocation StartLoc,
1631                                            SourceLocation EndLoc) {
1632     return getSema().ActOnOpenMPExecutableDirective(
1633         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'if' clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation NameModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1640   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1641                                 Expr *Condition, SourceLocation StartLoc,
1642                                 SourceLocation LParenLoc,
1643                                 SourceLocation NameModifierLoc,
1644                                 SourceLocation ColonLoc,
1645                                 SourceLocation EndLoc) {
1646     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1647                                          LParenLoc, NameModifierLoc, ColonLoc,
1648                                          EndLoc);
1649   }
1650 
1651   /// Build a new OpenMP 'final' clause.
1652   ///
1653   /// By default, performs semantic analysis to build the new OpenMP clause.
1654   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFinalClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1655   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1656                                    SourceLocation LParenLoc,
1657                                    SourceLocation EndLoc) {
1658     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1659                                             EndLoc);
1660   }
1661 
1662   /// Build a new OpenMP 'num_threads' clause.
1663   ///
1664   /// By default, performs semantic analysis to build the new OpenMP clause.
1665   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumThreadsClause(Expr * NumThreads,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1666   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1667                                         SourceLocation StartLoc,
1668                                         SourceLocation LParenLoc,
1669                                         SourceLocation EndLoc) {
1670     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1671                                                  LParenLoc, EndLoc);
1672   }
1673 
1674   /// Build a new OpenMP 'safelen' clause.
1675   ///
1676   /// By default, performs semantic analysis to build the new OpenMP clause.
1677   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSafelenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1678   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1679                                      SourceLocation LParenLoc,
1680                                      SourceLocation EndLoc) {
1681     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1682   }
1683 
1684   /// Build a new OpenMP 'simdlen' clause.
1685   ///
1686   /// By default, performs semantic analysis to build the new OpenMP clause.
1687   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSimdlenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1688   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1689                                      SourceLocation LParenLoc,
1690                                      SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1692   }
1693 
RebuildOMPSizesClause(ArrayRef<Expr * > Sizes,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1694   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1695                                    SourceLocation StartLoc,
1696                                    SourceLocation LParenLoc,
1697                                    SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1699   }
1700 
1701   /// Build a new OpenMP 'full' clause.
RebuildOMPFullClause(SourceLocation StartLoc,SourceLocation EndLoc)1702   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1703                                   SourceLocation EndLoc) {
1704     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1705   }
1706 
1707   /// Build a new OpenMP 'partial' clause.
RebuildOMPPartialClause(Expr * Factor,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1708   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1709                                      SourceLocation LParenLoc,
1710                                      SourceLocation EndLoc) {
1711     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1712                                               EndLoc);
1713   }
1714 
1715   /// Build a new OpenMP 'allocator' clause.
1716   ///
1717   /// By default, performs semantic analysis to build the new OpenMP clause.
1718   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAllocatorClause(Expr * A,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1719   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1720                                        SourceLocation LParenLoc,
1721                                        SourceLocation EndLoc) {
1722     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1723   }
1724 
1725   /// Build a new OpenMP 'collapse' clause.
1726   ///
1727   /// By default, performs semantic analysis to build the new OpenMP clause.
1728   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCollapseClause(Expr * Num,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1729   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1730                                       SourceLocation LParenLoc,
1731                                       SourceLocation EndLoc) {
1732     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1733                                                EndLoc);
1734   }
1735 
1736   /// Build a new OpenMP 'default' clause.
1737   ///
1738   /// By default, performs semantic analysis to build the new OpenMP clause.
1739   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDefaultClause(DefaultKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1740   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1741                                      SourceLocation StartLoc,
1742                                      SourceLocation LParenLoc,
1743                                      SourceLocation EndLoc) {
1744     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1745                                               StartLoc, LParenLoc, EndLoc);
1746   }
1747 
1748   /// Build a new OpenMP 'proc_bind' clause.
1749   ///
1750   /// By default, performs semantic analysis to build the new OpenMP clause.
1751   /// Subclasses may override this routine to provide different behavior.
RebuildOMPProcBindClause(ProcBindKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1752   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1753                                       SourceLocation KindKwLoc,
1754                                       SourceLocation StartLoc,
1755                                       SourceLocation LParenLoc,
1756                                       SourceLocation EndLoc) {
1757     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1758                                                StartLoc, LParenLoc, EndLoc);
1759   }
1760 
1761   /// Build a new OpenMP 'schedule' clause.
1762   ///
1763   /// By default, performs semantic analysis to build the new OpenMP clause.
1764   /// Subclasses may override this routine to provide different behavior.
RebuildOMPScheduleClause(OpenMPScheduleClauseModifier M1,OpenMPScheduleClauseModifier M2,OpenMPScheduleClauseKind Kind,Expr * ChunkSize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation M1Loc,SourceLocation M2Loc,SourceLocation KindLoc,SourceLocation CommaLoc,SourceLocation EndLoc)1765   OMPClause *RebuildOMPScheduleClause(
1766       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1767       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1768       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1769       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1770     return getSema().ActOnOpenMPScheduleClause(
1771         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1772         CommaLoc, EndLoc);
1773   }
1774 
1775   /// Build a new OpenMP 'ordered' clause.
1776   ///
1777   /// By default, performs semantic analysis to build the new OpenMP clause.
1778   /// Subclasses may override this routine to provide different behavior.
RebuildOMPOrderedClause(SourceLocation StartLoc,SourceLocation EndLoc,SourceLocation LParenLoc,Expr * Num)1779   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1780                                      SourceLocation EndLoc,
1781                                      SourceLocation LParenLoc, Expr *Num) {
1782     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1783   }
1784 
1785   /// Build a new OpenMP 'private' clause.
1786   ///
1787   /// By default, performs semantic analysis to build the new OpenMP clause.
1788   /// Subclasses may override this routine to provide different behavior.
RebuildOMPPrivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1789   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1790                                      SourceLocation StartLoc,
1791                                      SourceLocation LParenLoc,
1792                                      SourceLocation EndLoc) {
1793     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1794                                               EndLoc);
1795   }
1796 
1797   /// Build a new OpenMP 'firstprivate' clause.
1798   ///
1799   /// By default, performs semantic analysis to build the new OpenMP clause.
1800   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFirstprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1801   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1802                                           SourceLocation StartLoc,
1803                                           SourceLocation LParenLoc,
1804                                           SourceLocation EndLoc) {
1805     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1806                                                    EndLoc);
1807   }
1808 
1809   /// Build a new OpenMP 'lastprivate' clause.
1810   ///
1811   /// By default, performs semantic analysis to build the new OpenMP clause.
1812   /// Subclasses may override this routine to provide different behavior.
RebuildOMPLastprivateClause(ArrayRef<Expr * > VarList,OpenMPLastprivateModifier LPKind,SourceLocation LPKindLoc,SourceLocation ColonLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1813   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1814                                          OpenMPLastprivateModifier LPKind,
1815                                          SourceLocation LPKindLoc,
1816                                          SourceLocation ColonLoc,
1817                                          SourceLocation StartLoc,
1818                                          SourceLocation LParenLoc,
1819                                          SourceLocation EndLoc) {
1820     return getSema().ActOnOpenMPLastprivateClause(
1821         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1822   }
1823 
1824   /// Build a new OpenMP 'shared' clause.
1825   ///
1826   /// By default, performs semantic analysis to build the new OpenMP clause.
1827   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSharedClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1828   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1829                                     SourceLocation StartLoc,
1830                                     SourceLocation LParenLoc,
1831                                     SourceLocation EndLoc) {
1832     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1833                                              EndLoc);
1834   }
1835 
1836   /// Build a new OpenMP 'reduction' clause.
1837   ///
1838   /// By default, performs semantic analysis to build the new statement.
1839   /// Subclasses may override this routine to provide different behavior.
RebuildOMPReductionClause(ArrayRef<Expr * > VarList,OpenMPReductionClauseModifier Modifier,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc,CXXScopeSpec & ReductionIdScopeSpec,const DeclarationNameInfo & ReductionId,ArrayRef<Expr * > UnresolvedReductions)1840   OMPClause *RebuildOMPReductionClause(
1841       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1842       SourceLocation StartLoc, SourceLocation LParenLoc,
1843       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1844       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1845       const DeclarationNameInfo &ReductionId,
1846       ArrayRef<Expr *> UnresolvedReductions) {
1847     return getSema().ActOnOpenMPReductionClause(
1848         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1849         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1850   }
1851 
1852   /// Build a new OpenMP 'task_reduction' clause.
1853   ///
1854   /// By default, performs semantic analysis to build the new statement.
1855   /// Subclasses may override this routine to provide different behavior.
RebuildOMPTaskReductionClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,CXXScopeSpec & ReductionIdScopeSpec,const DeclarationNameInfo & ReductionId,ArrayRef<Expr * > UnresolvedReductions)1856   OMPClause *RebuildOMPTaskReductionClause(
1857       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1858       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1859       CXXScopeSpec &ReductionIdScopeSpec,
1860       const DeclarationNameInfo &ReductionId,
1861       ArrayRef<Expr *> UnresolvedReductions) {
1862     return getSema().ActOnOpenMPTaskReductionClause(
1863         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1864         ReductionId, UnresolvedReductions);
1865   }
1866 
1867   /// Build a new OpenMP 'in_reduction' clause.
1868   ///
1869   /// By default, performs semantic analysis to build the new statement.
1870   /// Subclasses may override this routine to provide different behavior.
1871   OMPClause *
RebuildOMPInReductionClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,CXXScopeSpec & ReductionIdScopeSpec,const DeclarationNameInfo & ReductionId,ArrayRef<Expr * > UnresolvedReductions)1872   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1873                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1874                               SourceLocation EndLoc,
1875                               CXXScopeSpec &ReductionIdScopeSpec,
1876                               const DeclarationNameInfo &ReductionId,
1877                               ArrayRef<Expr *> UnresolvedReductions) {
1878     return getSema().ActOnOpenMPInReductionClause(
1879         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1880         ReductionId, UnresolvedReductions);
1881   }
1882 
1883   /// Build a new OpenMP 'linear' clause.
1884   ///
1885   /// By default, performs semantic analysis to build the new OpenMP clause.
1886   /// Subclasses may override this routine to provide different behavior.
RebuildOMPLinearClause(ArrayRef<Expr * > VarList,Expr * Step,SourceLocation StartLoc,SourceLocation LParenLoc,OpenMPLinearClauseKind Modifier,SourceLocation ModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1887   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1888                                     SourceLocation StartLoc,
1889                                     SourceLocation LParenLoc,
1890                                     OpenMPLinearClauseKind Modifier,
1891                                     SourceLocation ModifierLoc,
1892                                     SourceLocation ColonLoc,
1893                                     SourceLocation EndLoc) {
1894     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1895                                              Modifier, ModifierLoc, ColonLoc,
1896                                              EndLoc);
1897   }
1898 
1899   /// Build a new OpenMP 'aligned' clause.
1900   ///
1901   /// By default, performs semantic analysis to build the new OpenMP clause.
1902   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAlignedClause(ArrayRef<Expr * > VarList,Expr * Alignment,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1903   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1904                                      SourceLocation StartLoc,
1905                                      SourceLocation LParenLoc,
1906                                      SourceLocation ColonLoc,
1907                                      SourceLocation EndLoc) {
1908     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1909                                               LParenLoc, ColonLoc, EndLoc);
1910   }
1911 
1912   /// Build a new OpenMP 'copyin' clause.
1913   ///
1914   /// By default, performs semantic analysis to build the new OpenMP clause.
1915   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyinClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1916   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1917                                     SourceLocation StartLoc,
1918                                     SourceLocation LParenLoc,
1919                                     SourceLocation EndLoc) {
1920     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1921                                              EndLoc);
1922   }
1923 
1924   /// Build a new OpenMP 'copyprivate' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new OpenMP clause.
1927   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1928   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1929                                          SourceLocation StartLoc,
1930                                          SourceLocation LParenLoc,
1931                                          SourceLocation EndLoc) {
1932     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1933                                                   EndLoc);
1934   }
1935 
1936   /// Build a new OpenMP 'flush' pseudo clause.
1937   ///
1938   /// By default, performs semantic analysis to build the new OpenMP clause.
1939   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFlushClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1940   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1941                                    SourceLocation StartLoc,
1942                                    SourceLocation LParenLoc,
1943                                    SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1945                                             EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'depobj' pseudo clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new OpenMP clause.
1951   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDepobjClause(Expr * Depobj,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1952   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1953                                     SourceLocation LParenLoc,
1954                                     SourceLocation EndLoc) {
1955     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1956                                              EndLoc);
1957   }
1958 
1959   /// Build a new OpenMP 'depend' pseudo clause.
1960   ///
1961   /// By default, performs semantic analysis to build the new OpenMP clause.
1962   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDependClause(OMPDependClause::DependDataTy Data,Expr * DepModifier,ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1963   OMPClause *RebuildOMPDependClause(OMPDependClause::DependDataTy Data,
1964                                     Expr *DepModifier, ArrayRef<Expr *> VarList,
1965                                     SourceLocation StartLoc,
1966                                     SourceLocation LParenLoc,
1967                                     SourceLocation EndLoc) {
1968     return getSema().ActOnOpenMPDependClause(Data, DepModifier, VarList,
1969                                              StartLoc, LParenLoc, EndLoc);
1970   }
1971 
1972   /// Build a new OpenMP 'device' clause.
1973   ///
1974   /// By default, performs semantic analysis to build the new statement.
1975   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,Expr * Device,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ModifierLoc,SourceLocation EndLoc)1976   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1977                                     Expr *Device, SourceLocation StartLoc,
1978                                     SourceLocation LParenLoc,
1979                                     SourceLocation ModifierLoc,
1980                                     SourceLocation EndLoc) {
1981     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1982                                              LParenLoc, ModifierLoc, EndLoc);
1983   }
1984 
1985   /// Build a new OpenMP 'map' clause.
1986   ///
1987   /// By default, performs semantic analysis to build the new OpenMP clause.
1988   /// Subclasses may override this routine to provide different behavior.
RebuildOMPMapClause(Expr * IteratorModifier,ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,ArrayRef<SourceLocation> MapTypeModifiersLoc,CXXScopeSpec MapperIdScopeSpec,DeclarationNameInfo MapperId,OpenMPMapClauseKind MapType,bool IsMapTypeImplicit,SourceLocation MapLoc,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs,ArrayRef<Expr * > UnresolvedMappers)1989   OMPClause *RebuildOMPMapClause(
1990       Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1991       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1992       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1993       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1994       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1995       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1996     return getSema().ActOnOpenMPMapClause(
1997         IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc,
1998         MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc,
1999         ColonLoc, VarList, Locs,
2000         /*NoDiagnose=*/false, UnresolvedMappers);
2001   }
2002 
2003   /// Build a new OpenMP 'allocate' clause.
2004   ///
2005   /// By default, performs semantic analysis to build the new OpenMP clause.
2006   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAllocateClause(Expr * Allocate,ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)2007   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
2008                                       SourceLocation StartLoc,
2009                                       SourceLocation LParenLoc,
2010                                       SourceLocation ColonLoc,
2011                                       SourceLocation EndLoc) {
2012     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
2013                                                LParenLoc, ColonLoc, EndLoc);
2014   }
2015 
2016   /// Build a new OpenMP 'num_teams' clause.
2017   ///
2018   /// By default, performs semantic analysis to build the new statement.
2019   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumTeamsClause(Expr * NumTeams,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2020   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
2021                                       SourceLocation LParenLoc,
2022                                       SourceLocation EndLoc) {
2023     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
2024                                                EndLoc);
2025   }
2026 
2027   /// Build a new OpenMP 'thread_limit' clause.
2028   ///
2029   /// By default, performs semantic analysis to build the new statement.
2030   /// Subclasses may override this routine to provide different behavior.
RebuildOMPThreadLimitClause(Expr * ThreadLimit,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2031   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
2032                                          SourceLocation StartLoc,
2033                                          SourceLocation LParenLoc,
2034                                          SourceLocation EndLoc) {
2035     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
2036                                                   LParenLoc, EndLoc);
2037   }
2038 
2039   /// Build a new OpenMP 'priority' clause.
2040   ///
2041   /// By default, performs semantic analysis to build the new statement.
2042   /// Subclasses may override this routine to provide different behavior.
RebuildOMPPriorityClause(Expr * Priority,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2043   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
2044                                       SourceLocation LParenLoc,
2045                                       SourceLocation EndLoc) {
2046     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
2047                                                EndLoc);
2048   }
2049 
2050   /// Build a new OpenMP 'grainsize' clause.
2051   ///
2052   /// By default, performs semantic analysis to build the new statement.
2053   /// Subclasses may override this routine to provide different behavior.
RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier,Expr * Device,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ModifierLoc,SourceLocation EndLoc)2054   OMPClause *RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier,
2055                                        Expr *Device, SourceLocation StartLoc,
2056                                        SourceLocation LParenLoc,
2057                                        SourceLocation ModifierLoc,
2058                                        SourceLocation EndLoc) {
2059     return getSema().ActOnOpenMPGrainsizeClause(Modifier, Device, StartLoc,
2060                                                 LParenLoc, ModifierLoc, EndLoc);
2061   }
2062 
2063   /// Build a new OpenMP 'num_tasks' clause.
2064   ///
2065   /// By default, performs semantic analysis to build the new statement.
2066   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier,Expr * NumTasks,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ModifierLoc,SourceLocation EndLoc)2067   OMPClause *RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier,
2068                                       Expr *NumTasks, SourceLocation StartLoc,
2069                                       SourceLocation LParenLoc,
2070                                       SourceLocation ModifierLoc,
2071                                       SourceLocation EndLoc) {
2072     return getSema().ActOnOpenMPNumTasksClause(Modifier, NumTasks, StartLoc,
2073                                                LParenLoc, ModifierLoc, EndLoc);
2074   }
2075 
2076   /// Build a new OpenMP 'hint' clause.
2077   ///
2078   /// By default, performs semantic analysis to build the new statement.
2079   /// Subclasses may override this routine to provide different behavior.
RebuildOMPHintClause(Expr * Hint,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2080   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2081                                   SourceLocation LParenLoc,
2082                                   SourceLocation EndLoc) {
2083     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2084   }
2085 
2086   /// Build a new OpenMP 'detach' clause.
2087   ///
2088   /// By default, performs semantic analysis to build the new statement.
2089   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDetachClause(Expr * Evt,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2090   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2091                                     SourceLocation LParenLoc,
2092                                     SourceLocation EndLoc) {
2093     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2094   }
2095 
2096   /// Build a new OpenMP 'dist_schedule' clause.
2097   ///
2098   /// By default, performs semantic analysis to build the new OpenMP clause.
2099   /// Subclasses may override this routine to provide different behavior.
2100   OMPClause *
RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,Expr * ChunkSize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation KindLoc,SourceLocation CommaLoc,SourceLocation EndLoc)2101   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2102                                Expr *ChunkSize, SourceLocation StartLoc,
2103                                SourceLocation LParenLoc, SourceLocation KindLoc,
2104                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2105     return getSema().ActOnOpenMPDistScheduleClause(
2106         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2107   }
2108 
2109   /// Build a new OpenMP 'to' clause.
2110   ///
2111   /// By default, performs semantic analysis to build the new statement.
2112   /// Subclasses may override this routine to provide different behavior.
2113   OMPClause *
RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,ArrayRef<SourceLocation> MotionModifiersLoc,CXXScopeSpec & MapperIdScopeSpec,DeclarationNameInfo & MapperId,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs,ArrayRef<Expr * > UnresolvedMappers)2114   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2115                      ArrayRef<SourceLocation> MotionModifiersLoc,
2116                      CXXScopeSpec &MapperIdScopeSpec,
2117                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2118                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2119                      ArrayRef<Expr *> UnresolvedMappers) {
2120     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2121                                          MapperIdScopeSpec, MapperId, ColonLoc,
2122                                          VarList, Locs, UnresolvedMappers);
2123   }
2124 
2125   /// Build a new OpenMP 'from' clause.
2126   ///
2127   /// By default, performs semantic analysis to build the new statement.
2128   /// Subclasses may override this routine to provide different behavior.
2129   OMPClause *
RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,ArrayRef<SourceLocation> MotionModifiersLoc,CXXScopeSpec & MapperIdScopeSpec,DeclarationNameInfo & MapperId,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs,ArrayRef<Expr * > UnresolvedMappers)2130   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2131                        ArrayRef<SourceLocation> MotionModifiersLoc,
2132                        CXXScopeSpec &MapperIdScopeSpec,
2133                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2134                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2135                        ArrayRef<Expr *> UnresolvedMappers) {
2136     return getSema().ActOnOpenMPFromClause(
2137         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2138         ColonLoc, VarList, Locs, UnresolvedMappers);
2139   }
2140 
2141   /// Build a new OpenMP 'use_device_ptr' clause.
2142   ///
2143   /// By default, performs semantic analysis to build the new OpenMP clause.
2144   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUseDevicePtrClause(ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs)2145   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2146                                           const OMPVarListLocTy &Locs) {
2147     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2148   }
2149 
2150   /// Build a new OpenMP 'use_device_addr' clause.
2151   ///
2152   /// By default, performs semantic analysis to build the new OpenMP clause.
2153   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUseDeviceAddrClause(ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs)2154   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2155                                            const OMPVarListLocTy &Locs) {
2156     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2157   }
2158 
2159   /// Build a new OpenMP 'is_device_ptr' clause.
2160   ///
2161   /// By default, performs semantic analysis to build the new OpenMP clause.
2162   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIsDevicePtrClause(ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs)2163   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2164                                          const OMPVarListLocTy &Locs) {
2165     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2166   }
2167 
2168   /// Build a new OpenMP 'has_device_addr' clause.
2169   ///
2170   /// By default, performs semantic analysis to build the new OpenMP clause.
2171   /// Subclasses may override this routine to provide different behavior.
RebuildOMPHasDeviceAddrClause(ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs)2172   OMPClause *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList,
2173                                            const OMPVarListLocTy &Locs) {
2174     return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs);
2175   }
2176 
2177   /// Build a new OpenMP 'defaultmap' clause.
2178   ///
2179   /// By default, performs semantic analysis to build the new OpenMP clause.
2180   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,OpenMPDefaultmapClauseKind Kind,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation MLoc,SourceLocation KindLoc,SourceLocation EndLoc)2181   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2182                                         OpenMPDefaultmapClauseKind Kind,
2183                                         SourceLocation StartLoc,
2184                                         SourceLocation LParenLoc,
2185                                         SourceLocation MLoc,
2186                                         SourceLocation KindLoc,
2187                                         SourceLocation EndLoc) {
2188     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2189                                                  MLoc, KindLoc, EndLoc);
2190   }
2191 
2192   /// Build a new OpenMP 'nontemporal' clause.
2193   ///
2194   /// By default, performs semantic analysis to build the new OpenMP clause.
2195   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNontemporalClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2196   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2197                                          SourceLocation StartLoc,
2198                                          SourceLocation LParenLoc,
2199                                          SourceLocation EndLoc) {
2200     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2201                                                   EndLoc);
2202   }
2203 
2204   /// Build a new OpenMP 'inclusive' clause.
2205   ///
2206   /// By default, performs semantic analysis to build the new OpenMP clause.
2207   /// Subclasses may override this routine to provide different behavior.
RebuildOMPInclusiveClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2208   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2209                                        SourceLocation StartLoc,
2210                                        SourceLocation LParenLoc,
2211                                        SourceLocation EndLoc) {
2212     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2213                                                 EndLoc);
2214   }
2215 
2216   /// Build a new OpenMP 'exclusive' clause.
2217   ///
2218   /// By default, performs semantic analysis to build the new OpenMP clause.
2219   /// Subclasses may override this routine to provide different behavior.
RebuildOMPExclusiveClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2220   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2221                                        SourceLocation StartLoc,
2222                                        SourceLocation LParenLoc,
2223                                        SourceLocation EndLoc) {
2224     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2225                                                 EndLoc);
2226   }
2227 
2228   /// Build a new OpenMP 'uses_allocators' clause.
2229   ///
2230   /// By default, performs semantic analysis to build the new OpenMP clause.
2231   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUsesAllocatorsClause(ArrayRef<Sema::UsesAllocatorsData> Data,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2232   OMPClause *RebuildOMPUsesAllocatorsClause(
2233       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2234       SourceLocation LParenLoc, SourceLocation EndLoc) {
2235     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2236                                                     Data);
2237   }
2238 
2239   /// Build a new OpenMP 'affinity' clause.
2240   ///
2241   /// By default, performs semantic analysis to build the new OpenMP clause.
2242   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAffinityClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,Expr * Modifier,ArrayRef<Expr * > Locators)2243   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2244                                       SourceLocation LParenLoc,
2245                                       SourceLocation ColonLoc,
2246                                       SourceLocation EndLoc, Expr *Modifier,
2247                                       ArrayRef<Expr *> Locators) {
2248     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2249                                                EndLoc, Modifier, Locators);
2250   }
2251 
2252   /// Build a new OpenMP 'order' clause.
2253   ///
2254   /// By default, performs semantic analysis to build the new OpenMP clause.
2255   /// Subclasses may override this routine to provide different behavior.
RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,OpenMPOrderClauseModifier Modifier,SourceLocation ModifierKwLoc)2256   OMPClause *RebuildOMPOrderClause(
2257       OpenMPOrderClauseKind Kind, SourceLocation KindKwLoc,
2258       SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc,
2259       OpenMPOrderClauseModifier Modifier, SourceLocation ModifierKwLoc) {
2260     return getSema().ActOnOpenMPOrderClause(Modifier, Kind, StartLoc, LParenLoc,
2261                                             ModifierKwLoc, KindKwLoc, EndLoc);
2262   }
2263 
2264   /// Build a new OpenMP 'init' clause.
2265   ///
2266   /// By default, performs semantic analysis to build the new OpenMP clause.
2267   /// Subclasses may override this routine to provide different behavior.
RebuildOMPInitClause(Expr * InteropVar,OMPInteropInfo & InteropInfo,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation VarLoc,SourceLocation EndLoc)2268   OMPClause *RebuildOMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo,
2269                                   SourceLocation StartLoc,
2270                                   SourceLocation LParenLoc,
2271                                   SourceLocation VarLoc,
2272                                   SourceLocation EndLoc) {
2273     return getSema().ActOnOpenMPInitClause(InteropVar, InteropInfo, StartLoc,
2274                                            LParenLoc, VarLoc, EndLoc);
2275   }
2276 
2277   /// Build a new OpenMP 'use' clause.
2278   ///
2279   /// By default, performs semantic analysis to build the new OpenMP clause.
2280   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUseClause(Expr * InteropVar,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation VarLoc,SourceLocation EndLoc)2281   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2282                                  SourceLocation LParenLoc,
2283                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2284     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2285                                           VarLoc, EndLoc);
2286   }
2287 
2288   /// Build a new OpenMP 'destroy' clause.
2289   ///
2290   /// By default, performs semantic analysis to build the new OpenMP clause.
2291   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDestroyClause(Expr * InteropVar,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation VarLoc,SourceLocation EndLoc)2292   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2293                                      SourceLocation LParenLoc,
2294                                      SourceLocation VarLoc,
2295                                      SourceLocation EndLoc) {
2296     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2297                                               VarLoc, EndLoc);
2298   }
2299 
2300   /// Build a new OpenMP 'novariants' clause.
2301   ///
2302   /// By default, performs semantic analysis to build the new OpenMP clause.
2303   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNovariantsClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2304   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2305                                         SourceLocation StartLoc,
2306                                         SourceLocation LParenLoc,
2307                                         SourceLocation EndLoc) {
2308     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2309                                                  EndLoc);
2310   }
2311 
2312   /// Build a new OpenMP 'nocontext' clause.
2313   ///
2314   /// By default, performs semantic analysis to build the new OpenMP clause.
2315   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNocontextClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2316   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2317                                        SourceLocation LParenLoc,
2318                                        SourceLocation EndLoc) {
2319     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2320                                                 EndLoc);
2321   }
2322 
2323   /// Build a new OpenMP 'filter' clause.
2324   ///
2325   /// By default, performs semantic analysis to build the new OpenMP clause.
2326   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFilterClause(Expr * ThreadID,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2327   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2328                                     SourceLocation LParenLoc,
2329                                     SourceLocation EndLoc) {
2330     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2331                                              EndLoc);
2332   }
2333 
2334   /// Build a new OpenMP 'bind' clause.
2335   ///
2336   /// By default, performs semantic analysis to build the new OpenMP clause.
2337   /// Subclasses may override this routine to provide different behavior.
RebuildOMPBindClause(OpenMPBindClauseKind Kind,SourceLocation KindLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2338   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2339                                   SourceLocation KindLoc,
2340                                   SourceLocation StartLoc,
2341                                   SourceLocation LParenLoc,
2342                                   SourceLocation EndLoc) {
2343     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2344                                            EndLoc);
2345   }
2346 
2347   /// Build a new OpenMP 'ompx_dyn_cgroup_mem' clause.
2348   ///
2349   /// By default, performs semantic analysis to build the new OpenMP clause.
2350   /// Subclasses may override this routine to provide different behavior.
RebuildOMPXDynCGroupMemClause(Expr * Size,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2351   OMPClause *RebuildOMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc,
2352                                            SourceLocation LParenLoc,
2353                                            SourceLocation EndLoc) {
2354     return getSema().ActOnOpenMPXDynCGroupMemClause(Size, StartLoc, LParenLoc,
2355                                                     EndLoc);
2356   }
2357 
2358   /// Build a new OpenMP 'align' clause.
2359   ///
2360   /// By default, performs semantic analysis to build the new OpenMP clause.
2361   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAlignClause(Expr * A,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2362   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2363                                    SourceLocation LParenLoc,
2364                                    SourceLocation EndLoc) {
2365     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2366   }
2367 
2368   /// Build a new OpenMP 'at' clause.
2369   ///
2370   /// By default, performs semantic analysis to build the new OpenMP clause.
2371   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAtClause(OpenMPAtClauseKind Kind,SourceLocation KwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2372   OMPClause *RebuildOMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KwLoc,
2373                                 SourceLocation StartLoc,
2374                                 SourceLocation LParenLoc,
2375                                 SourceLocation EndLoc) {
2376     return getSema().ActOnOpenMPAtClause(Kind, KwLoc, StartLoc, LParenLoc,
2377                                          EndLoc);
2378   }
2379 
2380   /// Build a new OpenMP 'severity' clause.
2381   ///
2382   /// By default, performs semantic analysis to build the new OpenMP clause.
2383   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind,SourceLocation KwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2384   OMPClause *RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind,
2385                                       SourceLocation KwLoc,
2386                                       SourceLocation StartLoc,
2387                                       SourceLocation LParenLoc,
2388                                       SourceLocation EndLoc) {
2389     return getSema().ActOnOpenMPSeverityClause(Kind, KwLoc, StartLoc, LParenLoc,
2390                                                EndLoc);
2391   }
2392 
2393   /// Build a new OpenMP 'message' clause.
2394   ///
2395   /// By default, performs semantic analysis to build the new OpenMP clause.
2396   /// Subclasses may override this routine to provide different behavior.
RebuildOMPMessageClause(Expr * MS,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2397   OMPClause *RebuildOMPMessageClause(Expr *MS, SourceLocation StartLoc,
2398                                      SourceLocation LParenLoc,
2399                                      SourceLocation EndLoc) {
2400     return getSema().ActOnOpenMPMessageClause(MS, StartLoc, LParenLoc, EndLoc);
2401   }
2402 
2403   /// Rebuild the operand to an Objective-C \@synchronized statement.
2404   ///
2405   /// By default, performs semantic analysis to build the new statement.
2406   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,Expr * object)2407   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2408                                               Expr *object) {
2409     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2410   }
2411 
2412   /// Build a new Objective-C \@synchronized statement.
2413   ///
2414   /// By default, performs semantic analysis to build the new statement.
2415   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,Expr * Object,Stmt * Body)2416   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2417                                            Expr *Object, Stmt *Body) {
2418     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2419   }
2420 
2421   /// Build a new Objective-C \@autoreleasepool statement.
2422   ///
2423   /// By default, performs semantic analysis to build the new statement.
2424   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,Stmt * Body)2425   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2426                                             Stmt *Body) {
2427     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2428   }
2429 
2430   /// Build a new Objective-C fast enumeration statement.
2431   ///
2432   /// By default, performs semantic analysis to build the new statement.
2433   /// Subclasses may override this routine to provide different behavior.
RebuildObjCForCollectionStmt(SourceLocation ForLoc,Stmt * Element,Expr * Collection,SourceLocation RParenLoc,Stmt * Body)2434   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2435                                           Stmt *Element,
2436                                           Expr *Collection,
2437                                           SourceLocation RParenLoc,
2438                                           Stmt *Body) {
2439     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2440                                                 Element,
2441                                                 Collection,
2442                                                 RParenLoc);
2443     if (ForEachStmt.isInvalid())
2444       return StmtError();
2445 
2446     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2447   }
2448 
2449   /// Build a new C++ exception declaration.
2450   ///
2451   /// By default, performs semantic analysis to build the new decaration.
2452   /// Subclasses may override this routine to provide different behavior.
RebuildExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * Declarator,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id)2453   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2454                                 TypeSourceInfo *Declarator,
2455                                 SourceLocation StartLoc,
2456                                 SourceLocation IdLoc,
2457                                 IdentifierInfo *Id) {
2458     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2459                                                        StartLoc, IdLoc, Id);
2460     if (Var)
2461       getSema().CurContext->addDecl(Var);
2462     return Var;
2463   }
2464 
2465   /// Build a new C++ catch statement.
2466   ///
2467   /// By default, performs semantic analysis to build the new statement.
2468   /// Subclasses may override this routine to provide different behavior.
RebuildCXXCatchStmt(SourceLocation CatchLoc,VarDecl * ExceptionDecl,Stmt * Handler)2469   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2470                                  VarDecl *ExceptionDecl,
2471                                  Stmt *Handler) {
2472     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2473                                                       Handler));
2474   }
2475 
2476   /// Build a new C++ try statement.
2477   ///
2478   /// By default, performs semantic analysis to build the new statement.
2479   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTryStmt(SourceLocation TryLoc,Stmt * TryBlock,ArrayRef<Stmt * > Handlers)2480   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2481                                ArrayRef<Stmt *> Handlers) {
2482     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2483   }
2484 
2485   /// Build a new C++0x range-based for statement.
2486   ///
2487   /// By default, performs semantic analysis to build the new statement.
2488   /// Subclasses may override this routine to provide different behavior.
RebuildCXXForRangeStmt(SourceLocation ForLoc,SourceLocation CoawaitLoc,Stmt * Init,SourceLocation ColonLoc,Stmt * Range,Stmt * Begin,Stmt * End,Expr * Cond,Expr * Inc,Stmt * LoopVar,SourceLocation RParenLoc)2489   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2490                                     SourceLocation CoawaitLoc, Stmt *Init,
2491                                     SourceLocation ColonLoc, Stmt *Range,
2492                                     Stmt *Begin, Stmt *End, Expr *Cond,
2493                                     Expr *Inc, Stmt *LoopVar,
2494                                     SourceLocation RParenLoc) {
2495     // If we've just learned that the range is actually an Objective-C
2496     // collection, treat this as an Objective-C fast enumeration loop.
2497     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2498       if (RangeStmt->isSingleDecl()) {
2499         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2500           if (RangeVar->isInvalidDecl())
2501             return StmtError();
2502 
2503           Expr *RangeExpr = RangeVar->getInit();
2504           if (!RangeExpr->isTypeDependent() &&
2505               RangeExpr->getType()->isObjCObjectPointerType()) {
2506             // FIXME: Support init-statements in Objective-C++20 ranged for
2507             // statement.
2508             if (Init) {
2509               return SemaRef.Diag(Init->getBeginLoc(),
2510                                   diag::err_objc_for_range_init_stmt)
2511                          << Init->getSourceRange();
2512             }
2513             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2514                                                         RangeExpr, RParenLoc);
2515           }
2516         }
2517       }
2518     }
2519 
2520     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2521                                           Range, Begin, End, Cond, Inc, LoopVar,
2522                                           RParenLoc, Sema::BFRK_Rebuild);
2523   }
2524 
2525   /// Build a new C++0x range-based for statement.
2526   ///
2527   /// By default, performs semantic analysis to build the new statement.
2528   /// Subclasses may override this routine to provide different behavior.
RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,bool IsIfExists,NestedNameSpecifierLoc QualifierLoc,DeclarationNameInfo NameInfo,Stmt * Nested)2529   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2530                                           bool IsIfExists,
2531                                           NestedNameSpecifierLoc QualifierLoc,
2532                                           DeclarationNameInfo NameInfo,
2533                                           Stmt *Nested) {
2534     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2535                                                 QualifierLoc, NameInfo, Nested);
2536   }
2537 
2538   /// Attach body to a C++0x range-based for statement.
2539   ///
2540   /// By default, performs semantic analysis to finish the new statement.
2541   /// Subclasses may override this routine to provide different behavior.
FinishCXXForRangeStmt(Stmt * ForRange,Stmt * Body)2542   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2543     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2544   }
2545 
RebuildSEHTryStmt(bool IsCXXTry,SourceLocation TryLoc,Stmt * TryBlock,Stmt * Handler)2546   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2547                                Stmt *TryBlock, Stmt *Handler) {
2548     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2549   }
2550 
RebuildSEHExceptStmt(SourceLocation Loc,Expr * FilterExpr,Stmt * Block)2551   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2552                                   Stmt *Block) {
2553     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2554   }
2555 
RebuildSEHFinallyStmt(SourceLocation Loc,Stmt * Block)2556   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2557     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2558   }
2559 
RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,SourceLocation LParen,SourceLocation RParen,TypeSourceInfo * TSI)2560   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2561                                              SourceLocation LParen,
2562                                              SourceLocation RParen,
2563                                              TypeSourceInfo *TSI) {
2564     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2565   }
2566 
2567   /// Build a new predefined expression.
2568   ///
2569   /// By default, performs semantic analysis to build the new expression.
2570   /// Subclasses may override this routine to provide different behavior.
RebuildPredefinedExpr(SourceLocation Loc,PredefinedExpr::IdentKind IK)2571   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2572                                    PredefinedExpr::IdentKind IK) {
2573     return getSema().BuildPredefinedExpr(Loc, IK);
2574   }
2575 
2576   /// Build a new expression that references a declaration.
2577   ///
2578   /// By default, performs semantic analysis to build the new expression.
2579   /// Subclasses may override this routine to provide different behavior.
RebuildDeclarationNameExpr(const CXXScopeSpec & SS,LookupResult & R,bool RequiresADL)2580   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2581                                         LookupResult &R,
2582                                         bool RequiresADL) {
2583     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2584   }
2585 
2586 
2587   /// Build a new expression that references a declaration.
2588   ///
2589   /// By default, performs semantic analysis to build the new expression.
2590   /// Subclasses may override this routine to provide different behavior.
RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,ValueDecl * VD,const DeclarationNameInfo & NameInfo,NamedDecl * Found,TemplateArgumentListInfo * TemplateArgs)2591   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2592                                 ValueDecl *VD,
2593                                 const DeclarationNameInfo &NameInfo,
2594                                 NamedDecl *Found,
2595                                 TemplateArgumentListInfo *TemplateArgs) {
2596     CXXScopeSpec SS;
2597     SS.Adopt(QualifierLoc);
2598     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2599                                               TemplateArgs);
2600   }
2601 
2602   /// Build a new expression in parentheses.
2603   ///
2604   /// By default, performs semantic analysis to build the new expression.
2605   /// Subclasses may override this routine to provide different behavior.
RebuildParenExpr(Expr * SubExpr,SourceLocation LParen,SourceLocation RParen)2606   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2607                                     SourceLocation RParen) {
2608     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2609   }
2610 
2611   /// Build a new pseudo-destructor expression.
2612   ///
2613   /// By default, performs semantic analysis to build the new expression.
2614   /// Subclasses may override this routine to provide different behavior.
2615   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2616                                             SourceLocation OperatorLoc,
2617                                             bool isArrow,
2618                                             CXXScopeSpec &SS,
2619                                             TypeSourceInfo *ScopeType,
2620                                             SourceLocation CCLoc,
2621                                             SourceLocation TildeLoc,
2622                                         PseudoDestructorTypeStorage Destroyed);
2623 
2624   /// Build a new unary operator expression.
2625   ///
2626   /// By default, performs semantic analysis to build the new expression.
2627   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryOperator(SourceLocation OpLoc,UnaryOperatorKind Opc,Expr * SubExpr)2628   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2629                                         UnaryOperatorKind Opc,
2630                                         Expr *SubExpr) {
2631     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2632   }
2633 
2634   /// Build a new builtin offsetof expression.
2635   ///
2636   /// By default, performs semantic analysis to build the new expression.
2637   /// Subclasses may override this routine to provide different behavior.
RebuildOffsetOfExpr(SourceLocation OperatorLoc,TypeSourceInfo * Type,ArrayRef<Sema::OffsetOfComponent> Components,SourceLocation RParenLoc)2638   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2639                                  TypeSourceInfo *Type,
2640                                  ArrayRef<Sema::OffsetOfComponent> Components,
2641                                  SourceLocation RParenLoc) {
2642     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2643                                           RParenLoc);
2644   }
2645 
2646   /// Build a new sizeof, alignof or vec_step expression with a
2647   /// type argument.
2648   ///
2649   /// By default, performs semantic analysis to build the new expression.
2650   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(TypeSourceInfo * TInfo,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)2651   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2652                                          SourceLocation OpLoc,
2653                                          UnaryExprOrTypeTrait ExprKind,
2654                                          SourceRange R) {
2655     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2656   }
2657 
2658   /// Build a new sizeof, alignof or vec step expression with an
2659   /// expression argument.
2660   ///
2661   /// By default, performs semantic analysis to build the new expression.
2662   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(Expr * SubExpr,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)2663   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2664                                          UnaryExprOrTypeTrait ExprKind,
2665                                          SourceRange R) {
2666     ExprResult Result
2667       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2668     if (Result.isInvalid())
2669       return ExprError();
2670 
2671     return Result;
2672   }
2673 
2674   /// Build a new array subscript expression.
2675   ///
2676   /// By default, performs semantic analysis to build the new expression.
2677   /// Subclasses may override this routine to provide different behavior.
RebuildArraySubscriptExpr(Expr * LHS,SourceLocation LBracketLoc,Expr * RHS,SourceLocation RBracketLoc)2678   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2679                                              SourceLocation LBracketLoc,
2680                                              Expr *RHS,
2681                                              SourceLocation RBracketLoc) {
2682     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2683                                              LBracketLoc, RHS,
2684                                              RBracketLoc);
2685   }
2686 
2687   /// Build a new matrix subscript expression.
2688   ///
2689   /// By default, performs semantic analysis to build the new expression.
2690   /// Subclasses may override this routine to provide different behavior.
RebuildMatrixSubscriptExpr(Expr * Base,Expr * RowIdx,Expr * ColumnIdx,SourceLocation RBracketLoc)2691   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2692                                         Expr *ColumnIdx,
2693                                         SourceLocation RBracketLoc) {
2694     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2695                                                       RBracketLoc);
2696   }
2697 
2698   /// Build a new array section expression.
2699   ///
2700   /// By default, performs semantic analysis to build the new expression.
2701   /// Subclasses may override this routine to provide different behavior.
RebuildOMPArraySectionExpr(Expr * Base,SourceLocation LBracketLoc,Expr * LowerBound,SourceLocation ColonLocFirst,SourceLocation ColonLocSecond,Expr * Length,Expr * Stride,SourceLocation RBracketLoc)2702   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2703                                         Expr *LowerBound,
2704                                         SourceLocation ColonLocFirst,
2705                                         SourceLocation ColonLocSecond,
2706                                         Expr *Length, Expr *Stride,
2707                                         SourceLocation RBracketLoc) {
2708     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2709                                               ColonLocFirst, ColonLocSecond,
2710                                               Length, Stride, RBracketLoc);
2711   }
2712 
2713   /// Build a new array shaping expression.
2714   ///
2715   /// By default, performs semantic analysis to build the new expression.
2716   /// Subclasses may override this routine to provide different behavior.
RebuildOMPArrayShapingExpr(Expr * Base,SourceLocation LParenLoc,SourceLocation RParenLoc,ArrayRef<Expr * > Dims,ArrayRef<SourceRange> BracketsRanges)2717   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2718                                         SourceLocation RParenLoc,
2719                                         ArrayRef<Expr *> Dims,
2720                                         ArrayRef<SourceRange> BracketsRanges) {
2721     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2722                                               BracketsRanges);
2723   }
2724 
2725   /// Build a new iterator expression.
2726   ///
2727   /// By default, performs semantic analysis to build the new expression.
2728   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIteratorExpr(SourceLocation IteratorKwLoc,SourceLocation LLoc,SourceLocation RLoc,ArrayRef<Sema::OMPIteratorData> Data)2729   ExprResult RebuildOMPIteratorExpr(
2730       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2731       ArrayRef<Sema::OMPIteratorData> Data) {
2732     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2733                                           LLoc, RLoc, Data);
2734   }
2735 
2736   /// Build a new call expression.
2737   ///
2738   /// By default, performs semantic analysis to build the new expression.
2739   /// Subclasses may override this routine to provide different behavior.
2740   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2741                                    MultiExprArg Args,
2742                                    SourceLocation RParenLoc,
2743                                    Expr *ExecConfig = nullptr) {
2744     return getSema().ActOnCallExpr(
2745         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2746   }
2747 
RebuildCxxSubscriptExpr(Expr * Callee,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2748   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2749                                      MultiExprArg Args,
2750                                      SourceLocation RParenLoc) {
2751     return getSema().ActOnArraySubscriptExpr(
2752         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2753   }
2754 
2755   /// Build a new member access expression.
2756   ///
2757   /// By default, performs semantic analysis to build the new expression.
2758   /// Subclasses may override this routine to provide different behavior.
RebuildMemberExpr(Expr * Base,SourceLocation OpLoc,bool isArrow,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & MemberNameInfo,ValueDecl * Member,NamedDecl * FoundDecl,const TemplateArgumentListInfo * ExplicitTemplateArgs,NamedDecl * FirstQualifierInScope)2759   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2760                                bool isArrow,
2761                                NestedNameSpecifierLoc QualifierLoc,
2762                                SourceLocation TemplateKWLoc,
2763                                const DeclarationNameInfo &MemberNameInfo,
2764                                ValueDecl *Member,
2765                                NamedDecl *FoundDecl,
2766                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2767                                NamedDecl *FirstQualifierInScope) {
2768     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2769                                                                       isArrow);
2770     if (!Member->getDeclName()) {
2771       // We have a reference to an unnamed field.  This is always the
2772       // base of an anonymous struct/union member access, i.e. the
2773       // field is always of record type.
2774       assert(Member->getType()->isRecordType() &&
2775              "unnamed member not of record type?");
2776 
2777       BaseResult =
2778         getSema().PerformObjectMemberConversion(BaseResult.get(),
2779                                                 QualifierLoc.getNestedNameSpecifier(),
2780                                                 FoundDecl, Member);
2781       if (BaseResult.isInvalid())
2782         return ExprError();
2783       Base = BaseResult.get();
2784 
2785       CXXScopeSpec EmptySS;
2786       return getSema().BuildFieldReferenceExpr(
2787           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2788           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2789     }
2790 
2791     CXXScopeSpec SS;
2792     SS.Adopt(QualifierLoc);
2793 
2794     Base = BaseResult.get();
2795     QualType BaseType = Base->getType();
2796 
2797     if (isArrow && !BaseType->isPointerType())
2798       return ExprError();
2799 
2800     // FIXME: this involves duplicating earlier analysis in a lot of
2801     // cases; we should avoid this when possible.
2802     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2803     R.addDecl(FoundDecl);
2804     R.resolveKind();
2805 
2806     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2807                                               SS, TemplateKWLoc,
2808                                               FirstQualifierInScope,
2809                                               R, ExplicitTemplateArgs,
2810                                               /*S*/nullptr);
2811   }
2812 
2813   /// Build a new binary operator expression.
2814   ///
2815   /// By default, performs semantic analysis to build the new expression.
2816   /// Subclasses may override this routine to provide different behavior.
RebuildBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opc,Expr * LHS,Expr * RHS)2817   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2818                                          BinaryOperatorKind Opc,
2819                                          Expr *LHS, Expr *RHS) {
2820     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2821   }
2822 
2823   /// Build a new rewritten operator expression.
2824   ///
2825   /// By default, performs semantic analysis to build the new expression.
2826   /// Subclasses may override this routine to provide different behavior.
RebuildCXXRewrittenBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opcode,const UnresolvedSetImpl & UnqualLookups,Expr * LHS,Expr * RHS)2827   ExprResult RebuildCXXRewrittenBinaryOperator(
2828       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2829       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2830     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2831                                            RHS, /*RequiresADL*/false);
2832   }
2833 
2834   /// Build a new conditional operator expression.
2835   ///
2836   /// By default, performs semantic analysis to build the new expression.
2837   /// Subclasses may override this routine to provide different behavior.
RebuildConditionalOperator(Expr * Cond,SourceLocation QuestionLoc,Expr * LHS,SourceLocation ColonLoc,Expr * RHS)2838   ExprResult RebuildConditionalOperator(Expr *Cond,
2839                                         SourceLocation QuestionLoc,
2840                                         Expr *LHS,
2841                                         SourceLocation ColonLoc,
2842                                         Expr *RHS) {
2843     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2844                                         LHS, RHS);
2845   }
2846 
2847   /// Build a new C-style cast expression.
2848   ///
2849   /// By default, performs semantic analysis to build the new expression.
2850   /// Subclasses may override this routine to provide different behavior.
RebuildCStyleCastExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * SubExpr)2851   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2852                                          TypeSourceInfo *TInfo,
2853                                          SourceLocation RParenLoc,
2854                                          Expr *SubExpr) {
2855     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2856                                          SubExpr);
2857   }
2858 
2859   /// Build a new compound literal expression.
2860   ///
2861   /// By default, performs semantic analysis to build the new expression.
2862   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundLiteralExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * Init)2863   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2864                                               TypeSourceInfo *TInfo,
2865                                               SourceLocation RParenLoc,
2866                                               Expr *Init) {
2867     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2868                                               Init);
2869   }
2870 
2871   /// Build a new extended vector element access expression.
2872   ///
2873   /// By default, performs semantic analysis to build the new expression.
2874   /// Subclasses may override this routine to provide different behavior.
RebuildExtVectorElementExpr(Expr * Base,SourceLocation OpLoc,bool IsArrow,SourceLocation AccessorLoc,IdentifierInfo & Accessor)2875   ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc,
2876                                          bool IsArrow,
2877                                          SourceLocation AccessorLoc,
2878                                          IdentifierInfo &Accessor) {
2879 
2880     CXXScopeSpec SS;
2881     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2882     return getSema().BuildMemberReferenceExpr(
2883         Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(),
2884         /*FirstQualifierInScope*/ nullptr, NameInfo,
2885         /* TemplateArgs */ nullptr,
2886         /*S*/ nullptr);
2887   }
2888 
2889   /// Build a new initializer list expression.
2890   ///
2891   /// By default, performs semantic analysis to build the new expression.
2892   /// Subclasses may override this routine to provide different behavior.
RebuildInitList(SourceLocation LBraceLoc,MultiExprArg Inits,SourceLocation RBraceLoc)2893   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2894                              MultiExprArg Inits,
2895                              SourceLocation RBraceLoc) {
2896     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2897   }
2898 
2899   /// Build a new designated initializer expression.
2900   ///
2901   /// By default, performs semantic analysis to build the new expression.
2902   /// Subclasses may override this routine to provide different behavior.
RebuildDesignatedInitExpr(Designation & Desig,MultiExprArg ArrayExprs,SourceLocation EqualOrColonLoc,bool GNUSyntax,Expr * Init)2903   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2904                                              MultiExprArg ArrayExprs,
2905                                              SourceLocation EqualOrColonLoc,
2906                                              bool GNUSyntax,
2907                                              Expr *Init) {
2908     ExprResult Result
2909       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2910                                            Init);
2911     if (Result.isInvalid())
2912       return ExprError();
2913 
2914     return Result;
2915   }
2916 
2917   /// Build a new value-initialized expression.
2918   ///
2919   /// By default, builds the implicit value initialization without performing
2920   /// any semantic analysis. Subclasses may override this routine to provide
2921   /// different behavior.
RebuildImplicitValueInitExpr(QualType T)2922   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2923     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2924   }
2925 
2926   /// Build a new \c va_arg expression.
2927   ///
2928   /// By default, performs semantic analysis to build the new expression.
2929   /// Subclasses may override this routine to provide different behavior.
RebuildVAArgExpr(SourceLocation BuiltinLoc,Expr * SubExpr,TypeSourceInfo * TInfo,SourceLocation RParenLoc)2930   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2931                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2932                                     SourceLocation RParenLoc) {
2933     return getSema().BuildVAArgExpr(BuiltinLoc,
2934                                     SubExpr, TInfo,
2935                                     RParenLoc);
2936   }
2937 
2938   /// Build a new expression list in parentheses.
2939   ///
2940   /// By default, performs semantic analysis to build the new expression.
2941   /// Subclasses may override this routine to provide different behavior.
RebuildParenListExpr(SourceLocation LParenLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2942   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2943                                   MultiExprArg SubExprs,
2944                                   SourceLocation RParenLoc) {
2945     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2946   }
2947 
2948   /// Build a new address-of-label expression.
2949   ///
2950   /// By default, performs semantic analysis, using the name of the label
2951   /// rather than attempting to map the label statement itself.
2952   /// Subclasses may override this routine to provide different behavior.
RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,SourceLocation LabelLoc,LabelDecl * Label)2953   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2954                                   SourceLocation LabelLoc, LabelDecl *Label) {
2955     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2956   }
2957 
2958   /// Build a new GNU statement expression.
2959   ///
2960   /// By default, performs semantic analysis to build the new expression.
2961   /// Subclasses may override this routine to provide different behavior.
RebuildStmtExpr(SourceLocation LParenLoc,Stmt * SubStmt,SourceLocation RParenLoc,unsigned TemplateDepth)2962   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2963                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2964     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2965                                    TemplateDepth);
2966   }
2967 
2968   /// Build a new __builtin_choose_expr expression.
2969   ///
2970   /// By default, performs semantic analysis to build the new expression.
2971   /// Subclasses may override this routine to provide different behavior.
RebuildChooseExpr(SourceLocation BuiltinLoc,Expr * Cond,Expr * LHS,Expr * RHS,SourceLocation RParenLoc)2972   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2973                                      Expr *Cond, Expr *LHS, Expr *RHS,
2974                                      SourceLocation RParenLoc) {
2975     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2976                                    Cond, LHS, RHS,
2977                                    RParenLoc);
2978   }
2979 
2980   /// Build a new generic selection expression.
2981   ///
2982   /// By default, performs semantic analysis to build the new expression.
2983   /// Subclasses may override this routine to provide different behavior.
RebuildGenericSelectionExpr(SourceLocation KeyLoc,SourceLocation DefaultLoc,SourceLocation RParenLoc,Expr * ControllingExpr,ArrayRef<TypeSourceInfo * > Types,ArrayRef<Expr * > Exprs)2984   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2985                                          SourceLocation DefaultLoc,
2986                                          SourceLocation RParenLoc,
2987                                          Expr *ControllingExpr,
2988                                          ArrayRef<TypeSourceInfo *> Types,
2989                                          ArrayRef<Expr *> Exprs) {
2990     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2991                                                 ControllingExpr, Types, Exprs);
2992   }
2993 
2994   /// Build a new overloaded operator call expression.
2995   ///
2996   /// By default, performs semantic analysis to build the new expression.
2997   /// The semantic analysis provides the behavior of template instantiation,
2998   /// copying with transformations that turn what looks like an overloaded
2999   /// operator call into a use of a builtin operator, performing
3000   /// argument-dependent lookup, etc. Subclasses may override this routine to
3001   /// provide different behavior.
3002   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
3003                                               SourceLocation OpLoc,
3004                                               Expr *Callee,
3005                                               Expr *First,
3006                                               Expr *Second);
3007 
3008   /// Build a new C++ "named" cast expression, such as static_cast or
3009   /// reinterpret_cast.
3010   ///
3011   /// By default, this routine dispatches to one of the more-specific routines
3012   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
3013   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNamedCastExpr(SourceLocation OpLoc,Stmt::StmtClass Class,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)3014   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
3015                                            Stmt::StmtClass Class,
3016                                            SourceLocation LAngleLoc,
3017                                            TypeSourceInfo *TInfo,
3018                                            SourceLocation RAngleLoc,
3019                                            SourceLocation LParenLoc,
3020                                            Expr *SubExpr,
3021                                            SourceLocation RParenLoc) {
3022     switch (Class) {
3023     case Stmt::CXXStaticCastExprClass:
3024       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
3025                                                    RAngleLoc, LParenLoc,
3026                                                    SubExpr, RParenLoc);
3027 
3028     case Stmt::CXXDynamicCastExprClass:
3029       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
3030                                                     RAngleLoc, LParenLoc,
3031                                                     SubExpr, RParenLoc);
3032 
3033     case Stmt::CXXReinterpretCastExprClass:
3034       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
3035                                                         RAngleLoc, LParenLoc,
3036                                                         SubExpr,
3037                                                         RParenLoc);
3038 
3039     case Stmt::CXXConstCastExprClass:
3040       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
3041                                                    RAngleLoc, LParenLoc,
3042                                                    SubExpr, RParenLoc);
3043 
3044     case Stmt::CXXAddrspaceCastExprClass:
3045       return getDerived().RebuildCXXAddrspaceCastExpr(
3046           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
3047 
3048     default:
3049       llvm_unreachable("Invalid C++ named cast");
3050     }
3051   }
3052 
3053   /// Build a new C++ static_cast expression.
3054   ///
3055   /// By default, performs semantic analysis to build the new expression.
3056   /// Subclasses may override this routine to provide different behavior.
RebuildCXXStaticCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)3057   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
3058                                             SourceLocation LAngleLoc,
3059                                             TypeSourceInfo *TInfo,
3060                                             SourceLocation RAngleLoc,
3061                                             SourceLocation LParenLoc,
3062                                             Expr *SubExpr,
3063                                             SourceLocation RParenLoc) {
3064     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
3065                                        TInfo, SubExpr,
3066                                        SourceRange(LAngleLoc, RAngleLoc),
3067                                        SourceRange(LParenLoc, RParenLoc));
3068   }
3069 
3070   /// Build a new C++ dynamic_cast expression.
3071   ///
3072   /// By default, performs semantic analysis to build the new expression.
3073   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDynamicCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)3074   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
3075                                              SourceLocation LAngleLoc,
3076                                              TypeSourceInfo *TInfo,
3077                                              SourceLocation RAngleLoc,
3078                                              SourceLocation LParenLoc,
3079                                              Expr *SubExpr,
3080                                              SourceLocation RParenLoc) {
3081     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
3082                                        TInfo, SubExpr,
3083                                        SourceRange(LAngleLoc, RAngleLoc),
3084                                        SourceRange(LParenLoc, RParenLoc));
3085   }
3086 
3087   /// Build a new C++ reinterpret_cast expression.
3088   ///
3089   /// By default, performs semantic analysis to build the new expression.
3090   /// Subclasses may override this routine to provide different behavior.
RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)3091   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
3092                                                  SourceLocation LAngleLoc,
3093                                                  TypeSourceInfo *TInfo,
3094                                                  SourceLocation RAngleLoc,
3095                                                  SourceLocation LParenLoc,
3096                                                  Expr *SubExpr,
3097                                                  SourceLocation RParenLoc) {
3098     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
3099                                        TInfo, SubExpr,
3100                                        SourceRange(LAngleLoc, RAngleLoc),
3101                                        SourceRange(LParenLoc, RParenLoc));
3102   }
3103 
3104   /// Build a new C++ const_cast expression.
3105   ///
3106   /// By default, performs semantic analysis to build the new expression.
3107   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)3108   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
3109                                            SourceLocation LAngleLoc,
3110                                            TypeSourceInfo *TInfo,
3111                                            SourceLocation RAngleLoc,
3112                                            SourceLocation LParenLoc,
3113                                            Expr *SubExpr,
3114                                            SourceLocation RParenLoc) {
3115     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3116                                        TInfo, SubExpr,
3117                                        SourceRange(LAngleLoc, RAngleLoc),
3118                                        SourceRange(LParenLoc, RParenLoc));
3119   }
3120 
3121   ExprResult
RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)3122   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3123                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3124                               SourceLocation LParenLoc, Expr *SubExpr,
3125                               SourceLocation RParenLoc) {
3126     return getSema().BuildCXXNamedCast(
3127         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3128         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3129   }
3130 
3131   /// Build a new C++ functional-style cast expression.
3132   ///
3133   /// By default, performs semantic analysis to build the new expression.
3134   /// Subclasses may override this routine to provide different behavior.
RebuildCXXFunctionalCastExpr(TypeSourceInfo * TInfo,SourceLocation LParenLoc,Expr * Sub,SourceLocation RParenLoc,bool ListInitialization)3135   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3136                                           SourceLocation LParenLoc,
3137                                           Expr *Sub,
3138                                           SourceLocation RParenLoc,
3139                                           bool ListInitialization) {
3140     // If Sub is a ParenListExpr, then Sub is the syntatic form of a
3141     // CXXParenListInitExpr. Pass its expanded arguments so that the
3142     // CXXParenListInitExpr can be rebuilt.
3143     if (auto *PLE = dyn_cast<ParenListExpr>(Sub))
3144       return getSema().BuildCXXTypeConstructExpr(
3145           TInfo, LParenLoc, MultiExprArg(PLE->getExprs(), PLE->getNumExprs()),
3146           RParenLoc, ListInitialization);
3147     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3148                                                MultiExprArg(&Sub, 1), RParenLoc,
3149                                                ListInitialization);
3150   }
3151 
3152   /// Build a new C++ __builtin_bit_cast expression.
3153   ///
3154   /// By default, performs semantic analysis to build the new expression.
3155   /// Subclasses may override this routine to provide different behavior.
RebuildBuiltinBitCastExpr(SourceLocation KWLoc,TypeSourceInfo * TSI,Expr * Sub,SourceLocation RParenLoc)3156   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3157                                        TypeSourceInfo *TSI, Expr *Sub,
3158                                        SourceLocation RParenLoc) {
3159     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3160   }
3161 
3162   /// Build a new C++ typeid(type) expression.
3163   ///
3164   /// By default, performs semantic analysis to build the new expression.
3165   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)3166   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3167                                         SourceLocation TypeidLoc,
3168                                         TypeSourceInfo *Operand,
3169                                         SourceLocation RParenLoc) {
3170     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3171                                     RParenLoc);
3172   }
3173 
3174 
3175   /// Build a new C++ typeid(expr) expression.
3176   ///
3177   /// By default, performs semantic analysis to build the new expression.
3178   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)3179   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3180                                         SourceLocation TypeidLoc,
3181                                         Expr *Operand,
3182                                         SourceLocation RParenLoc) {
3183     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3184                                     RParenLoc);
3185   }
3186 
3187   /// Build a new C++ __uuidof(type) expression.
3188   ///
3189   /// By default, performs semantic analysis to build the new expression.
3190   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType Type,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)3191   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3192                                   TypeSourceInfo *Operand,
3193                                   SourceLocation RParenLoc) {
3194     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3195   }
3196 
3197   /// Build a new C++ __uuidof(expr) expression.
3198   ///
3199   /// By default, performs semantic analysis to build the new expression.
3200   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType Type,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)3201   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3202                                   Expr *Operand, SourceLocation RParenLoc) {
3203     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3204   }
3205 
3206   /// Build a new C++ "this" expression.
3207   ///
3208   /// By default, builds a new "this" expression without performing any
3209   /// semantic analysis. Subclasses may override this routine to provide
3210   /// different behavior.
RebuildCXXThisExpr(SourceLocation ThisLoc,QualType ThisType,bool isImplicit)3211   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3212                                 QualType ThisType,
3213                                 bool isImplicit) {
3214     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3215   }
3216 
3217   /// Build a new C++ throw expression.
3218   ///
3219   /// By default, performs semantic analysis to build the new expression.
3220   /// Subclasses may override this routine to provide different behavior.
RebuildCXXThrowExpr(SourceLocation ThrowLoc,Expr * Sub,bool IsThrownVariableInScope)3221   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3222                                  bool IsThrownVariableInScope) {
3223     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3224   }
3225 
3226   /// Build a new C++ default-argument expression.
3227   ///
3228   /// By default, builds a new default-argument expression, which does not
3229   /// require any semantic analysis. Subclasses may override this routine to
3230   /// provide different behavior.
RebuildCXXDefaultArgExpr(SourceLocation Loc,ParmVarDecl * Param,Expr * RewrittenExpr)3231   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param,
3232                                       Expr *RewrittenExpr) {
3233     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3234                                      RewrittenExpr, getSema().CurContext);
3235   }
3236 
3237   /// Build a new C++11 default-initialization expression.
3238   ///
3239   /// By default, builds a new default field initialization expression, which
3240   /// does not require any semantic analysis. Subclasses may override this
3241   /// routine to provide different behavior.
RebuildCXXDefaultInitExpr(SourceLocation Loc,FieldDecl * Field)3242   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3243                                        FieldDecl *Field) {
3244     return getSema().BuildCXXDefaultInitExpr(Loc, Field);
3245   }
3246 
3247   /// Build a new C++ zero-initialization expression.
3248   ///
3249   /// By default, performs semantic analysis to build the new expression.
3250   /// Subclasses may override this routine to provide different behavior.
RebuildCXXScalarValueInitExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,SourceLocation RParenLoc)3251   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3252                                            SourceLocation LParenLoc,
3253                                            SourceLocation RParenLoc) {
3254     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, std::nullopt,
3255                                                RParenLoc,
3256                                                /*ListInitialization=*/false);
3257   }
3258 
3259   /// Build a new C++ "new" expression.
3260   ///
3261   /// By default, performs semantic analysis to build the new expression.
3262   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNewExpr(SourceLocation StartLoc,bool UseGlobal,SourceLocation PlacementLParen,MultiExprArg PlacementArgs,SourceLocation PlacementRParen,SourceRange TypeIdParens,QualType AllocatedType,TypeSourceInfo * AllocatedTypeInfo,std::optional<Expr * > ArraySize,SourceRange DirectInitRange,Expr * Initializer)3263   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal,
3264                                SourceLocation PlacementLParen,
3265                                MultiExprArg PlacementArgs,
3266                                SourceLocation PlacementRParen,
3267                                SourceRange TypeIdParens, QualType AllocatedType,
3268                                TypeSourceInfo *AllocatedTypeInfo,
3269                                std::optional<Expr *> ArraySize,
3270                                SourceRange DirectInitRange, Expr *Initializer) {
3271     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3272                                  PlacementLParen,
3273                                  PlacementArgs,
3274                                  PlacementRParen,
3275                                  TypeIdParens,
3276                                  AllocatedType,
3277                                  AllocatedTypeInfo,
3278                                  ArraySize,
3279                                  DirectInitRange,
3280                                  Initializer);
3281   }
3282 
3283   /// Build a new C++ "delete" expression.
3284   ///
3285   /// By default, performs semantic analysis to build the new expression.
3286   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDeleteExpr(SourceLocation StartLoc,bool IsGlobalDelete,bool IsArrayForm,Expr * Operand)3287   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3288                                         bool IsGlobalDelete,
3289                                         bool IsArrayForm,
3290                                         Expr *Operand) {
3291     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3292                                     Operand);
3293   }
3294 
3295   /// Build a new type trait expression.
3296   ///
3297   /// By default, performs semantic analysis to build the new expression.
3298   /// Subclasses may override this routine to provide different behavior.
RebuildTypeTrait(TypeTrait Trait,SourceLocation StartLoc,ArrayRef<TypeSourceInfo * > Args,SourceLocation RParenLoc)3299   ExprResult RebuildTypeTrait(TypeTrait Trait,
3300                               SourceLocation StartLoc,
3301                               ArrayRef<TypeSourceInfo *> Args,
3302                               SourceLocation RParenLoc) {
3303     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3304   }
3305 
3306   /// Build a new array type trait expression.
3307   ///
3308   /// By default, performs semantic analysis to build the new expression.
3309   /// Subclasses may override this routine to provide different behavior.
RebuildArrayTypeTrait(ArrayTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * TSInfo,Expr * DimExpr,SourceLocation RParenLoc)3310   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3311                                    SourceLocation StartLoc,
3312                                    TypeSourceInfo *TSInfo,
3313                                    Expr *DimExpr,
3314                                    SourceLocation RParenLoc) {
3315     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3316   }
3317 
3318   /// Build a new expression trait expression.
3319   ///
3320   /// By default, performs semantic analysis to build the new expression.
3321   /// Subclasses may override this routine to provide different behavior.
RebuildExpressionTrait(ExpressionTrait Trait,SourceLocation StartLoc,Expr * Queried,SourceLocation RParenLoc)3322   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3323                                    SourceLocation StartLoc,
3324                                    Expr *Queried,
3325                                    SourceLocation RParenLoc) {
3326     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3327   }
3328 
3329   /// Build a new (previously unresolved) declaration reference
3330   /// expression.
3331   ///
3332   /// By default, performs semantic analysis to build the new expression.
3333   /// Subclasses may override this routine to provide different behavior.
RebuildDependentScopeDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * TemplateArgs,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)3334   ExprResult RebuildDependentScopeDeclRefExpr(
3335                                           NestedNameSpecifierLoc QualifierLoc,
3336                                           SourceLocation TemplateKWLoc,
3337                                        const DeclarationNameInfo &NameInfo,
3338                               const TemplateArgumentListInfo *TemplateArgs,
3339                                           bool IsAddressOfOperand,
3340                                           TypeSourceInfo **RecoveryTSI) {
3341     CXXScopeSpec SS;
3342     SS.Adopt(QualifierLoc);
3343 
3344     if (TemplateArgs || TemplateKWLoc.isValid())
3345       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3346                                                     TemplateArgs);
3347 
3348     return getSema().BuildQualifiedDeclarationNameExpr(
3349         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3350   }
3351 
3352   /// Build a new template-id expression.
3353   ///
3354   /// By default, performs semantic analysis to build the new expression.
3355   /// Subclasses may override this routine to provide different behavior.
RebuildTemplateIdExpr(const CXXScopeSpec & SS,SourceLocation TemplateKWLoc,LookupResult & R,bool RequiresADL,const TemplateArgumentListInfo * TemplateArgs)3356   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3357                                    SourceLocation TemplateKWLoc,
3358                                    LookupResult &R,
3359                                    bool RequiresADL,
3360                               const TemplateArgumentListInfo *TemplateArgs) {
3361     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3362                                          TemplateArgs);
3363   }
3364 
3365   /// Build a new object-construction expression.
3366   ///
3367   /// By default, performs semantic analysis to build the new expression.
3368   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstructExpr(QualType T,SourceLocation Loc,CXXConstructorDecl * Constructor,bool IsElidable,MultiExprArg Args,bool HadMultipleCandidates,bool ListInitialization,bool StdInitListInitialization,bool RequiresZeroInit,CXXConstructExpr::ConstructionKind ConstructKind,SourceRange ParenRange)3369   ExprResult RebuildCXXConstructExpr(QualType T,
3370                                      SourceLocation Loc,
3371                                      CXXConstructorDecl *Constructor,
3372                                      bool IsElidable,
3373                                      MultiExprArg Args,
3374                                      bool HadMultipleCandidates,
3375                                      bool ListInitialization,
3376                                      bool StdInitListInitialization,
3377                                      bool RequiresZeroInit,
3378                              CXXConstructExpr::ConstructionKind ConstructKind,
3379                                      SourceRange ParenRange) {
3380     // Reconstruct the constructor we originally found, which might be
3381     // different if this is a call to an inherited constructor.
3382     CXXConstructorDecl *FoundCtor = Constructor;
3383     if (Constructor->isInheritingConstructor())
3384       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3385 
3386     SmallVector<Expr *, 8> ConvertedArgs;
3387     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3388                                           ConvertedArgs))
3389       return ExprError();
3390 
3391     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3392                                            IsElidable,
3393                                            ConvertedArgs,
3394                                            HadMultipleCandidates,
3395                                            ListInitialization,
3396                                            StdInitListInitialization,
3397                                            RequiresZeroInit, ConstructKind,
3398                                            ParenRange);
3399   }
3400 
3401   /// Build a new implicit construction via inherited constructor
3402   /// expression.
RebuildCXXInheritedCtorInitExpr(QualType T,SourceLocation Loc,CXXConstructorDecl * Constructor,bool ConstructsVBase,bool InheritedFromVBase)3403   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3404                                              CXXConstructorDecl *Constructor,
3405                                              bool ConstructsVBase,
3406                                              bool InheritedFromVBase) {
3407     return new (getSema().Context) CXXInheritedCtorInitExpr(
3408         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3409   }
3410 
3411   /// Build a new object-construction expression.
3412   ///
3413   /// By default, performs semantic analysis to build the new expression.
3414   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTemporaryObjectExpr(TypeSourceInfo * TSInfo,SourceLocation LParenOrBraceLoc,MultiExprArg Args,SourceLocation RParenOrBraceLoc,bool ListInitialization)3415   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3416                                            SourceLocation LParenOrBraceLoc,
3417                                            MultiExprArg Args,
3418                                            SourceLocation RParenOrBraceLoc,
3419                                            bool ListInitialization) {
3420     return getSema().BuildCXXTypeConstructExpr(
3421         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3422   }
3423 
3424   /// Build a new object-construction expression.
3425   ///
3426   /// By default, performs semantic analysis to build the new expression.
3427   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUnresolvedConstructExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc,bool ListInitialization)3428   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3429                                                SourceLocation LParenLoc,
3430                                                MultiExprArg Args,
3431                                                SourceLocation RParenLoc,
3432                                                bool ListInitialization) {
3433     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3434                                                RParenLoc, ListInitialization);
3435   }
3436 
3437   /// Build a new member reference expression.
3438   ///
3439   /// By default, performs semantic analysis to build the new expression.
3440   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDependentScopeMemberExpr(Expr * BaseE,QualType BaseType,bool IsArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,NamedDecl * FirstQualifierInScope,const DeclarationNameInfo & MemberNameInfo,const TemplateArgumentListInfo * TemplateArgs)3441   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3442                                                 QualType BaseType,
3443                                                 bool IsArrow,
3444                                                 SourceLocation OperatorLoc,
3445                                           NestedNameSpecifierLoc QualifierLoc,
3446                                                 SourceLocation TemplateKWLoc,
3447                                             NamedDecl *FirstQualifierInScope,
3448                                    const DeclarationNameInfo &MemberNameInfo,
3449                               const TemplateArgumentListInfo *TemplateArgs) {
3450     CXXScopeSpec SS;
3451     SS.Adopt(QualifierLoc);
3452 
3453     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3454                                             OperatorLoc, IsArrow,
3455                                             SS, TemplateKWLoc,
3456                                             FirstQualifierInScope,
3457                                             MemberNameInfo,
3458                                             TemplateArgs, /*S*/nullptr);
3459   }
3460 
3461   /// Build a new member reference expression.
3462   ///
3463   /// By default, performs semantic analysis to build the new expression.
3464   /// Subclasses may override this routine to provide different behavior.
RebuildUnresolvedMemberExpr(Expr * BaseE,QualType BaseType,SourceLocation OperatorLoc,bool IsArrow,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,NamedDecl * FirstQualifierInScope,LookupResult & R,const TemplateArgumentListInfo * TemplateArgs)3465   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3466                                          SourceLocation OperatorLoc,
3467                                          bool IsArrow,
3468                                          NestedNameSpecifierLoc QualifierLoc,
3469                                          SourceLocation TemplateKWLoc,
3470                                          NamedDecl *FirstQualifierInScope,
3471                                          LookupResult &R,
3472                                 const TemplateArgumentListInfo *TemplateArgs) {
3473     CXXScopeSpec SS;
3474     SS.Adopt(QualifierLoc);
3475 
3476     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3477                                             OperatorLoc, IsArrow,
3478                                             SS, TemplateKWLoc,
3479                                             FirstQualifierInScope,
3480                                             R, TemplateArgs, /*S*/nullptr);
3481   }
3482 
3483   /// Build a new noexcept expression.
3484   ///
3485   /// By default, performs semantic analysis to build the new expression.
3486   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNoexceptExpr(SourceRange Range,Expr * Arg)3487   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3488     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3489   }
3490 
3491   /// Build a new expression to compute the length of a parameter pack.
RebuildSizeOfPackExpr(SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,std::optional<unsigned> Length,ArrayRef<TemplateArgument> PartialArgs)3492   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
3493                                    SourceLocation PackLoc,
3494                                    SourceLocation RParenLoc,
3495                                    std::optional<unsigned> Length,
3496                                    ArrayRef<TemplateArgument> PartialArgs) {
3497     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3498                                   RParenLoc, Length, PartialArgs);
3499   }
3500 
3501   /// Build a new expression representing a call to a source location
3502   ///  builtin.
3503   ///
3504   /// By default, performs semantic analysis to build the new expression.
3505   /// Subclasses may override this routine to provide different behavior.
RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,QualType ResultTy,SourceLocation BuiltinLoc,SourceLocation RPLoc,DeclContext * ParentContext)3506   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3507                                   QualType ResultTy, SourceLocation BuiltinLoc,
3508                                   SourceLocation RPLoc,
3509                                   DeclContext *ParentContext) {
3510     return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
3511                                         ParentContext);
3512   }
3513 
3514   /// Build a new Objective-C boxed expression.
3515   ///
3516   /// By default, performs semantic analysis to build the new expression.
3517   /// Subclasses may override this routine to provide different behavior.
RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,SourceLocation TemplateKWLoc,DeclarationNameInfo ConceptNameInfo,NamedDecl * FoundDecl,ConceptDecl * NamedConcept,TemplateArgumentListInfo * TALI)3518   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3519       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3520       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3521       TemplateArgumentListInfo *TALI) {
3522     CXXScopeSpec SS;
3523     SS.Adopt(NNS);
3524     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3525                                                          ConceptNameInfo,
3526                                                          FoundDecl,
3527                                                          NamedConcept, TALI);
3528     if (Result.isInvalid())
3529       return ExprError();
3530     return Result;
3531   }
3532 
3533   /// \brief Build a new requires expression.
3534   ///
3535   /// By default, performs semantic analysis to build the new expression.
3536   /// Subclasses may override this routine to provide different behavior.
RebuildRequiresExpr(SourceLocation RequiresKWLoc,RequiresExprBodyDecl * Body,ArrayRef<ParmVarDecl * > LocalParameters,ArrayRef<concepts::Requirement * > Requirements,SourceLocation ClosingBraceLoc)3537   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3538                                  RequiresExprBodyDecl *Body,
3539                                  ArrayRef<ParmVarDecl *> LocalParameters,
3540                                  ArrayRef<concepts::Requirement *> Requirements,
3541                                  SourceLocation ClosingBraceLoc) {
3542     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3543                                 LocalParameters, Requirements, ClosingBraceLoc);
3544   }
3545 
3546   concepts::TypeRequirement *
RebuildTypeRequirement(concepts::Requirement::SubstitutionDiagnostic * SubstDiag)3547   RebuildTypeRequirement(
3548       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3549     return SemaRef.BuildTypeRequirement(SubstDiag);
3550   }
3551 
RebuildTypeRequirement(TypeSourceInfo * T)3552   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3553     return SemaRef.BuildTypeRequirement(T);
3554   }
3555 
3556   concepts::ExprRequirement *
RebuildExprRequirement(concepts::Requirement::SubstitutionDiagnostic * SubstDiag,bool IsSimple,SourceLocation NoexceptLoc,concepts::ExprRequirement::ReturnTypeRequirement Ret)3557   RebuildExprRequirement(
3558       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3559       SourceLocation NoexceptLoc,
3560       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3561     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3562                                         std::move(Ret));
3563   }
3564 
3565   concepts::ExprRequirement *
RebuildExprRequirement(Expr * E,bool IsSimple,SourceLocation NoexceptLoc,concepts::ExprRequirement::ReturnTypeRequirement Ret)3566   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3567                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3568     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3569                                         std::move(Ret));
3570   }
3571 
3572   concepts::NestedRequirement *
RebuildNestedRequirement(StringRef InvalidConstraintEntity,const ASTConstraintSatisfaction & Satisfaction)3573   RebuildNestedRequirement(StringRef InvalidConstraintEntity,
3574                            const ASTConstraintSatisfaction &Satisfaction) {
3575     return SemaRef.BuildNestedRequirement(InvalidConstraintEntity,
3576                                           Satisfaction);
3577   }
3578 
RebuildNestedRequirement(Expr * Constraint)3579   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3580     return SemaRef.BuildNestedRequirement(Constraint);
3581   }
3582 
3583   /// \brief Build a new Objective-C boxed expression.
3584   ///
3585   /// By default, performs semantic analysis to build the new expression.
3586   /// Subclasses may override this routine to provide different behavior.
RebuildObjCBoxedExpr(SourceRange SR,Expr * ValueExpr)3587   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3588     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3589   }
3590 
3591   /// Build a new Objective-C array literal.
3592   ///
3593   /// By default, performs semantic analysis to build the new expression.
3594   /// Subclasses may override this routine to provide different behavior.
RebuildObjCArrayLiteral(SourceRange Range,Expr ** Elements,unsigned NumElements)3595   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3596                                      Expr **Elements, unsigned NumElements) {
3597     return getSema().BuildObjCArrayLiteral(Range,
3598                                            MultiExprArg(Elements, NumElements));
3599   }
3600 
RebuildObjCSubscriptRefExpr(SourceLocation RB,Expr * Base,Expr * Key,ObjCMethodDecl * getterMethod,ObjCMethodDecl * setterMethod)3601   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3602                                          Expr *Base, Expr *Key,
3603                                          ObjCMethodDecl *getterMethod,
3604                                          ObjCMethodDecl *setterMethod) {
3605     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3606                                                    getterMethod, setterMethod);
3607   }
3608 
3609   /// Build a new Objective-C dictionary literal.
3610   ///
3611   /// By default, performs semantic analysis to build the new expression.
3612   /// Subclasses may override this routine to provide different behavior.
RebuildObjCDictionaryLiteral(SourceRange Range,MutableArrayRef<ObjCDictionaryElement> Elements)3613   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3614                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3615     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3616   }
3617 
3618   /// Build a new Objective-C \@encode expression.
3619   ///
3620   /// By default, performs semantic analysis to build the new expression.
3621   /// Subclasses may override this routine to provide different behavior.
RebuildObjCEncodeExpr(SourceLocation AtLoc,TypeSourceInfo * EncodeTypeInfo,SourceLocation RParenLoc)3622   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3623                                          TypeSourceInfo *EncodeTypeInfo,
3624                                          SourceLocation RParenLoc) {
3625     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3626   }
3627 
3628   /// Build a new Objective-C class message.
RebuildObjCMessageExpr(TypeSourceInfo * ReceiverTypeInfo,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)3629   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3630                                           Selector Sel,
3631                                           ArrayRef<SourceLocation> SelectorLocs,
3632                                           ObjCMethodDecl *Method,
3633                                           SourceLocation LBracLoc,
3634                                           MultiExprArg Args,
3635                                           SourceLocation RBracLoc) {
3636     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3637                                      ReceiverTypeInfo->getType(),
3638                                      /*SuperLoc=*/SourceLocation(),
3639                                      Sel, Method, LBracLoc, SelectorLocs,
3640                                      RBracLoc, Args);
3641   }
3642 
3643   /// Build a new Objective-C instance message.
RebuildObjCMessageExpr(Expr * Receiver,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)3644   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3645                                           Selector Sel,
3646                                           ArrayRef<SourceLocation> SelectorLocs,
3647                                           ObjCMethodDecl *Method,
3648                                           SourceLocation LBracLoc,
3649                                           MultiExprArg Args,
3650                                           SourceLocation RBracLoc) {
3651     return SemaRef.BuildInstanceMessage(Receiver,
3652                                         Receiver->getType(),
3653                                         /*SuperLoc=*/SourceLocation(),
3654                                         Sel, Method, LBracLoc, SelectorLocs,
3655                                         RBracLoc, Args);
3656   }
3657 
3658   /// Build a new Objective-C instance/class message to 'super'.
RebuildObjCMessageExpr(SourceLocation SuperLoc,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,QualType SuperType,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)3659   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3660                                     Selector Sel,
3661                                     ArrayRef<SourceLocation> SelectorLocs,
3662                                     QualType SuperType,
3663                                     ObjCMethodDecl *Method,
3664                                     SourceLocation LBracLoc,
3665                                     MultiExprArg Args,
3666                                     SourceLocation RBracLoc) {
3667     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3668                                           SuperType,
3669                                           SuperLoc,
3670                                           Sel, Method, LBracLoc, SelectorLocs,
3671                                           RBracLoc, Args)
3672                                       : SemaRef.BuildClassMessage(nullptr,
3673                                           SuperType,
3674                                           SuperLoc,
3675                                           Sel, Method, LBracLoc, SelectorLocs,
3676                                           RBracLoc, Args);
3677 
3678 
3679   }
3680 
3681   /// Build a new Objective-C ivar reference expression.
3682   ///
3683   /// By default, performs semantic analysis to build the new expression.
3684   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIvarRefExpr(Expr * BaseArg,ObjCIvarDecl * Ivar,SourceLocation IvarLoc,bool IsArrow,bool IsFreeIvar)3685   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3686                                           SourceLocation IvarLoc,
3687                                           bool IsArrow, bool IsFreeIvar) {
3688     CXXScopeSpec SS;
3689     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3690     ExprResult Result = getSema().BuildMemberReferenceExpr(
3691         BaseArg, BaseArg->getType(),
3692         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3693         /*FirstQualifierInScope=*/nullptr, NameInfo,
3694         /*TemplateArgs=*/nullptr,
3695         /*S=*/nullptr);
3696     if (IsFreeIvar && Result.isUsable())
3697       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3698     return Result;
3699   }
3700 
3701   /// Build a new Objective-C property reference expression.
3702   ///
3703   /// By default, performs semantic analysis to build the new expression.
3704   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * BaseArg,ObjCPropertyDecl * Property,SourceLocation PropertyLoc)3705   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3706                                         ObjCPropertyDecl *Property,
3707                                         SourceLocation PropertyLoc) {
3708     CXXScopeSpec SS;
3709     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3710     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3711                                               /*FIXME:*/PropertyLoc,
3712                                               /*IsArrow=*/false,
3713                                               SS, SourceLocation(),
3714                                               /*FirstQualifierInScope=*/nullptr,
3715                                               NameInfo,
3716                                               /*TemplateArgs=*/nullptr,
3717                                               /*S=*/nullptr);
3718   }
3719 
3720   /// Build a new Objective-C property reference expression.
3721   ///
3722   /// By default, performs semantic analysis to build the new expression.
3723   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * Base,QualType T,ObjCMethodDecl * Getter,ObjCMethodDecl * Setter,SourceLocation PropertyLoc)3724   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3725                                         ObjCMethodDecl *Getter,
3726                                         ObjCMethodDecl *Setter,
3727                                         SourceLocation PropertyLoc) {
3728     // Since these expressions can only be value-dependent, we do not
3729     // need to perform semantic analysis again.
3730     return Owned(
3731       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3732                                                   VK_LValue, OK_ObjCProperty,
3733                                                   PropertyLoc, Base));
3734   }
3735 
3736   /// Build a new Objective-C "isa" expression.
3737   ///
3738   /// By default, performs semantic analysis to build the new expression.
3739   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIsaExpr(Expr * BaseArg,SourceLocation IsaLoc,SourceLocation OpLoc,bool IsArrow)3740   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3741                                 SourceLocation OpLoc, bool IsArrow) {
3742     CXXScopeSpec SS;
3743     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3744     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3745                                               OpLoc, IsArrow,
3746                                               SS, SourceLocation(),
3747                                               /*FirstQualifierInScope=*/nullptr,
3748                                               NameInfo,
3749                                               /*TemplateArgs=*/nullptr,
3750                                               /*S=*/nullptr);
3751   }
3752 
3753   /// Build a new shuffle vector expression.
3754   ///
3755   /// By default, performs semantic analysis to build the new expression.
3756   /// Subclasses may override this routine to provide different behavior.
RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)3757   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3758                                       MultiExprArg SubExprs,
3759                                       SourceLocation RParenLoc) {
3760     // Find the declaration for __builtin_shufflevector
3761     const IdentifierInfo &Name
3762       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3763     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3764     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3765     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3766 
3767     // Build a reference to the __builtin_shufflevector builtin
3768     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3769     Expr *Callee = new (SemaRef.Context)
3770         DeclRefExpr(SemaRef.Context, Builtin, false,
3771                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3772     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3773     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3774                                        CK_BuiltinFnToFnPtr).get();
3775 
3776     // Build the CallExpr
3777     ExprResult TheCall = CallExpr::Create(
3778         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3779         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3780         FPOptionsOverride());
3781 
3782     // Type-check the __builtin_shufflevector expression.
3783     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3784   }
3785 
3786   /// Build a new convert vector expression.
RebuildConvertVectorExpr(SourceLocation BuiltinLoc,Expr * SrcExpr,TypeSourceInfo * DstTInfo,SourceLocation RParenLoc)3787   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3788                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3789                                       SourceLocation RParenLoc) {
3790     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3791                                          BuiltinLoc, RParenLoc);
3792   }
3793 
3794   /// Build a new template argument pack expansion.
3795   ///
3796   /// By default, performs semantic analysis to build a new pack expansion
3797   /// for a template argument. Subclasses may override this routine to provide
3798   /// different behavior.
3799   TemplateArgumentLoc
RebuildPackExpansion(TemplateArgumentLoc Pattern,SourceLocation EllipsisLoc,std::optional<unsigned> NumExpansions)3800   RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc,
3801                        std::optional<unsigned> NumExpansions) {
3802     switch (Pattern.getArgument().getKind()) {
3803     case TemplateArgument::Expression: {
3804       ExprResult Result
3805         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3806                                        EllipsisLoc, NumExpansions);
3807       if (Result.isInvalid())
3808         return TemplateArgumentLoc();
3809 
3810       return TemplateArgumentLoc(Result.get(), Result.get());
3811     }
3812 
3813     case TemplateArgument::Template:
3814       return TemplateArgumentLoc(
3815           SemaRef.Context,
3816           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3817                            NumExpansions),
3818           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3819           EllipsisLoc);
3820 
3821     case TemplateArgument::Null:
3822     case TemplateArgument::Integral:
3823     case TemplateArgument::Declaration:
3824     case TemplateArgument::Pack:
3825     case TemplateArgument::TemplateExpansion:
3826     case TemplateArgument::NullPtr:
3827       llvm_unreachable("Pack expansion pattern has no parameter packs");
3828 
3829     case TemplateArgument::Type:
3830       if (TypeSourceInfo *Expansion
3831             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3832                                            EllipsisLoc,
3833                                            NumExpansions))
3834         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3835                                    Expansion);
3836       break;
3837     }
3838 
3839     return TemplateArgumentLoc();
3840   }
3841 
3842   /// Build a new expression pack expansion.
3843   ///
3844   /// By default, performs semantic analysis to build a new pack expansion
3845   /// for an expression. Subclasses may override this routine to provide
3846   /// different behavior.
RebuildPackExpansion(Expr * Pattern,SourceLocation EllipsisLoc,std::optional<unsigned> NumExpansions)3847   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3848                                   std::optional<unsigned> NumExpansions) {
3849     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3850   }
3851 
3852   /// Build a new C++1z fold-expression.
3853   ///
3854   /// By default, performs semantic analysis in order to build a new fold
3855   /// expression.
RebuildCXXFoldExpr(UnresolvedLookupExpr * ULE,SourceLocation LParenLoc,Expr * LHS,BinaryOperatorKind Operator,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation RParenLoc,std::optional<unsigned> NumExpansions)3856   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3857                                 SourceLocation LParenLoc, Expr *LHS,
3858                                 BinaryOperatorKind Operator,
3859                                 SourceLocation EllipsisLoc, Expr *RHS,
3860                                 SourceLocation RParenLoc,
3861                                 std::optional<unsigned> NumExpansions) {
3862     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3863                                       EllipsisLoc, RHS, RParenLoc,
3864                                       NumExpansions);
3865   }
3866 
3867   /// Build an empty C++1z fold-expression with the given operator.
3868   ///
3869   /// By default, produces the fallback value for the fold-expression, or
3870   /// produce an error if there is no fallback value.
RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,BinaryOperatorKind Operator)3871   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3872                                      BinaryOperatorKind Operator) {
3873     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3874   }
3875 
3876   /// Build a new atomic operation expression.
3877   ///
3878   /// By default, performs semantic analysis to build the new expression.
3879   /// Subclasses may override this routine to provide different behavior.
RebuildAtomicExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,AtomicExpr::AtomicOp Op,SourceLocation RParenLoc)3880   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3881                                AtomicExpr::AtomicOp Op,
3882                                SourceLocation RParenLoc) {
3883     // Use this for all of the locations, since we don't know the difference
3884     // between the call and the expr at this point.
3885     SourceRange Range{BuiltinLoc, RParenLoc};
3886     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3887                                      Sema::AtomicArgumentOrder::AST);
3888   }
3889 
RebuildRecoveryExpr(SourceLocation BeginLoc,SourceLocation EndLoc,ArrayRef<Expr * > SubExprs,QualType Type)3890   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3891                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3892     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3893   }
3894 
3895 private:
3896   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3897                                      QualType ObjectType,
3898                                      NamedDecl *FirstQualifierInScope,
3899                                      CXXScopeSpec &SS);
3900 
3901   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3902                                              QualType ObjectType,
3903                                              NamedDecl *FirstQualifierInScope,
3904                                              CXXScopeSpec &SS);
3905 
3906   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3907                                             NamedDecl *FirstQualifierInScope,
3908                                             CXXScopeSpec &SS);
3909 
3910   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3911                                       DependentNameTypeLoc TL,
3912                                       bool DeducibleTSTContext);
3913 };
3914 
3915 template <typename Derived>
TransformStmt(Stmt * S,StmtDiscardKind SDK)3916 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3917   if (!S)
3918     return S;
3919 
3920   switch (S->getStmtClass()) {
3921   case Stmt::NoStmtClass: break;
3922 
3923   // Transform individual statement nodes
3924   // Pass SDK into statements that can produce a value
3925 #define STMT(Node, Parent)                                              \
3926   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3927 #define VALUESTMT(Node, Parent)                                         \
3928   case Stmt::Node##Class:                                               \
3929     return getDerived().Transform##Node(cast<Node>(S), SDK);
3930 #define ABSTRACT_STMT(Node)
3931 #define EXPR(Node, Parent)
3932 #include "clang/AST/StmtNodes.inc"
3933 
3934   // Transform expressions by calling TransformExpr.
3935 #define STMT(Node, Parent)
3936 #define ABSTRACT_STMT(Stmt)
3937 #define EXPR(Node, Parent) case Stmt::Node##Class:
3938 #include "clang/AST/StmtNodes.inc"
3939     {
3940       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3941 
3942       if (SDK == SDK_StmtExprResult)
3943         E = getSema().ActOnStmtExprResult(E);
3944       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3945     }
3946   }
3947 
3948   return S;
3949 }
3950 
3951 template<typename Derived>
TransformOMPClause(OMPClause * S)3952 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3953   if (!S)
3954     return S;
3955 
3956   switch (S->getClauseKind()) {
3957   default: break;
3958   // Transform individual clause nodes
3959 #define GEN_CLANG_CLAUSE_CLASS
3960 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3961   case Enum:                                                                   \
3962     return getDerived().Transform##Class(cast<Class>(S));
3963 #include "llvm/Frontend/OpenMP/OMP.inc"
3964   }
3965 
3966   return S;
3967 }
3968 
3969 
3970 template<typename Derived>
TransformExpr(Expr * E)3971 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3972   if (!E)
3973     return E;
3974 
3975   switch (E->getStmtClass()) {
3976     case Stmt::NoStmtClass: break;
3977 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3978 #define ABSTRACT_STMT(Stmt)
3979 #define EXPR(Node, Parent)                                              \
3980     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3981 #include "clang/AST/StmtNodes.inc"
3982   }
3983 
3984   return E;
3985 }
3986 
3987 template<typename Derived>
TransformInitializer(Expr * Init,bool NotCopyInit)3988 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3989                                                         bool NotCopyInit) {
3990   // Initializers are instantiated like expressions, except that various outer
3991   // layers are stripped.
3992   if (!Init)
3993     return Init;
3994 
3995   if (auto *FE = dyn_cast<FullExpr>(Init))
3996     Init = FE->getSubExpr();
3997 
3998   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
3999     OpaqueValueExpr *OVE = AIL->getCommonExpr();
4000     Init = OVE->getSourceExpr();
4001   }
4002 
4003   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
4004     Init = MTE->getSubExpr();
4005 
4006   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
4007     Init = Binder->getSubExpr();
4008 
4009   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
4010     Init = ICE->getSubExprAsWritten();
4011 
4012   if (CXXStdInitializerListExpr *ILE =
4013           dyn_cast<CXXStdInitializerListExpr>(Init))
4014     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
4015 
4016   // If this is copy-initialization, we only need to reconstruct
4017   // InitListExprs. Other forms of copy-initialization will be a no-op if
4018   // the initializer is already the right type.
4019   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
4020   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
4021     return getDerived().TransformExpr(Init);
4022 
4023   // Revert value-initialization back to empty parens.
4024   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
4025     SourceRange Parens = VIE->getSourceRange();
4026     return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt,
4027                                              Parens.getEnd());
4028   }
4029 
4030   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
4031   if (isa<ImplicitValueInitExpr>(Init))
4032     return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt,
4033                                              SourceLocation());
4034 
4035   // Revert initialization by constructor back to a parenthesized or braced list
4036   // of expressions. Any other form of initializer can just be reused directly.
4037   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
4038     return getDerived().TransformExpr(Init);
4039 
4040   // If the initialization implicitly converted an initializer list to a
4041   // std::initializer_list object, unwrap the std::initializer_list too.
4042   if (Construct && Construct->isStdInitListInitialization())
4043     return TransformInitializer(Construct->getArg(0), NotCopyInit);
4044 
4045   // Enter a list-init context if this was list initialization.
4046   EnterExpressionEvaluationContext Context(
4047       getSema(), EnterExpressionEvaluationContext::InitList,
4048       Construct->isListInitialization());
4049 
4050   SmallVector<Expr*, 8> NewArgs;
4051   bool ArgChanged = false;
4052   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
4053                                   /*IsCall*/true, NewArgs, &ArgChanged))
4054     return ExprError();
4055 
4056   // If this was list initialization, revert to syntactic list form.
4057   if (Construct->isListInitialization())
4058     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
4059                                         Construct->getEndLoc());
4060 
4061   // Build a ParenListExpr to represent anything else.
4062   SourceRange Parens = Construct->getParenOrBraceRange();
4063   if (Parens.isInvalid()) {
4064     // This was a variable declaration's initialization for which no initializer
4065     // was specified.
4066     assert(NewArgs.empty() &&
4067            "no parens or braces but have direct init with arguments?");
4068     return ExprEmpty();
4069   }
4070   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
4071                                            Parens.getEnd());
4072 }
4073 
4074 template<typename Derived>
TransformExprs(Expr * const * Inputs,unsigned NumInputs,bool IsCall,SmallVectorImpl<Expr * > & Outputs,bool * ArgChanged)4075 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
4076                                             unsigned NumInputs,
4077                                             bool IsCall,
4078                                       SmallVectorImpl<Expr *> &Outputs,
4079                                             bool *ArgChanged) {
4080   for (unsigned I = 0; I != NumInputs; ++I) {
4081     // If requested, drop call arguments that need to be dropped.
4082     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
4083       if (ArgChanged)
4084         *ArgChanged = true;
4085 
4086       break;
4087     }
4088 
4089     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
4090       Expr *Pattern = Expansion->getPattern();
4091 
4092       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4093       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4094       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4095 
4096       // Determine whether the set of unexpanded parameter packs can and should
4097       // be expanded.
4098       bool Expand = true;
4099       bool RetainExpansion = false;
4100       std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
4101       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4102       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
4103                                                Pattern->getSourceRange(),
4104                                                Unexpanded,
4105                                                Expand, RetainExpansion,
4106                                                NumExpansions))
4107         return true;
4108 
4109       if (!Expand) {
4110         // The transform has determined that we should perform a simple
4111         // transformation on the pack expansion, producing another pack
4112         // expansion.
4113         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4114         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4115         if (OutPattern.isInvalid())
4116           return true;
4117 
4118         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
4119                                                 Expansion->getEllipsisLoc(),
4120                                                            NumExpansions);
4121         if (Out.isInvalid())
4122           return true;
4123 
4124         if (ArgChanged)
4125           *ArgChanged = true;
4126         Outputs.push_back(Out.get());
4127         continue;
4128       }
4129 
4130       // Record right away that the argument was changed.  This needs
4131       // to happen even if the array expands to nothing.
4132       if (ArgChanged) *ArgChanged = true;
4133 
4134       // The transform has determined that we should perform an elementwise
4135       // expansion of the pattern. Do so.
4136       for (unsigned I = 0; I != *NumExpansions; ++I) {
4137         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4138         ExprResult Out = getDerived().TransformExpr(Pattern);
4139         if (Out.isInvalid())
4140           return true;
4141 
4142         if (Out.get()->containsUnexpandedParameterPack()) {
4143           Out = getDerived().RebuildPackExpansion(
4144               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4145           if (Out.isInvalid())
4146             return true;
4147         }
4148 
4149         Outputs.push_back(Out.get());
4150       }
4151 
4152       // If we're supposed to retain a pack expansion, do so by temporarily
4153       // forgetting the partially-substituted parameter pack.
4154       if (RetainExpansion) {
4155         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4156 
4157         ExprResult Out = getDerived().TransformExpr(Pattern);
4158         if (Out.isInvalid())
4159           return true;
4160 
4161         Out = getDerived().RebuildPackExpansion(
4162             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4163         if (Out.isInvalid())
4164           return true;
4165 
4166         Outputs.push_back(Out.get());
4167       }
4168 
4169       continue;
4170     }
4171 
4172     ExprResult Result =
4173       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4174              : getDerived().TransformExpr(Inputs[I]);
4175     if (Result.isInvalid())
4176       return true;
4177 
4178     if (Result.get() != Inputs[I] && ArgChanged)
4179       *ArgChanged = true;
4180 
4181     Outputs.push_back(Result.get());
4182   }
4183 
4184   return false;
4185 }
4186 
4187 template <typename Derived>
TransformCondition(SourceLocation Loc,VarDecl * Var,Expr * Expr,Sema::ConditionKind Kind)4188 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4189     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4190   if (Var) {
4191     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4192         getDerived().TransformDefinition(Var->getLocation(), Var));
4193 
4194     if (!ConditionVar)
4195       return Sema::ConditionError();
4196 
4197     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4198   }
4199 
4200   if (Expr) {
4201     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4202 
4203     if (CondExpr.isInvalid())
4204       return Sema::ConditionError();
4205 
4206     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4207                                     /*MissingOK=*/true);
4208   }
4209 
4210   return Sema::ConditionResult();
4211 }
4212 
4213 template <typename Derived>
TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,QualType ObjectType,NamedDecl * FirstQualifierInScope)4214 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4215     NestedNameSpecifierLoc NNS, QualType ObjectType,
4216     NamedDecl *FirstQualifierInScope) {
4217   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4218 
4219   auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) {
4220     for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4221          Qualifier = Qualifier.getPrefix())
4222       Qualifiers.push_back(Qualifier);
4223   };
4224   insertNNS(NNS);
4225 
4226   CXXScopeSpec SS;
4227   while (!Qualifiers.empty()) {
4228     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4229     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4230 
4231     switch (QNNS->getKind()) {
4232     case NestedNameSpecifier::Identifier: {
4233       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4234                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4235                                       ObjectType);
4236       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4237                                               SS, FirstQualifierInScope, false))
4238         return NestedNameSpecifierLoc();
4239       break;
4240     }
4241 
4242     case NestedNameSpecifier::Namespace: {
4243       NamespaceDecl *NS =
4244           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4245               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4246       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4247       break;
4248     }
4249 
4250     case NestedNameSpecifier::NamespaceAlias: {
4251       NamespaceAliasDecl *Alias =
4252           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4253               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4254       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4255                 Q.getLocalEndLoc());
4256       break;
4257     }
4258 
4259     case NestedNameSpecifier::Global:
4260       // There is no meaningful transformation that one could perform on the
4261       // global scope.
4262       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4263       break;
4264 
4265     case NestedNameSpecifier::Super: {
4266       CXXRecordDecl *RD =
4267           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4268               SourceLocation(), QNNS->getAsRecordDecl()));
4269       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4270       break;
4271     }
4272 
4273     case NestedNameSpecifier::TypeSpecWithTemplate:
4274     case NestedNameSpecifier::TypeSpec: {
4275       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4276                                               FirstQualifierInScope, SS);
4277 
4278       if (!TL)
4279         return NestedNameSpecifierLoc();
4280 
4281       QualType T = TL.getType();
4282       if (T->isDependentType() || T->isRecordType() ||
4283           (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) {
4284         if (T->isEnumeralType())
4285           SemaRef.Diag(TL.getBeginLoc(),
4286                        diag::warn_cxx98_compat_enum_nested_name_spec);
4287 
4288         if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) {
4289           SS.Adopt(ETL.getQualifierLoc());
4290           TL = ETL.getNamedTypeLoc();
4291         }
4292         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4293                   Q.getLocalEndLoc());
4294         break;
4295       }
4296       // If the nested-name-specifier is an invalid type def, don't emit an
4297       // error because a previous error should have already been emitted.
4298       TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>();
4299       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4300         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4301             << T << SS.getRange();
4302       }
4303       return NestedNameSpecifierLoc();
4304     }
4305     }
4306 
4307     // The qualifier-in-scope and object type only apply to the leftmost entity.
4308     FirstQualifierInScope = nullptr;
4309     ObjectType = QualType();
4310   }
4311 
4312   // Don't rebuild the nested-name-specifier if we don't have to.
4313   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4314       !getDerived().AlwaysRebuild())
4315     return NNS;
4316 
4317   // If we can re-use the source-location data from the original
4318   // nested-name-specifier, do so.
4319   if (SS.location_size() == NNS.getDataLength() &&
4320       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4321     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4322 
4323   // Allocate new nested-name-specifier location information.
4324   return SS.getWithLocInContext(SemaRef.Context);
4325 }
4326 
4327 template<typename Derived>
4328 DeclarationNameInfo
4329 TreeTransform<Derived>
TransformDeclarationNameInfo(const DeclarationNameInfo & NameInfo)4330 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4331   DeclarationName Name = NameInfo.getName();
4332   if (!Name)
4333     return DeclarationNameInfo();
4334 
4335   switch (Name.getNameKind()) {
4336   case DeclarationName::Identifier:
4337   case DeclarationName::ObjCZeroArgSelector:
4338   case DeclarationName::ObjCOneArgSelector:
4339   case DeclarationName::ObjCMultiArgSelector:
4340   case DeclarationName::CXXOperatorName:
4341   case DeclarationName::CXXLiteralOperatorName:
4342   case DeclarationName::CXXUsingDirective:
4343     return NameInfo;
4344 
4345   case DeclarationName::CXXDeductionGuideName: {
4346     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4347     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4348         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4349     if (!NewTemplate)
4350       return DeclarationNameInfo();
4351 
4352     DeclarationNameInfo NewNameInfo(NameInfo);
4353     NewNameInfo.setName(
4354         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4355     return NewNameInfo;
4356   }
4357 
4358   case DeclarationName::CXXConstructorName:
4359   case DeclarationName::CXXDestructorName:
4360   case DeclarationName::CXXConversionFunctionName: {
4361     TypeSourceInfo *NewTInfo;
4362     CanQualType NewCanTy;
4363     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4364       NewTInfo = getDerived().TransformType(OldTInfo);
4365       if (!NewTInfo)
4366         return DeclarationNameInfo();
4367       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4368     }
4369     else {
4370       NewTInfo = nullptr;
4371       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4372       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4373       if (NewT.isNull())
4374         return DeclarationNameInfo();
4375       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4376     }
4377 
4378     DeclarationName NewName
4379       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4380                                                            NewCanTy);
4381     DeclarationNameInfo NewNameInfo(NameInfo);
4382     NewNameInfo.setName(NewName);
4383     NewNameInfo.setNamedTypeInfo(NewTInfo);
4384     return NewNameInfo;
4385   }
4386   }
4387 
4388   llvm_unreachable("Unknown name kind.");
4389 }
4390 
4391 template<typename Derived>
4392 TemplateName
TransformTemplateName(CXXScopeSpec & SS,TemplateName Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope,bool AllowInjectedClassName)4393 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4394                                               TemplateName Name,
4395                                               SourceLocation NameLoc,
4396                                               QualType ObjectType,
4397                                               NamedDecl *FirstQualifierInScope,
4398                                               bool AllowInjectedClassName) {
4399   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4400     TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4401     assert(Template && "qualified template name must refer to a template");
4402 
4403     TemplateDecl *TransTemplate
4404       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4405                                                               Template));
4406     if (!TransTemplate)
4407       return TemplateName();
4408 
4409     if (!getDerived().AlwaysRebuild() &&
4410         SS.getScopeRep() == QTN->getQualifier() &&
4411         TransTemplate == Template)
4412       return Name;
4413 
4414     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4415                                             TransTemplate);
4416   }
4417 
4418   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4419     if (SS.getScopeRep()) {
4420       // These apply to the scope specifier, not the template.
4421       ObjectType = QualType();
4422       FirstQualifierInScope = nullptr;
4423     }
4424 
4425     if (!getDerived().AlwaysRebuild() &&
4426         SS.getScopeRep() == DTN->getQualifier() &&
4427         ObjectType.isNull())
4428       return Name;
4429 
4430     // FIXME: Preserve the location of the "template" keyword.
4431     SourceLocation TemplateKWLoc = NameLoc;
4432 
4433     if (DTN->isIdentifier()) {
4434       return getDerived().RebuildTemplateName(SS,
4435                                               TemplateKWLoc,
4436                                               *DTN->getIdentifier(),
4437                                               NameLoc,
4438                                               ObjectType,
4439                                               FirstQualifierInScope,
4440                                               AllowInjectedClassName);
4441     }
4442 
4443     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4444                                             DTN->getOperator(), NameLoc,
4445                                             ObjectType, AllowInjectedClassName);
4446   }
4447 
4448   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4449     TemplateDecl *TransTemplate
4450       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4451                                                               Template));
4452     if (!TransTemplate)
4453       return TemplateName();
4454 
4455     if (!getDerived().AlwaysRebuild() &&
4456         TransTemplate == Template)
4457       return Name;
4458 
4459     return TemplateName(TransTemplate);
4460   }
4461 
4462   if (SubstTemplateTemplateParmPackStorage *SubstPack
4463       = Name.getAsSubstTemplateTemplateParmPack()) {
4464     return getDerived().RebuildTemplateName(
4465         SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4466         SubstPack->getIndex(), SubstPack->getFinal());
4467   }
4468 
4469   // These should be getting filtered out before they reach the AST.
4470   llvm_unreachable("overloaded function decl survived to here");
4471 }
4472 
4473 template<typename Derived>
InventTemplateArgumentLoc(const TemplateArgument & Arg,TemplateArgumentLoc & Output)4474 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4475                                          const TemplateArgument &Arg,
4476                                          TemplateArgumentLoc &Output) {
4477   Output = getSema().getTrivialTemplateArgumentLoc(
4478       Arg, QualType(), getDerived().getBaseLocation());
4479 }
4480 
4481 template <typename Derived>
TransformTemplateArgument(const TemplateArgumentLoc & Input,TemplateArgumentLoc & Output,bool Uneval)4482 bool TreeTransform<Derived>::TransformTemplateArgument(
4483     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4484     bool Uneval) {
4485   const TemplateArgument &Arg = Input.getArgument();
4486   switch (Arg.getKind()) {
4487   case TemplateArgument::Null:
4488   case TemplateArgument::Pack:
4489     llvm_unreachable("Unexpected TemplateArgument");
4490 
4491   case TemplateArgument::Integral:
4492   case TemplateArgument::NullPtr:
4493   case TemplateArgument::Declaration: {
4494     // Transform a resolved template argument straight to a resolved template
4495     // argument. We get here when substituting into an already-substituted
4496     // template type argument during concept satisfaction checking.
4497     QualType T = Arg.getNonTypeTemplateArgumentType();
4498     QualType NewT = getDerived().TransformType(T);
4499     if (NewT.isNull())
4500       return true;
4501 
4502     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4503                        ? Arg.getAsDecl()
4504                        : nullptr;
4505     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4506                               getDerived().getBaseLocation(), D))
4507                         : nullptr;
4508     if (D && !NewD)
4509       return true;
4510 
4511     if (NewT == T && D == NewD)
4512       Output = Input;
4513     else if (Arg.getKind() == TemplateArgument::Integral)
4514       Output = TemplateArgumentLoc(
4515           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4516           TemplateArgumentLocInfo());
4517     else if (Arg.getKind() == TemplateArgument::NullPtr)
4518       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4519                                    TemplateArgumentLocInfo());
4520     else
4521       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4522                                    TemplateArgumentLocInfo());
4523 
4524     return false;
4525   }
4526 
4527   case TemplateArgument::Type: {
4528     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4529     if (!DI)
4530       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4531 
4532     DI = getDerived().TransformType(DI);
4533     if (!DI)
4534       return true;
4535 
4536     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4537     return false;
4538   }
4539 
4540   case TemplateArgument::Template: {
4541     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4542     if (QualifierLoc) {
4543       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4544       if (!QualifierLoc)
4545         return true;
4546     }
4547 
4548     CXXScopeSpec SS;
4549     SS.Adopt(QualifierLoc);
4550     TemplateName Template = getDerived().TransformTemplateName(
4551         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4552     if (Template.isNull())
4553       return true;
4554 
4555     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4556                                  QualifierLoc, Input.getTemplateNameLoc());
4557     return false;
4558   }
4559 
4560   case TemplateArgument::TemplateExpansion:
4561     llvm_unreachable("Caller should expand pack expansions");
4562 
4563   case TemplateArgument::Expression: {
4564     // Template argument expressions are constant expressions.
4565     EnterExpressionEvaluationContext Unevaluated(
4566         getSema(),
4567         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4568                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4569         Sema::ReuseLambdaContextDecl, /*ExprContext=*/
4570         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4571 
4572     Expr *InputExpr = Input.getSourceExpression();
4573     if (!InputExpr)
4574       InputExpr = Input.getArgument().getAsExpr();
4575 
4576     ExprResult E = getDerived().TransformExpr(InputExpr);
4577     E = SemaRef.ActOnConstantExpression(E);
4578     if (E.isInvalid())
4579       return true;
4580     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4581     return false;
4582   }
4583   }
4584 
4585   // Work around bogus GCC warning
4586   return true;
4587 }
4588 
4589 /// Iterator adaptor that invents template argument location information
4590 /// for each of the template arguments in its underlying iterator.
4591 template<typename Derived, typename InputIterator>
4592 class TemplateArgumentLocInventIterator {
4593   TreeTransform<Derived> &Self;
4594   InputIterator Iter;
4595 
4596 public:
4597   typedef TemplateArgumentLoc value_type;
4598   typedef TemplateArgumentLoc reference;
4599   typedef typename std::iterator_traits<InputIterator>::difference_type
4600     difference_type;
4601   typedef std::input_iterator_tag iterator_category;
4602 
4603   class pointer {
4604     TemplateArgumentLoc Arg;
4605 
4606   public:
pointer(TemplateArgumentLoc Arg)4607     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4608 
4609     const TemplateArgumentLoc *operator->() const { return &Arg; }
4610   };
4611 
TemplateArgumentLocInventIterator()4612   TemplateArgumentLocInventIterator() { }
4613 
TemplateArgumentLocInventIterator(TreeTransform<Derived> & Self,InputIterator Iter)4614   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4615                                              InputIterator Iter)
4616     : Self(Self), Iter(Iter) { }
4617 
4618   TemplateArgumentLocInventIterator &operator++() {
4619     ++Iter;
4620     return *this;
4621   }
4622 
4623   TemplateArgumentLocInventIterator operator++(int) {
4624     TemplateArgumentLocInventIterator Old(*this);
4625     ++(*this);
4626     return Old;
4627   }
4628 
4629   reference operator*() const {
4630     TemplateArgumentLoc Result;
4631     Self.InventTemplateArgumentLoc(*Iter, Result);
4632     return Result;
4633   }
4634 
4635   pointer operator->() const { return pointer(**this); }
4636 
4637   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4638                          const TemplateArgumentLocInventIterator &Y) {
4639     return X.Iter == Y.Iter;
4640   }
4641 
4642   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4643                          const TemplateArgumentLocInventIterator &Y) {
4644     return X.Iter != Y.Iter;
4645   }
4646 };
4647 
4648 template<typename Derived>
4649 template<typename InputIterator>
TransformTemplateArguments(InputIterator First,InputIterator Last,TemplateArgumentListInfo & Outputs,bool Uneval)4650 bool TreeTransform<Derived>::TransformTemplateArguments(
4651     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4652     bool Uneval) {
4653   for (; First != Last; ++First) {
4654     TemplateArgumentLoc Out;
4655     TemplateArgumentLoc In = *First;
4656 
4657     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4658       // Unpack argument packs, which we translate them into separate
4659       // arguments.
4660       // FIXME: We could do much better if we could guarantee that the
4661       // TemplateArgumentLocInfo for the pack expansion would be usable for
4662       // all of the template arguments in the argument pack.
4663       typedef TemplateArgumentLocInventIterator<Derived,
4664                                                 TemplateArgument::pack_iterator>
4665         PackLocIterator;
4666       if (TransformTemplateArguments(PackLocIterator(*this,
4667                                                  In.getArgument().pack_begin()),
4668                                      PackLocIterator(*this,
4669                                                    In.getArgument().pack_end()),
4670                                      Outputs, Uneval))
4671         return true;
4672 
4673       continue;
4674     }
4675 
4676     if (In.getArgument().isPackExpansion()) {
4677       // We have a pack expansion, for which we will be substituting into
4678       // the pattern.
4679       SourceLocation Ellipsis;
4680       std::optional<unsigned> OrigNumExpansions;
4681       TemplateArgumentLoc Pattern
4682         = getSema().getTemplateArgumentPackExpansionPattern(
4683               In, Ellipsis, OrigNumExpansions);
4684 
4685       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4686       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4687       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4688 
4689       // Determine whether the set of unexpanded parameter packs can and should
4690       // be expanded.
4691       bool Expand = true;
4692       bool RetainExpansion = false;
4693       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4694       if (getDerived().TryExpandParameterPacks(Ellipsis,
4695                                                Pattern.getSourceRange(),
4696                                                Unexpanded,
4697                                                Expand,
4698                                                RetainExpansion,
4699                                                NumExpansions))
4700         return true;
4701 
4702       if (!Expand) {
4703         // The transform has determined that we should perform a simple
4704         // transformation on the pack expansion, producing another pack
4705         // expansion.
4706         TemplateArgumentLoc OutPattern;
4707         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4708         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4709           return true;
4710 
4711         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4712                                                 NumExpansions);
4713         if (Out.getArgument().isNull())
4714           return true;
4715 
4716         Outputs.addArgument(Out);
4717         continue;
4718       }
4719 
4720       // The transform has determined that we should perform an elementwise
4721       // expansion of the pattern. Do so.
4722       for (unsigned I = 0; I != *NumExpansions; ++I) {
4723         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4724 
4725         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4726           return true;
4727 
4728         if (Out.getArgument().containsUnexpandedParameterPack()) {
4729           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4730                                                   OrigNumExpansions);
4731           if (Out.getArgument().isNull())
4732             return true;
4733         }
4734 
4735         Outputs.addArgument(Out);
4736       }
4737 
4738       // If we're supposed to retain a pack expansion, do so by temporarily
4739       // forgetting the partially-substituted parameter pack.
4740       if (RetainExpansion) {
4741         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4742 
4743         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4744           return true;
4745 
4746         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4747                                                 OrigNumExpansions);
4748         if (Out.getArgument().isNull())
4749           return true;
4750 
4751         Outputs.addArgument(Out);
4752       }
4753 
4754       continue;
4755     }
4756 
4757     // The simple case:
4758     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4759       return true;
4760 
4761     Outputs.addArgument(Out);
4762   }
4763 
4764   return false;
4765 
4766 }
4767 
4768 //===----------------------------------------------------------------------===//
4769 // Type transformation
4770 //===----------------------------------------------------------------------===//
4771 
4772 template<typename Derived>
TransformType(QualType T)4773 QualType TreeTransform<Derived>::TransformType(QualType T) {
4774   if (getDerived().AlreadyTransformed(T))
4775     return T;
4776 
4777   // Temporary workaround.  All of these transformations should
4778   // eventually turn into transformations on TypeLocs.
4779   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4780                                                 getDerived().getBaseLocation());
4781 
4782   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4783 
4784   if (!NewDI)
4785     return QualType();
4786 
4787   return NewDI->getType();
4788 }
4789 
4790 template<typename Derived>
TransformType(TypeSourceInfo * DI)4791 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4792   // Refine the base location to the type's location.
4793   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4794                        getDerived().getBaseEntity());
4795   if (getDerived().AlreadyTransformed(DI->getType()))
4796     return DI;
4797 
4798   TypeLocBuilder TLB;
4799 
4800   TypeLoc TL = DI->getTypeLoc();
4801   TLB.reserve(TL.getFullDataSize());
4802 
4803   QualType Result = getDerived().TransformType(TLB, TL);
4804   if (Result.isNull())
4805     return nullptr;
4806 
4807   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4808 }
4809 
4810 template<typename Derived>
4811 QualType
TransformType(TypeLocBuilder & TLB,TypeLoc T)4812 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4813   switch (T.getTypeLocClass()) {
4814 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4815 #define TYPELOC(CLASS, PARENT)                                                 \
4816   case TypeLoc::CLASS:                                                         \
4817     return getDerived().Transform##CLASS##Type(TLB,                            \
4818                                                T.castAs<CLASS##TypeLoc>());
4819 #include "clang/AST/TypeLocNodes.def"
4820   }
4821 
4822   llvm_unreachable("unhandled type loc!");
4823 }
4824 
4825 template<typename Derived>
TransformTypeWithDeducedTST(QualType T)4826 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4827   if (!isa<DependentNameType>(T))
4828     return TransformType(T);
4829 
4830   if (getDerived().AlreadyTransformed(T))
4831     return T;
4832   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4833                                                 getDerived().getBaseLocation());
4834   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4835   return NewDI ? NewDI->getType() : QualType();
4836 }
4837 
4838 template<typename Derived>
4839 TypeSourceInfo *
TransformTypeWithDeducedTST(TypeSourceInfo * DI)4840 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4841   if (!isa<DependentNameType>(DI->getType()))
4842     return TransformType(DI);
4843 
4844   // Refine the base location to the type's location.
4845   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4846                        getDerived().getBaseEntity());
4847   if (getDerived().AlreadyTransformed(DI->getType()))
4848     return DI;
4849 
4850   TypeLocBuilder TLB;
4851 
4852   TypeLoc TL = DI->getTypeLoc();
4853   TLB.reserve(TL.getFullDataSize());
4854 
4855   auto QTL = TL.getAs<QualifiedTypeLoc>();
4856   if (QTL)
4857     TL = QTL.getUnqualifiedLoc();
4858 
4859   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4860 
4861   QualType Result = getDerived().TransformDependentNameType(
4862       TLB, DNTL, /*DeducedTSTContext*/true);
4863   if (Result.isNull())
4864     return nullptr;
4865 
4866   if (QTL) {
4867     Result = getDerived().RebuildQualifiedType(Result, QTL);
4868     if (Result.isNull())
4869       return nullptr;
4870     TLB.TypeWasModifiedSafely(Result);
4871   }
4872 
4873   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4874 }
4875 
4876 template<typename Derived>
4877 QualType
TransformQualifiedType(TypeLocBuilder & TLB,QualifiedTypeLoc T)4878 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4879                                                QualifiedTypeLoc T) {
4880   QualType Result;
4881   TypeLoc UnqualTL = T.getUnqualifiedLoc();
4882   auto SuppressObjCLifetime =
4883       T.getType().getLocalQualifiers().hasObjCLifetime();
4884   if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) {
4885     Result = getDerived().TransformTemplateTypeParmType(TLB, TTP,
4886                                                         SuppressObjCLifetime);
4887   } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) {
4888     Result = getDerived().TransformSubstTemplateTypeParmPackType(
4889         TLB, STTP, SuppressObjCLifetime);
4890   } else {
4891     Result = getDerived().TransformType(TLB, UnqualTL);
4892   }
4893 
4894   if (Result.isNull())
4895     return QualType();
4896 
4897   Result = getDerived().RebuildQualifiedType(Result, T);
4898 
4899   if (Result.isNull())
4900     return QualType();
4901 
4902   // RebuildQualifiedType might have updated the type, but not in a way
4903   // that invalidates the TypeLoc. (There's no location information for
4904   // qualifiers.)
4905   TLB.TypeWasModifiedSafely(Result);
4906 
4907   return Result;
4908 }
4909 
4910 template <typename Derived>
RebuildQualifiedType(QualType T,QualifiedTypeLoc TL)4911 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4912                                                       QualifiedTypeLoc TL) {
4913 
4914   SourceLocation Loc = TL.getBeginLoc();
4915   Qualifiers Quals = TL.getType().getLocalQualifiers();
4916 
4917   if ((T.getAddressSpace() != LangAS::Default &&
4918        Quals.getAddressSpace() != LangAS::Default) &&
4919       T.getAddressSpace() != Quals.getAddressSpace()) {
4920     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4921         << TL.getType() << T;
4922     return QualType();
4923   }
4924 
4925   // C++ [dcl.fct]p7:
4926   //   [When] adding cv-qualifications on top of the function type [...] the
4927   //   cv-qualifiers are ignored.
4928   if (T->isFunctionType()) {
4929     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4930                                                      Quals.getAddressSpace());
4931     return T;
4932   }
4933 
4934   // C++ [dcl.ref]p1:
4935   //   when the cv-qualifiers are introduced through the use of a typedef-name
4936   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4937   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4938   // applied to a reference type.
4939   if (T->isReferenceType()) {
4940     // The only qualifier that applies to a reference type is restrict.
4941     if (!Quals.hasRestrict())
4942       return T;
4943     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4944   }
4945 
4946   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4947   // resulting type.
4948   if (Quals.hasObjCLifetime()) {
4949     if (!T->isObjCLifetimeType() && !T->isDependentType())
4950       Quals.removeObjCLifetime();
4951     else if (T.getObjCLifetime()) {
4952       // Objective-C ARC:
4953       //   A lifetime qualifier applied to a substituted template parameter
4954       //   overrides the lifetime qualifier from the template argument.
4955       const AutoType *AutoTy;
4956       if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4957         // 'auto' types behave the same way as template parameters.
4958         QualType Deduced = AutoTy->getDeducedType();
4959         Qualifiers Qs = Deduced.getQualifiers();
4960         Qs.removeObjCLifetime();
4961         Deduced =
4962             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4963         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4964                                         AutoTy->isDependentType(),
4965                                         /*isPack=*/false,
4966                                         AutoTy->getTypeConstraintConcept(),
4967                                         AutoTy->getTypeConstraintArguments());
4968       } else {
4969         // Otherwise, complain about the addition of a qualifier to an
4970         // already-qualified type.
4971         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4972         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4973         Quals.removeObjCLifetime();
4974       }
4975     }
4976   }
4977 
4978   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4979 }
4980 
4981 template<typename Derived>
4982 TypeLoc
TransformTypeInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4983 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4984                                                    QualType ObjectType,
4985                                                    NamedDecl *UnqualLookup,
4986                                                    CXXScopeSpec &SS) {
4987   if (getDerived().AlreadyTransformed(TL.getType()))
4988     return TL;
4989 
4990   TypeSourceInfo *TSI =
4991       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4992   if (TSI)
4993     return TSI->getTypeLoc();
4994   return TypeLoc();
4995 }
4996 
4997 template<typename Derived>
4998 TypeSourceInfo *
TransformTypeInObjectScope(TypeSourceInfo * TSInfo,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4999 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
5000                                                    QualType ObjectType,
5001                                                    NamedDecl *UnqualLookup,
5002                                                    CXXScopeSpec &SS) {
5003   if (getDerived().AlreadyTransformed(TSInfo->getType()))
5004     return TSInfo;
5005 
5006   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
5007                                    UnqualLookup, SS);
5008 }
5009 
5010 template <typename Derived>
TransformTSIInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)5011 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
5012     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
5013     CXXScopeSpec &SS) {
5014   QualType T = TL.getType();
5015   assert(!getDerived().AlreadyTransformed(T));
5016 
5017   TypeLocBuilder TLB;
5018   QualType Result;
5019 
5020   if (isa<TemplateSpecializationType>(T)) {
5021     TemplateSpecializationTypeLoc SpecTL =
5022         TL.castAs<TemplateSpecializationTypeLoc>();
5023 
5024     TemplateName Template = getDerived().TransformTemplateName(
5025         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
5026         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
5027     if (Template.isNull())
5028       return nullptr;
5029 
5030     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
5031                                                               Template);
5032   } else if (isa<DependentTemplateSpecializationType>(T)) {
5033     DependentTemplateSpecializationTypeLoc SpecTL =
5034         TL.castAs<DependentTemplateSpecializationTypeLoc>();
5035 
5036     TemplateName Template
5037       = getDerived().RebuildTemplateName(SS,
5038                                          SpecTL.getTemplateKeywordLoc(),
5039                                          *SpecTL.getTypePtr()->getIdentifier(),
5040                                          SpecTL.getTemplateNameLoc(),
5041                                          ObjectType, UnqualLookup,
5042                                          /*AllowInjectedClassName*/true);
5043     if (Template.isNull())
5044       return nullptr;
5045 
5046     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
5047                                                                        SpecTL,
5048                                                                        Template,
5049                                                                        SS);
5050   } else {
5051     // Nothing special needs to be done for these.
5052     Result = getDerived().TransformType(TLB, TL);
5053   }
5054 
5055   if (Result.isNull())
5056     return nullptr;
5057 
5058   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
5059 }
5060 
5061 template <class TyLoc> static inline
TransformTypeSpecType(TypeLocBuilder & TLB,TyLoc T)5062 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
5063   TyLoc NewT = TLB.push<TyLoc>(T.getType());
5064   NewT.setNameLoc(T.getNameLoc());
5065   return T.getType();
5066 }
5067 
5068 template<typename Derived>
TransformBuiltinType(TypeLocBuilder & TLB,BuiltinTypeLoc T)5069 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
5070                                                       BuiltinTypeLoc T) {
5071   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
5072   NewT.setBuiltinLoc(T.getBuiltinLoc());
5073   if (T.needsExtraLocalData())
5074     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
5075   return T.getType();
5076 }
5077 
5078 template<typename Derived>
TransformComplexType(TypeLocBuilder & TLB,ComplexTypeLoc T)5079 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
5080                                                       ComplexTypeLoc T) {
5081   // FIXME: recurse?
5082   return TransformTypeSpecType(TLB, T);
5083 }
5084 
5085 template <typename Derived>
TransformAdjustedType(TypeLocBuilder & TLB,AdjustedTypeLoc TL)5086 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
5087                                                        AdjustedTypeLoc TL) {
5088   // Adjustments applied during transformation are handled elsewhere.
5089   return getDerived().TransformType(TLB, TL.getOriginalLoc());
5090 }
5091 
5092 template<typename Derived>
TransformDecayedType(TypeLocBuilder & TLB,DecayedTypeLoc TL)5093 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
5094                                                       DecayedTypeLoc TL) {
5095   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
5096   if (OriginalType.isNull())
5097     return QualType();
5098 
5099   QualType Result = TL.getType();
5100   if (getDerived().AlwaysRebuild() ||
5101       OriginalType != TL.getOriginalLoc().getType())
5102     Result = SemaRef.Context.getDecayedType(OriginalType);
5103   TLB.push<DecayedTypeLoc>(Result);
5104   // Nothing to set for DecayedTypeLoc.
5105   return Result;
5106 }
5107 
5108 template<typename Derived>
TransformPointerType(TypeLocBuilder & TLB,PointerTypeLoc TL)5109 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
5110                                                       PointerTypeLoc TL) {
5111   QualType PointeeType
5112     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5113   if (PointeeType.isNull())
5114     return QualType();
5115 
5116   QualType Result = TL.getType();
5117   if (PointeeType->getAs<ObjCObjectType>()) {
5118     // A dependent pointer type 'T *' has is being transformed such
5119     // that an Objective-C class type is being replaced for 'T'. The
5120     // resulting pointer type is an ObjCObjectPointerType, not a
5121     // PointerType.
5122     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5123 
5124     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5125     NewT.setStarLoc(TL.getStarLoc());
5126     return Result;
5127   }
5128 
5129   if (getDerived().AlwaysRebuild() ||
5130       PointeeType != TL.getPointeeLoc().getType()) {
5131     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5132     if (Result.isNull())
5133       return QualType();
5134   }
5135 
5136   // Objective-C ARC can add lifetime qualifiers to the type that we're
5137   // pointing to.
5138   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5139 
5140   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5141   NewT.setSigilLoc(TL.getSigilLoc());
5142   return Result;
5143 }
5144 
5145 template<typename Derived>
5146 QualType
TransformBlockPointerType(TypeLocBuilder & TLB,BlockPointerTypeLoc TL)5147 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5148                                                   BlockPointerTypeLoc TL) {
5149   QualType PointeeType
5150     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5151   if (PointeeType.isNull())
5152     return QualType();
5153 
5154   QualType Result = TL.getType();
5155   if (getDerived().AlwaysRebuild() ||
5156       PointeeType != TL.getPointeeLoc().getType()) {
5157     Result = getDerived().RebuildBlockPointerType(PointeeType,
5158                                                   TL.getSigilLoc());
5159     if (Result.isNull())
5160       return QualType();
5161   }
5162 
5163   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5164   NewT.setSigilLoc(TL.getSigilLoc());
5165   return Result;
5166 }
5167 
5168 /// Transforms a reference type.  Note that somewhat paradoxically we
5169 /// don't care whether the type itself is an l-value type or an r-value
5170 /// type;  we only care if the type was *written* as an l-value type
5171 /// or an r-value type.
5172 template<typename Derived>
5173 QualType
TransformReferenceType(TypeLocBuilder & TLB,ReferenceTypeLoc TL)5174 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5175                                                ReferenceTypeLoc TL) {
5176   const ReferenceType *T = TL.getTypePtr();
5177 
5178   // Note that this works with the pointee-as-written.
5179   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5180   if (PointeeType.isNull())
5181     return QualType();
5182 
5183   QualType Result = TL.getType();
5184   if (getDerived().AlwaysRebuild() ||
5185       PointeeType != T->getPointeeTypeAsWritten()) {
5186     Result = getDerived().RebuildReferenceType(PointeeType,
5187                                                T->isSpelledAsLValue(),
5188                                                TL.getSigilLoc());
5189     if (Result.isNull())
5190       return QualType();
5191   }
5192 
5193   // Objective-C ARC can add lifetime qualifiers to the type that we're
5194   // referring to.
5195   TLB.TypeWasModifiedSafely(
5196       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5197 
5198   // r-value references can be rebuilt as l-value references.
5199   ReferenceTypeLoc NewTL;
5200   if (isa<LValueReferenceType>(Result))
5201     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5202   else
5203     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5204   NewTL.setSigilLoc(TL.getSigilLoc());
5205 
5206   return Result;
5207 }
5208 
5209 template<typename Derived>
5210 QualType
TransformLValueReferenceType(TypeLocBuilder & TLB,LValueReferenceTypeLoc TL)5211 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5212                                                  LValueReferenceTypeLoc TL) {
5213   return TransformReferenceType(TLB, TL);
5214 }
5215 
5216 template<typename Derived>
5217 QualType
TransformRValueReferenceType(TypeLocBuilder & TLB,RValueReferenceTypeLoc TL)5218 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5219                                                  RValueReferenceTypeLoc TL) {
5220   return TransformReferenceType(TLB, TL);
5221 }
5222 
5223 template<typename Derived>
5224 QualType
TransformMemberPointerType(TypeLocBuilder & TLB,MemberPointerTypeLoc TL)5225 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5226                                                    MemberPointerTypeLoc TL) {
5227   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5228   if (PointeeType.isNull())
5229     return QualType();
5230 
5231   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5232   TypeSourceInfo *NewClsTInfo = nullptr;
5233   if (OldClsTInfo) {
5234     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5235     if (!NewClsTInfo)
5236       return QualType();
5237   }
5238 
5239   const MemberPointerType *T = TL.getTypePtr();
5240   QualType OldClsType = QualType(T->getClass(), 0);
5241   QualType NewClsType;
5242   if (NewClsTInfo)
5243     NewClsType = NewClsTInfo->getType();
5244   else {
5245     NewClsType = getDerived().TransformType(OldClsType);
5246     if (NewClsType.isNull())
5247       return QualType();
5248   }
5249 
5250   QualType Result = TL.getType();
5251   if (getDerived().AlwaysRebuild() ||
5252       PointeeType != T->getPointeeType() ||
5253       NewClsType != OldClsType) {
5254     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5255                                                    TL.getStarLoc());
5256     if (Result.isNull())
5257       return QualType();
5258   }
5259 
5260   // If we had to adjust the pointee type when building a member pointer, make
5261   // sure to push TypeLoc info for it.
5262   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5263   if (MPT && PointeeType != MPT->getPointeeType()) {
5264     assert(isa<AdjustedType>(MPT->getPointeeType()));
5265     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5266   }
5267 
5268   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5269   NewTL.setSigilLoc(TL.getSigilLoc());
5270   NewTL.setClassTInfo(NewClsTInfo);
5271 
5272   return Result;
5273 }
5274 
5275 template<typename Derived>
5276 QualType
TransformConstantArrayType(TypeLocBuilder & TLB,ConstantArrayTypeLoc TL)5277 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5278                                                    ConstantArrayTypeLoc TL) {
5279   const ConstantArrayType *T = TL.getTypePtr();
5280   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5281   if (ElementType.isNull())
5282     return QualType();
5283 
5284   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5285   Expr *OldSize = TL.getSizeExpr();
5286   if (!OldSize)
5287     OldSize = const_cast<Expr*>(T->getSizeExpr());
5288   Expr *NewSize = nullptr;
5289   if (OldSize) {
5290     EnterExpressionEvaluationContext Unevaluated(
5291         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5292     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5293     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5294   }
5295 
5296   QualType Result = TL.getType();
5297   if (getDerived().AlwaysRebuild() ||
5298       ElementType != T->getElementType() ||
5299       (T->getSizeExpr() && NewSize != OldSize)) {
5300     Result = getDerived().RebuildConstantArrayType(ElementType,
5301                                                    T->getSizeModifier(),
5302                                                    T->getSize(), NewSize,
5303                                              T->getIndexTypeCVRQualifiers(),
5304                                                    TL.getBracketsRange());
5305     if (Result.isNull())
5306       return QualType();
5307   }
5308 
5309   // We might have either a ConstantArrayType or a VariableArrayType now:
5310   // a ConstantArrayType is allowed to have an element type which is a
5311   // VariableArrayType if the type is dependent.  Fortunately, all array
5312   // types have the same location layout.
5313   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5314   NewTL.setLBracketLoc(TL.getLBracketLoc());
5315   NewTL.setRBracketLoc(TL.getRBracketLoc());
5316   NewTL.setSizeExpr(NewSize);
5317 
5318   return Result;
5319 }
5320 
5321 template<typename Derived>
TransformIncompleteArrayType(TypeLocBuilder & TLB,IncompleteArrayTypeLoc TL)5322 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5323                                               TypeLocBuilder &TLB,
5324                                               IncompleteArrayTypeLoc TL) {
5325   const IncompleteArrayType *T = TL.getTypePtr();
5326   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5327   if (ElementType.isNull())
5328     return QualType();
5329 
5330   QualType Result = TL.getType();
5331   if (getDerived().AlwaysRebuild() ||
5332       ElementType != T->getElementType()) {
5333     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5334                                                      T->getSizeModifier(),
5335                                            T->getIndexTypeCVRQualifiers(),
5336                                                      TL.getBracketsRange());
5337     if (Result.isNull())
5338       return QualType();
5339   }
5340 
5341   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5342   NewTL.setLBracketLoc(TL.getLBracketLoc());
5343   NewTL.setRBracketLoc(TL.getRBracketLoc());
5344   NewTL.setSizeExpr(nullptr);
5345 
5346   return Result;
5347 }
5348 
5349 template<typename Derived>
5350 QualType
TransformVariableArrayType(TypeLocBuilder & TLB,VariableArrayTypeLoc TL)5351 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5352                                                    VariableArrayTypeLoc TL) {
5353   const VariableArrayType *T = TL.getTypePtr();
5354   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5355   if (ElementType.isNull())
5356     return QualType();
5357 
5358   ExprResult SizeResult;
5359   {
5360     EnterExpressionEvaluationContext Context(
5361         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5362     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5363   }
5364   if (SizeResult.isInvalid())
5365     return QualType();
5366   SizeResult =
5367       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5368   if (SizeResult.isInvalid())
5369     return QualType();
5370 
5371   Expr *Size = SizeResult.get();
5372 
5373   QualType Result = TL.getType();
5374   if (getDerived().AlwaysRebuild() ||
5375       ElementType != T->getElementType() ||
5376       Size != T->getSizeExpr()) {
5377     Result = getDerived().RebuildVariableArrayType(ElementType,
5378                                                    T->getSizeModifier(),
5379                                                    Size,
5380                                              T->getIndexTypeCVRQualifiers(),
5381                                                    TL.getBracketsRange());
5382     if (Result.isNull())
5383       return QualType();
5384   }
5385 
5386   // We might have constant size array now, but fortunately it has the same
5387   // location layout.
5388   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5389   NewTL.setLBracketLoc(TL.getLBracketLoc());
5390   NewTL.setRBracketLoc(TL.getRBracketLoc());
5391   NewTL.setSizeExpr(Size);
5392 
5393   return Result;
5394 }
5395 
5396 template<typename Derived>
5397 QualType
TransformDependentSizedArrayType(TypeLocBuilder & TLB,DependentSizedArrayTypeLoc TL)5398 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5399                                              DependentSizedArrayTypeLoc TL) {
5400   const DependentSizedArrayType *T = TL.getTypePtr();
5401   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5402   if (ElementType.isNull())
5403     return QualType();
5404 
5405   // Array bounds are constant expressions.
5406   EnterExpressionEvaluationContext Unevaluated(
5407       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5408 
5409   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5410   Expr *origSize = TL.getSizeExpr();
5411   if (!origSize) origSize = T->getSizeExpr();
5412 
5413   ExprResult sizeResult
5414     = getDerived().TransformExpr(origSize);
5415   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5416   if (sizeResult.isInvalid())
5417     return QualType();
5418 
5419   Expr *size = sizeResult.get();
5420 
5421   QualType Result = TL.getType();
5422   if (getDerived().AlwaysRebuild() ||
5423       ElementType != T->getElementType() ||
5424       size != origSize) {
5425     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5426                                                          T->getSizeModifier(),
5427                                                          size,
5428                                                 T->getIndexTypeCVRQualifiers(),
5429                                                         TL.getBracketsRange());
5430     if (Result.isNull())
5431       return QualType();
5432   }
5433 
5434   // We might have any sort of array type now, but fortunately they
5435   // all have the same location layout.
5436   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5437   NewTL.setLBracketLoc(TL.getLBracketLoc());
5438   NewTL.setRBracketLoc(TL.getRBracketLoc());
5439   NewTL.setSizeExpr(size);
5440 
5441   return Result;
5442 }
5443 
5444 template <typename Derived>
TransformDependentVectorType(TypeLocBuilder & TLB,DependentVectorTypeLoc TL)5445 QualType TreeTransform<Derived>::TransformDependentVectorType(
5446     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5447   const DependentVectorType *T = TL.getTypePtr();
5448   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5449   if (ElementType.isNull())
5450     return QualType();
5451 
5452   EnterExpressionEvaluationContext Unevaluated(
5453       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5454 
5455   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5456   Size = SemaRef.ActOnConstantExpression(Size);
5457   if (Size.isInvalid())
5458     return QualType();
5459 
5460   QualType Result = TL.getType();
5461   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5462       Size.get() != T->getSizeExpr()) {
5463     Result = getDerived().RebuildDependentVectorType(
5464         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5465     if (Result.isNull())
5466       return QualType();
5467   }
5468 
5469   // Result might be dependent or not.
5470   if (isa<DependentVectorType>(Result)) {
5471     DependentVectorTypeLoc NewTL =
5472         TLB.push<DependentVectorTypeLoc>(Result);
5473     NewTL.setNameLoc(TL.getNameLoc());
5474   } else {
5475     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5476     NewTL.setNameLoc(TL.getNameLoc());
5477   }
5478 
5479   return Result;
5480 }
5481 
5482 template<typename Derived>
TransformDependentSizedExtVectorType(TypeLocBuilder & TLB,DependentSizedExtVectorTypeLoc TL)5483 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5484                                       TypeLocBuilder &TLB,
5485                                       DependentSizedExtVectorTypeLoc TL) {
5486   const DependentSizedExtVectorType *T = TL.getTypePtr();
5487 
5488   // FIXME: ext vector locs should be nested
5489   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5490   if (ElementType.isNull())
5491     return QualType();
5492 
5493   // Vector sizes are constant expressions.
5494   EnterExpressionEvaluationContext Unevaluated(
5495       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5496 
5497   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5498   Size = SemaRef.ActOnConstantExpression(Size);
5499   if (Size.isInvalid())
5500     return QualType();
5501 
5502   QualType Result = TL.getType();
5503   if (getDerived().AlwaysRebuild() ||
5504       ElementType != T->getElementType() ||
5505       Size.get() != T->getSizeExpr()) {
5506     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5507                                                              Size.get(),
5508                                                          T->getAttributeLoc());
5509     if (Result.isNull())
5510       return QualType();
5511   }
5512 
5513   // Result might be dependent or not.
5514   if (isa<DependentSizedExtVectorType>(Result)) {
5515     DependentSizedExtVectorTypeLoc NewTL
5516       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5517     NewTL.setNameLoc(TL.getNameLoc());
5518   } else {
5519     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5520     NewTL.setNameLoc(TL.getNameLoc());
5521   }
5522 
5523   return Result;
5524 }
5525 
5526 template <typename Derived>
5527 QualType
TransformConstantMatrixType(TypeLocBuilder & TLB,ConstantMatrixTypeLoc TL)5528 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5529                                                     ConstantMatrixTypeLoc TL) {
5530   const ConstantMatrixType *T = TL.getTypePtr();
5531   QualType ElementType = getDerived().TransformType(T->getElementType());
5532   if (ElementType.isNull())
5533     return QualType();
5534 
5535   QualType Result = TL.getType();
5536   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5537     Result = getDerived().RebuildConstantMatrixType(
5538         ElementType, T->getNumRows(), T->getNumColumns());
5539     if (Result.isNull())
5540       return QualType();
5541   }
5542 
5543   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5544   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5545   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5546   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5547   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5548 
5549   return Result;
5550 }
5551 
5552 template <typename Derived>
TransformDependentSizedMatrixType(TypeLocBuilder & TLB,DependentSizedMatrixTypeLoc TL)5553 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5554     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5555   const DependentSizedMatrixType *T = TL.getTypePtr();
5556 
5557   QualType ElementType = getDerived().TransformType(T->getElementType());
5558   if (ElementType.isNull()) {
5559     return QualType();
5560   }
5561 
5562   // Matrix dimensions are constant expressions.
5563   EnterExpressionEvaluationContext Unevaluated(
5564       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5565 
5566   Expr *origRows = TL.getAttrRowOperand();
5567   if (!origRows)
5568     origRows = T->getRowExpr();
5569   Expr *origColumns = TL.getAttrColumnOperand();
5570   if (!origColumns)
5571     origColumns = T->getColumnExpr();
5572 
5573   ExprResult rowResult = getDerived().TransformExpr(origRows);
5574   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5575   if (rowResult.isInvalid())
5576     return QualType();
5577 
5578   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5579   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5580   if (columnResult.isInvalid())
5581     return QualType();
5582 
5583   Expr *rows = rowResult.get();
5584   Expr *columns = columnResult.get();
5585 
5586   QualType Result = TL.getType();
5587   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5588       rows != origRows || columns != origColumns) {
5589     Result = getDerived().RebuildDependentSizedMatrixType(
5590         ElementType, rows, columns, T->getAttributeLoc());
5591 
5592     if (Result.isNull())
5593       return QualType();
5594   }
5595 
5596   // We might have any sort of matrix type now, but fortunately they
5597   // all have the same location layout.
5598   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5599   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5600   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5601   NewTL.setAttrRowOperand(rows);
5602   NewTL.setAttrColumnOperand(columns);
5603   return Result;
5604 }
5605 
5606 template <typename Derived>
TransformDependentAddressSpaceType(TypeLocBuilder & TLB,DependentAddressSpaceTypeLoc TL)5607 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5608     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5609   const DependentAddressSpaceType *T = TL.getTypePtr();
5610 
5611   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5612 
5613   if (pointeeType.isNull())
5614     return QualType();
5615 
5616   // Address spaces are constant expressions.
5617   EnterExpressionEvaluationContext Unevaluated(
5618       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5619 
5620   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5621   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5622   if (AddrSpace.isInvalid())
5623     return QualType();
5624 
5625   QualType Result = TL.getType();
5626   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5627       AddrSpace.get() != T->getAddrSpaceExpr()) {
5628     Result = getDerived().RebuildDependentAddressSpaceType(
5629         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5630     if (Result.isNull())
5631       return QualType();
5632   }
5633 
5634   // Result might be dependent or not.
5635   if (isa<DependentAddressSpaceType>(Result)) {
5636     DependentAddressSpaceTypeLoc NewTL =
5637         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5638 
5639     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5640     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5641     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5642 
5643   } else {
5644     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5645         Result, getDerived().getBaseLocation());
5646     TransformType(TLB, DI->getTypeLoc());
5647   }
5648 
5649   return Result;
5650 }
5651 
5652 template <typename Derived>
TransformVectorType(TypeLocBuilder & TLB,VectorTypeLoc TL)5653 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5654                                                      VectorTypeLoc TL) {
5655   const VectorType *T = TL.getTypePtr();
5656   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5657   if (ElementType.isNull())
5658     return QualType();
5659 
5660   QualType Result = TL.getType();
5661   if (getDerived().AlwaysRebuild() ||
5662       ElementType != T->getElementType()) {
5663     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5664                                             T->getVectorKind());
5665     if (Result.isNull())
5666       return QualType();
5667   }
5668 
5669   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5670   NewTL.setNameLoc(TL.getNameLoc());
5671 
5672   return Result;
5673 }
5674 
5675 template<typename Derived>
TransformExtVectorType(TypeLocBuilder & TLB,ExtVectorTypeLoc TL)5676 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5677                                                         ExtVectorTypeLoc TL) {
5678   const VectorType *T = TL.getTypePtr();
5679   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5680   if (ElementType.isNull())
5681     return QualType();
5682 
5683   QualType Result = TL.getType();
5684   if (getDerived().AlwaysRebuild() ||
5685       ElementType != T->getElementType()) {
5686     Result = getDerived().RebuildExtVectorType(ElementType,
5687                                                T->getNumElements(),
5688                                                /*FIXME*/ SourceLocation());
5689     if (Result.isNull())
5690       return QualType();
5691   }
5692 
5693   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5694   NewTL.setNameLoc(TL.getNameLoc());
5695 
5696   return Result;
5697 }
5698 
5699 template <typename Derived>
TransformFunctionTypeParam(ParmVarDecl * OldParm,int indexAdjustment,std::optional<unsigned> NumExpansions,bool ExpectParameterPack)5700 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5701     ParmVarDecl *OldParm, int indexAdjustment,
5702     std::optional<unsigned> NumExpansions, bool ExpectParameterPack) {
5703   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5704   TypeSourceInfo *NewDI = nullptr;
5705 
5706   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5707     // If we're substituting into a pack expansion type and we know the
5708     // length we want to expand to, just substitute for the pattern.
5709     TypeLoc OldTL = OldDI->getTypeLoc();
5710     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5711 
5712     TypeLocBuilder TLB;
5713     TypeLoc NewTL = OldDI->getTypeLoc();
5714     TLB.reserve(NewTL.getFullDataSize());
5715 
5716     QualType Result = getDerived().TransformType(TLB,
5717                                                OldExpansionTL.getPatternLoc());
5718     if (Result.isNull())
5719       return nullptr;
5720 
5721     Result = RebuildPackExpansionType(Result,
5722                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5723                                       OldExpansionTL.getEllipsisLoc(),
5724                                       NumExpansions);
5725     if (Result.isNull())
5726       return nullptr;
5727 
5728     PackExpansionTypeLoc NewExpansionTL
5729       = TLB.push<PackExpansionTypeLoc>(Result);
5730     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5731     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5732   } else
5733     NewDI = getDerived().TransformType(OldDI);
5734   if (!NewDI)
5735     return nullptr;
5736 
5737   if (NewDI == OldDI && indexAdjustment == 0)
5738     return OldParm;
5739 
5740   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5741                                              OldParm->getDeclContext(),
5742                                              OldParm->getInnerLocStart(),
5743                                              OldParm->getLocation(),
5744                                              OldParm->getIdentifier(),
5745                                              NewDI->getType(),
5746                                              NewDI,
5747                                              OldParm->getStorageClass(),
5748                                              /* DefArg */ nullptr);
5749   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5750                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5751   transformedLocalDecl(OldParm, {newParm});
5752   return newParm;
5753 }
5754 
5755 template <typename Derived>
TransformFunctionTypeParams(SourceLocation Loc,ArrayRef<ParmVarDecl * > Params,const QualType * ParamTypes,const FunctionProtoType::ExtParameterInfo * ParamInfos,SmallVectorImpl<QualType> & OutParamTypes,SmallVectorImpl<ParmVarDecl * > * PVars,Sema::ExtParameterInfoBuilder & PInfos,unsigned * LastParamTransformed)5756 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5757     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5758     const QualType *ParamTypes,
5759     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5760     SmallVectorImpl<QualType> &OutParamTypes,
5761     SmallVectorImpl<ParmVarDecl *> *PVars,
5762     Sema::ExtParameterInfoBuilder &PInfos,
5763     unsigned *LastParamTransformed) {
5764   int indexAdjustment = 0;
5765 
5766   unsigned NumParams = Params.size();
5767   for (unsigned i = 0; i != NumParams; ++i) {
5768     if (LastParamTransformed)
5769       *LastParamTransformed = i;
5770     if (ParmVarDecl *OldParm = Params[i]) {
5771       assert(OldParm->getFunctionScopeIndex() == i);
5772 
5773       std::optional<unsigned> NumExpansions;
5774       ParmVarDecl *NewParm = nullptr;
5775       if (OldParm->isParameterPack()) {
5776         // We have a function parameter pack that may need to be expanded.
5777         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5778 
5779         // Find the parameter packs that could be expanded.
5780         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5781         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5782         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5783         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5784 
5785         // Determine whether we should expand the parameter packs.
5786         bool ShouldExpand = false;
5787         bool RetainExpansion = false;
5788         std::optional<unsigned> OrigNumExpansions;
5789         if (Unexpanded.size() > 0) {
5790           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5791           NumExpansions = OrigNumExpansions;
5792           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5793                                                    Pattern.getSourceRange(),
5794                                                    Unexpanded,
5795                                                    ShouldExpand,
5796                                                    RetainExpansion,
5797                                                    NumExpansions)) {
5798             return true;
5799           }
5800         } else {
5801 #ifndef NDEBUG
5802           const AutoType *AT =
5803               Pattern.getType().getTypePtr()->getContainedAutoType();
5804           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5805                  "Could not find parameter packs or undeduced auto type!");
5806 #endif
5807         }
5808 
5809         if (ShouldExpand) {
5810           // Expand the function parameter pack into multiple, separate
5811           // parameters.
5812           getDerived().ExpandingFunctionParameterPack(OldParm);
5813           for (unsigned I = 0; I != *NumExpansions; ++I) {
5814             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5815             ParmVarDecl *NewParm
5816               = getDerived().TransformFunctionTypeParam(OldParm,
5817                                                         indexAdjustment++,
5818                                                         OrigNumExpansions,
5819                                                 /*ExpectParameterPack=*/false);
5820             if (!NewParm)
5821               return true;
5822 
5823             if (ParamInfos)
5824               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5825             OutParamTypes.push_back(NewParm->getType());
5826             if (PVars)
5827               PVars->push_back(NewParm);
5828           }
5829 
5830           // If we're supposed to retain a pack expansion, do so by temporarily
5831           // forgetting the partially-substituted parameter pack.
5832           if (RetainExpansion) {
5833             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5834             ParmVarDecl *NewParm
5835               = getDerived().TransformFunctionTypeParam(OldParm,
5836                                                         indexAdjustment++,
5837                                                         OrigNumExpansions,
5838                                                 /*ExpectParameterPack=*/false);
5839             if (!NewParm)
5840               return true;
5841 
5842             if (ParamInfos)
5843               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5844             OutParamTypes.push_back(NewParm->getType());
5845             if (PVars)
5846               PVars->push_back(NewParm);
5847           }
5848 
5849           // The next parameter should have the same adjustment as the
5850           // last thing we pushed, but we post-incremented indexAdjustment
5851           // on every push.  Also, if we push nothing, the adjustment should
5852           // go down by one.
5853           indexAdjustment--;
5854 
5855           // We're done with the pack expansion.
5856           continue;
5857         }
5858 
5859         // We'll substitute the parameter now without expanding the pack
5860         // expansion.
5861         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5862         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5863                                                           indexAdjustment,
5864                                                           NumExpansions,
5865                                                   /*ExpectParameterPack=*/true);
5866         assert(NewParm->isParameterPack() &&
5867                "Parameter pack no longer a parameter pack after "
5868                "transformation.");
5869       } else {
5870         NewParm = getDerived().TransformFunctionTypeParam(
5871             OldParm, indexAdjustment, std::nullopt,
5872             /*ExpectParameterPack=*/false);
5873       }
5874 
5875       if (!NewParm)
5876         return true;
5877 
5878       if (ParamInfos)
5879         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5880       OutParamTypes.push_back(NewParm->getType());
5881       if (PVars)
5882         PVars->push_back(NewParm);
5883       continue;
5884     }
5885 
5886     // Deal with the possibility that we don't have a parameter
5887     // declaration for this parameter.
5888     assert(ParamTypes);
5889     QualType OldType = ParamTypes[i];
5890     bool IsPackExpansion = false;
5891     std::optional<unsigned> NumExpansions;
5892     QualType NewType;
5893     if (const PackExpansionType *Expansion
5894                                        = dyn_cast<PackExpansionType>(OldType)) {
5895       // We have a function parameter pack that may need to be expanded.
5896       QualType Pattern = Expansion->getPattern();
5897       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5898       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5899 
5900       // Determine whether we should expand the parameter packs.
5901       bool ShouldExpand = false;
5902       bool RetainExpansion = false;
5903       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5904                                                Unexpanded,
5905                                                ShouldExpand,
5906                                                RetainExpansion,
5907                                                NumExpansions)) {
5908         return true;
5909       }
5910 
5911       if (ShouldExpand) {
5912         // Expand the function parameter pack into multiple, separate
5913         // parameters.
5914         for (unsigned I = 0; I != *NumExpansions; ++I) {
5915           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5916           QualType NewType = getDerived().TransformType(Pattern);
5917           if (NewType.isNull())
5918             return true;
5919 
5920           if (NewType->containsUnexpandedParameterPack()) {
5921             NewType = getSema().getASTContext().getPackExpansionType(
5922                 NewType, std::nullopt);
5923 
5924             if (NewType.isNull())
5925               return true;
5926           }
5927 
5928           if (ParamInfos)
5929             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5930           OutParamTypes.push_back(NewType);
5931           if (PVars)
5932             PVars->push_back(nullptr);
5933         }
5934 
5935         // We're done with the pack expansion.
5936         continue;
5937       }
5938 
5939       // If we're supposed to retain a pack expansion, do so by temporarily
5940       // forgetting the partially-substituted parameter pack.
5941       if (RetainExpansion) {
5942         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5943         QualType NewType = getDerived().TransformType(Pattern);
5944         if (NewType.isNull())
5945           return true;
5946 
5947         if (ParamInfos)
5948           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5949         OutParamTypes.push_back(NewType);
5950         if (PVars)
5951           PVars->push_back(nullptr);
5952       }
5953 
5954       // We'll substitute the parameter now without expanding the pack
5955       // expansion.
5956       OldType = Expansion->getPattern();
5957       IsPackExpansion = true;
5958       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5959       NewType = getDerived().TransformType(OldType);
5960     } else {
5961       NewType = getDerived().TransformType(OldType);
5962     }
5963 
5964     if (NewType.isNull())
5965       return true;
5966 
5967     if (IsPackExpansion)
5968       NewType = getSema().Context.getPackExpansionType(NewType,
5969                                                        NumExpansions);
5970 
5971     if (ParamInfos)
5972       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5973     OutParamTypes.push_back(NewType);
5974     if (PVars)
5975       PVars->push_back(nullptr);
5976   }
5977 
5978 #ifndef NDEBUG
5979   if (PVars) {
5980     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5981       if (ParmVarDecl *parm = (*PVars)[i])
5982         assert(parm->getFunctionScopeIndex() == i);
5983   }
5984 #endif
5985 
5986   return false;
5987 }
5988 
5989 template<typename Derived>
5990 QualType
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL)5991 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5992                                                    FunctionProtoTypeLoc TL) {
5993   SmallVector<QualType, 4> ExceptionStorage;
5994   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5995   return getDerived().TransformFunctionProtoType(
5996       TLB, TL, nullptr, Qualifiers(),
5997       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5998         return This->getDerived().TransformExceptionSpec(
5999             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
6000       });
6001 }
6002 
6003 template<typename Derived> template<typename Fn>
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL,CXXRecordDecl * ThisContext,Qualifiers ThisTypeQuals,Fn TransformExceptionSpec)6004 QualType TreeTransform<Derived>::TransformFunctionProtoType(
6005     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
6006     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
6007 
6008   // Transform the parameters and return type.
6009   //
6010   // We are required to instantiate the params and return type in source order.
6011   // When the function has a trailing return type, we instantiate the
6012   // parameters before the return type,  since the return type can then refer
6013   // to the parameters themselves (via decltype, sizeof, etc.).
6014   //
6015   SmallVector<QualType, 4> ParamTypes;
6016   SmallVector<ParmVarDecl*, 4> ParamDecls;
6017   Sema::ExtParameterInfoBuilder ExtParamInfos;
6018   const FunctionProtoType *T = TL.getTypePtr();
6019 
6020   QualType ResultType;
6021 
6022   if (T->hasTrailingReturn()) {
6023     if (getDerived().TransformFunctionTypeParams(
6024             TL.getBeginLoc(), TL.getParams(),
6025             TL.getTypePtr()->param_type_begin(),
6026             T->getExtParameterInfosOrNull(),
6027             ParamTypes, &ParamDecls, ExtParamInfos))
6028       return QualType();
6029 
6030     {
6031       // C++11 [expr.prim.general]p3:
6032       //   If a declaration declares a member function or member function
6033       //   template of a class X, the expression this is a prvalue of type
6034       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
6035       //   and the end of the function-definition, member-declarator, or
6036       //   declarator.
6037       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
6038 
6039       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6040       if (ResultType.isNull())
6041         return QualType();
6042     }
6043   }
6044   else {
6045     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6046     if (ResultType.isNull())
6047       return QualType();
6048 
6049     if (getDerived().TransformFunctionTypeParams(
6050             TL.getBeginLoc(), TL.getParams(),
6051             TL.getTypePtr()->param_type_begin(),
6052             T->getExtParameterInfosOrNull(),
6053             ParamTypes, &ParamDecls, ExtParamInfos))
6054       return QualType();
6055   }
6056 
6057   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
6058 
6059   bool EPIChanged = false;
6060   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
6061     return QualType();
6062 
6063   // Handle extended parameter information.
6064   if (auto NewExtParamInfos =
6065         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
6066     if (!EPI.ExtParameterInfos ||
6067         llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) !=
6068             llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) {
6069       EPIChanged = true;
6070     }
6071     EPI.ExtParameterInfos = NewExtParamInfos;
6072   } else if (EPI.ExtParameterInfos) {
6073     EPIChanged = true;
6074     EPI.ExtParameterInfos = nullptr;
6075   }
6076 
6077   QualType Result = TL.getType();
6078   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
6079       T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) {
6080     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
6081     if (Result.isNull())
6082       return QualType();
6083   }
6084 
6085   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
6086   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6087   NewTL.setLParenLoc(TL.getLParenLoc());
6088   NewTL.setRParenLoc(TL.getRParenLoc());
6089   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
6090   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6091   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
6092     NewTL.setParam(i, ParamDecls[i]);
6093 
6094   return Result;
6095 }
6096 
6097 template<typename Derived>
TransformExceptionSpec(SourceLocation Loc,FunctionProtoType::ExceptionSpecInfo & ESI,SmallVectorImpl<QualType> & Exceptions,bool & Changed)6098 bool TreeTransform<Derived>::TransformExceptionSpec(
6099     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
6100     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
6101   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
6102 
6103   // Instantiate a dynamic noexcept expression, if any.
6104   if (isComputedNoexcept(ESI.Type)) {
6105     EnterExpressionEvaluationContext Unevaluated(
6106         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
6107     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
6108     if (NoexceptExpr.isInvalid())
6109       return true;
6110 
6111     ExceptionSpecificationType EST = ESI.Type;
6112     NoexceptExpr =
6113         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
6114     if (NoexceptExpr.isInvalid())
6115       return true;
6116 
6117     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
6118       Changed = true;
6119     ESI.NoexceptExpr = NoexceptExpr.get();
6120     ESI.Type = EST;
6121   }
6122 
6123   if (ESI.Type != EST_Dynamic)
6124     return false;
6125 
6126   // Instantiate a dynamic exception specification's type.
6127   for (QualType T : ESI.Exceptions) {
6128     if (const PackExpansionType *PackExpansion =
6129             T->getAs<PackExpansionType>()) {
6130       Changed = true;
6131 
6132       // We have a pack expansion. Instantiate it.
6133       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6134       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6135                                               Unexpanded);
6136       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6137 
6138       // Determine whether the set of unexpanded parameter packs can and
6139       // should
6140       // be expanded.
6141       bool Expand = false;
6142       bool RetainExpansion = false;
6143       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6144       // FIXME: Track the location of the ellipsis (and track source location
6145       // information for the types in the exception specification in general).
6146       if (getDerived().TryExpandParameterPacks(
6147               Loc, SourceRange(), Unexpanded, Expand,
6148               RetainExpansion, NumExpansions))
6149         return true;
6150 
6151       if (!Expand) {
6152         // We can't expand this pack expansion into separate arguments yet;
6153         // just substitute into the pattern and create a new pack expansion
6154         // type.
6155         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6156         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6157         if (U.isNull())
6158           return true;
6159 
6160         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6161         Exceptions.push_back(U);
6162         continue;
6163       }
6164 
6165       // Substitute into the pack expansion pattern for each slice of the
6166       // pack.
6167       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6168         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6169 
6170         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6171         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6172           return true;
6173 
6174         Exceptions.push_back(U);
6175       }
6176     } else {
6177       QualType U = getDerived().TransformType(T);
6178       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6179         return true;
6180       if (T != U)
6181         Changed = true;
6182 
6183       Exceptions.push_back(U);
6184     }
6185   }
6186 
6187   ESI.Exceptions = Exceptions;
6188   if (ESI.Exceptions.empty())
6189     ESI.Type = EST_DynamicNone;
6190   return false;
6191 }
6192 
6193 template<typename Derived>
TransformFunctionNoProtoType(TypeLocBuilder & TLB,FunctionNoProtoTypeLoc TL)6194 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6195                                                  TypeLocBuilder &TLB,
6196                                                  FunctionNoProtoTypeLoc TL) {
6197   const FunctionNoProtoType *T = TL.getTypePtr();
6198   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6199   if (ResultType.isNull())
6200     return QualType();
6201 
6202   QualType Result = TL.getType();
6203   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6204     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6205 
6206   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6207   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6208   NewTL.setLParenLoc(TL.getLParenLoc());
6209   NewTL.setRParenLoc(TL.getRParenLoc());
6210   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6211 
6212   return Result;
6213 }
6214 
6215 template <typename Derived>
TransformUnresolvedUsingType(TypeLocBuilder & TLB,UnresolvedUsingTypeLoc TL)6216 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6217     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6218   const UnresolvedUsingType *T = TL.getTypePtr();
6219   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6220   if (!D)
6221     return QualType();
6222 
6223   QualType Result = TL.getType();
6224   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6225     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6226     if (Result.isNull())
6227       return QualType();
6228   }
6229 
6230   // We might get an arbitrary type spec type back.  We should at
6231   // least always get a type spec type, though.
6232   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6233   NewTL.setNameLoc(TL.getNameLoc());
6234 
6235   return Result;
6236 }
6237 
6238 template <typename Derived>
TransformUsingType(TypeLocBuilder & TLB,UsingTypeLoc TL)6239 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6240                                                     UsingTypeLoc TL) {
6241   const UsingType *T = TL.getTypePtr();
6242 
6243   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6244       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6245   if (!Found)
6246     return QualType();
6247 
6248   QualType Underlying = getDerived().TransformType(T->desugar());
6249   if (Underlying.isNull())
6250     return QualType();
6251 
6252   QualType Result = TL.getType();
6253   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6254       Underlying != T->getUnderlyingType()) {
6255     Result = getDerived().RebuildUsingType(Found, Underlying);
6256     if (Result.isNull())
6257       return QualType();
6258   }
6259 
6260   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6261   return Result;
6262 }
6263 
6264 template<typename Derived>
TransformTypedefType(TypeLocBuilder & TLB,TypedefTypeLoc TL)6265 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6266                                                       TypedefTypeLoc TL) {
6267   const TypedefType *T = TL.getTypePtr();
6268   TypedefNameDecl *Typedef
6269     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6270                                                                T->getDecl()));
6271   if (!Typedef)
6272     return QualType();
6273 
6274   QualType Result = TL.getType();
6275   if (getDerived().AlwaysRebuild() ||
6276       Typedef != T->getDecl()) {
6277     Result = getDerived().RebuildTypedefType(Typedef);
6278     if (Result.isNull())
6279       return QualType();
6280   }
6281 
6282   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6283   NewTL.setNameLoc(TL.getNameLoc());
6284 
6285   return Result;
6286 }
6287 
6288 template<typename Derived>
TransformTypeOfExprType(TypeLocBuilder & TLB,TypeOfExprTypeLoc TL)6289 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6290                                                       TypeOfExprTypeLoc TL) {
6291   // typeof expressions are not potentially evaluated contexts
6292   EnterExpressionEvaluationContext Unevaluated(
6293       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6294       Sema::ReuseLambdaContextDecl);
6295 
6296   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6297   if (E.isInvalid())
6298     return QualType();
6299 
6300   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6301   if (E.isInvalid())
6302     return QualType();
6303 
6304   QualType Result = TL.getType();
6305   TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind();
6306   if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) {
6307     Result =
6308         getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind);
6309     if (Result.isNull())
6310       return QualType();
6311   }
6312 
6313   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6314   NewTL.setTypeofLoc(TL.getTypeofLoc());
6315   NewTL.setLParenLoc(TL.getLParenLoc());
6316   NewTL.setRParenLoc(TL.getRParenLoc());
6317 
6318   return Result;
6319 }
6320 
6321 template<typename Derived>
TransformTypeOfType(TypeLocBuilder & TLB,TypeOfTypeLoc TL)6322 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6323                                                      TypeOfTypeLoc TL) {
6324   TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo();
6325   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6326   if (!New_Under_TI)
6327     return QualType();
6328 
6329   QualType Result = TL.getType();
6330   TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind();
6331   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6332     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind);
6333     if (Result.isNull())
6334       return QualType();
6335   }
6336 
6337   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6338   NewTL.setTypeofLoc(TL.getTypeofLoc());
6339   NewTL.setLParenLoc(TL.getLParenLoc());
6340   NewTL.setRParenLoc(TL.getRParenLoc());
6341   NewTL.setUnmodifiedTInfo(New_Under_TI);
6342 
6343   return Result;
6344 }
6345 
6346 template<typename Derived>
TransformDecltypeType(TypeLocBuilder & TLB,DecltypeTypeLoc TL)6347 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6348                                                        DecltypeTypeLoc TL) {
6349   const DecltypeType *T = TL.getTypePtr();
6350 
6351   // decltype expressions are not potentially evaluated contexts
6352   EnterExpressionEvaluationContext Unevaluated(
6353       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6354       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6355 
6356   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6357   if (E.isInvalid())
6358     return QualType();
6359 
6360   E = getSema().ActOnDecltypeExpression(E.get());
6361   if (E.isInvalid())
6362     return QualType();
6363 
6364   QualType Result = TL.getType();
6365   if (getDerived().AlwaysRebuild() ||
6366       E.get() != T->getUnderlyingExpr()) {
6367     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6368     if (Result.isNull())
6369       return QualType();
6370   }
6371   else E.get();
6372 
6373   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6374   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6375   NewTL.setRParenLoc(TL.getRParenLoc());
6376   return Result;
6377 }
6378 
6379 template<typename Derived>
TransformUnaryTransformType(TypeLocBuilder & TLB,UnaryTransformTypeLoc TL)6380 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6381                                                             TypeLocBuilder &TLB,
6382                                                      UnaryTransformTypeLoc TL) {
6383   QualType Result = TL.getType();
6384   if (Result->isDependentType()) {
6385     const UnaryTransformType *T = TL.getTypePtr();
6386     QualType NewBase =
6387       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6388     Result = getDerived().RebuildUnaryTransformType(NewBase,
6389                                                     T->getUTTKind(),
6390                                                     TL.getKWLoc());
6391     if (Result.isNull())
6392       return QualType();
6393   }
6394 
6395   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6396   NewTL.setKWLoc(TL.getKWLoc());
6397   NewTL.setParensRange(TL.getParensRange());
6398   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6399   return Result;
6400 }
6401 
6402 template<typename Derived>
TransformDeducedTemplateSpecializationType(TypeLocBuilder & TLB,DeducedTemplateSpecializationTypeLoc TL)6403 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6404     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6405   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6406 
6407   CXXScopeSpec SS;
6408   TemplateName TemplateName = getDerived().TransformTemplateName(
6409       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6410   if (TemplateName.isNull())
6411     return QualType();
6412 
6413   QualType OldDeduced = T->getDeducedType();
6414   QualType NewDeduced;
6415   if (!OldDeduced.isNull()) {
6416     NewDeduced = getDerived().TransformType(OldDeduced);
6417     if (NewDeduced.isNull())
6418       return QualType();
6419   }
6420 
6421   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6422       TemplateName, NewDeduced);
6423   if (Result.isNull())
6424     return QualType();
6425 
6426   DeducedTemplateSpecializationTypeLoc NewTL =
6427       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6428   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6429 
6430   return Result;
6431 }
6432 
6433 template<typename Derived>
TransformRecordType(TypeLocBuilder & TLB,RecordTypeLoc TL)6434 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6435                                                      RecordTypeLoc TL) {
6436   const RecordType *T = TL.getTypePtr();
6437   RecordDecl *Record
6438     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6439                                                           T->getDecl()));
6440   if (!Record)
6441     return QualType();
6442 
6443   QualType Result = TL.getType();
6444   if (getDerived().AlwaysRebuild() ||
6445       Record != T->getDecl()) {
6446     Result = getDerived().RebuildRecordType(Record);
6447     if (Result.isNull())
6448       return QualType();
6449   }
6450 
6451   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6452   NewTL.setNameLoc(TL.getNameLoc());
6453 
6454   return Result;
6455 }
6456 
6457 template<typename Derived>
TransformEnumType(TypeLocBuilder & TLB,EnumTypeLoc TL)6458 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6459                                                    EnumTypeLoc TL) {
6460   const EnumType *T = TL.getTypePtr();
6461   EnumDecl *Enum
6462     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6463                                                         T->getDecl()));
6464   if (!Enum)
6465     return QualType();
6466 
6467   QualType Result = TL.getType();
6468   if (getDerived().AlwaysRebuild() ||
6469       Enum != T->getDecl()) {
6470     Result = getDerived().RebuildEnumType(Enum);
6471     if (Result.isNull())
6472       return QualType();
6473   }
6474 
6475   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6476   NewTL.setNameLoc(TL.getNameLoc());
6477 
6478   return Result;
6479 }
6480 
6481 template<typename Derived>
TransformInjectedClassNameType(TypeLocBuilder & TLB,InjectedClassNameTypeLoc TL)6482 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6483                                          TypeLocBuilder &TLB,
6484                                          InjectedClassNameTypeLoc TL) {
6485   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6486                                        TL.getTypePtr()->getDecl());
6487   if (!D) return QualType();
6488 
6489   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6490   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6491   return T;
6492 }
6493 
6494 template<typename Derived>
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL)6495 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6496                                                 TypeLocBuilder &TLB,
6497                                                 TemplateTypeParmTypeLoc TL) {
6498   return getDerived().TransformTemplateTypeParmType(
6499       TLB, TL,
6500       /*SuppressObjCLifetime=*/false);
6501 }
6502 
6503 template <typename Derived>
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL,bool)6504 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6505     TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) {
6506   return TransformTypeSpecType(TLB, TL);
6507 }
6508 
6509 template<typename Derived>
TransformSubstTemplateTypeParmType(TypeLocBuilder & TLB,SubstTemplateTypeParmTypeLoc TL)6510 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6511                                          TypeLocBuilder &TLB,
6512                                          SubstTemplateTypeParmTypeLoc TL) {
6513   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6514 
6515   Decl *NewReplaced =
6516       getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl());
6517 
6518   // Substitute into the replacement type, which itself might involve something
6519   // that needs to be transformed. This only tends to occur with default
6520   // template arguments of template template parameters.
6521   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6522   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6523   if (Replacement.isNull())
6524     return QualType();
6525 
6526   QualType Result = SemaRef.Context.getSubstTemplateTypeParmType(
6527       Replacement, NewReplaced, T->getIndex(), T->getPackIndex());
6528 
6529   // Propagate type-source information.
6530   SubstTemplateTypeParmTypeLoc NewTL
6531     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6532   NewTL.setNameLoc(TL.getNameLoc());
6533   return Result;
6534 
6535 }
6536 
6537 template<typename Derived>
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL)6538 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6539                                           TypeLocBuilder &TLB,
6540                                           SubstTemplateTypeParmPackTypeLoc TL) {
6541   return getDerived().TransformSubstTemplateTypeParmPackType(
6542       TLB, TL, /*SuppressObjCLifetime=*/false);
6543 }
6544 
6545 template <typename Derived>
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL,bool)6546 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6547     TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) {
6548   return TransformTypeSpecType(TLB, TL);
6549 }
6550 
6551 template<typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL)6552 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6553                                                         TypeLocBuilder &TLB,
6554                                            TemplateSpecializationTypeLoc TL) {
6555   const TemplateSpecializationType *T = TL.getTypePtr();
6556 
6557   // The nested-name-specifier never matters in a TemplateSpecializationType,
6558   // because we can't have a dependent nested-name-specifier anyway.
6559   CXXScopeSpec SS;
6560   TemplateName Template
6561     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6562                                          TL.getTemplateNameLoc());
6563   if (Template.isNull())
6564     return QualType();
6565 
6566   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6567 }
6568 
6569 template<typename Derived>
TransformAtomicType(TypeLocBuilder & TLB,AtomicTypeLoc TL)6570 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6571                                                      AtomicTypeLoc TL) {
6572   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6573   if (ValueType.isNull())
6574     return QualType();
6575 
6576   QualType Result = TL.getType();
6577   if (getDerived().AlwaysRebuild() ||
6578       ValueType != TL.getValueLoc().getType()) {
6579     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6580     if (Result.isNull())
6581       return QualType();
6582   }
6583 
6584   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6585   NewTL.setKWLoc(TL.getKWLoc());
6586   NewTL.setLParenLoc(TL.getLParenLoc());
6587   NewTL.setRParenLoc(TL.getRParenLoc());
6588 
6589   return Result;
6590 }
6591 
6592 template <typename Derived>
TransformPipeType(TypeLocBuilder & TLB,PipeTypeLoc TL)6593 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6594                                                    PipeTypeLoc TL) {
6595   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6596   if (ValueType.isNull())
6597     return QualType();
6598 
6599   QualType Result = TL.getType();
6600   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6601     const PipeType *PT = Result->castAs<PipeType>();
6602     bool isReadPipe = PT->isReadOnly();
6603     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6604     if (Result.isNull())
6605       return QualType();
6606   }
6607 
6608   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6609   NewTL.setKWLoc(TL.getKWLoc());
6610 
6611   return Result;
6612 }
6613 
6614 template <typename Derived>
TransformBitIntType(TypeLocBuilder & TLB,BitIntTypeLoc TL)6615 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6616                                                      BitIntTypeLoc TL) {
6617   const BitIntType *EIT = TL.getTypePtr();
6618   QualType Result = TL.getType();
6619 
6620   if (getDerived().AlwaysRebuild()) {
6621     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6622                                             EIT->getNumBits(), TL.getNameLoc());
6623     if (Result.isNull())
6624       return QualType();
6625   }
6626 
6627   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6628   NewTL.setNameLoc(TL.getNameLoc());
6629   return Result;
6630 }
6631 
6632 template <typename Derived>
TransformDependentBitIntType(TypeLocBuilder & TLB,DependentBitIntTypeLoc TL)6633 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6634     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6635   const DependentBitIntType *EIT = TL.getTypePtr();
6636 
6637   EnterExpressionEvaluationContext Unevaluated(
6638       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6639   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6640   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6641 
6642   if (BitsExpr.isInvalid())
6643     return QualType();
6644 
6645   QualType Result = TL.getType();
6646 
6647   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6648     Result = getDerived().RebuildDependentBitIntType(
6649         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6650 
6651     if (Result.isNull())
6652       return QualType();
6653   }
6654 
6655   if (isa<DependentBitIntType>(Result)) {
6656     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6657     NewTL.setNameLoc(TL.getNameLoc());
6658   } else {
6659     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6660     NewTL.setNameLoc(TL.getNameLoc());
6661   }
6662   return Result;
6663 }
6664 
6665   /// Simple iterator that traverses the template arguments in a
6666   /// container that provides a \c getArgLoc() member function.
6667   ///
6668   /// This iterator is intended to be used with the iterator form of
6669   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6670   template<typename ArgLocContainer>
6671   class TemplateArgumentLocContainerIterator {
6672     ArgLocContainer *Container;
6673     unsigned Index;
6674 
6675   public:
6676     typedef TemplateArgumentLoc value_type;
6677     typedef TemplateArgumentLoc reference;
6678     typedef int difference_type;
6679     typedef std::input_iterator_tag iterator_category;
6680 
6681     class pointer {
6682       TemplateArgumentLoc Arg;
6683 
6684     public:
pointer(TemplateArgumentLoc Arg)6685       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6686 
6687       const TemplateArgumentLoc *operator->() const {
6688         return &Arg;
6689       }
6690     };
6691 
6692 
TemplateArgumentLocContainerIterator()6693     TemplateArgumentLocContainerIterator() {}
6694 
TemplateArgumentLocContainerIterator(ArgLocContainer & Container,unsigned Index)6695     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6696                                  unsigned Index)
6697       : Container(&Container), Index(Index) { }
6698 
6699     TemplateArgumentLocContainerIterator &operator++() {
6700       ++Index;
6701       return *this;
6702     }
6703 
6704     TemplateArgumentLocContainerIterator operator++(int) {
6705       TemplateArgumentLocContainerIterator Old(*this);
6706       ++(*this);
6707       return Old;
6708     }
6709 
6710     TemplateArgumentLoc operator*() const {
6711       return Container->getArgLoc(Index);
6712     }
6713 
6714     pointer operator->() const {
6715       return pointer(Container->getArgLoc(Index));
6716     }
6717 
6718     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6719                            const TemplateArgumentLocContainerIterator &Y) {
6720       return X.Container == Y.Container && X.Index == Y.Index;
6721     }
6722 
6723     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6724                            const TemplateArgumentLocContainerIterator &Y) {
6725       return !(X == Y);
6726     }
6727   };
6728 
6729 template<typename Derived>
TransformAutoType(TypeLocBuilder & TLB,AutoTypeLoc TL)6730 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6731                                                    AutoTypeLoc TL) {
6732   const AutoType *T = TL.getTypePtr();
6733   QualType OldDeduced = T->getDeducedType();
6734   QualType NewDeduced;
6735   if (!OldDeduced.isNull()) {
6736     NewDeduced = getDerived().TransformType(OldDeduced);
6737     if (NewDeduced.isNull())
6738       return QualType();
6739   }
6740 
6741   ConceptDecl *NewCD = nullptr;
6742   TemplateArgumentListInfo NewTemplateArgs;
6743   NestedNameSpecifierLoc NewNestedNameSpec;
6744   if (T->isConstrained()) {
6745     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6746         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6747 
6748     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6749     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6750     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6751     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6752                                                 ArgIterator(TL,
6753                                                             TL.getNumArgs()),
6754                                                 NewTemplateArgs))
6755       return QualType();
6756 
6757     if (TL.getNestedNameSpecifierLoc()) {
6758       NewNestedNameSpec
6759         = getDerived().TransformNestedNameSpecifierLoc(
6760             TL.getNestedNameSpecifierLoc());
6761       if (!NewNestedNameSpec)
6762         return QualType();
6763     }
6764   }
6765 
6766   QualType Result = TL.getType();
6767   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6768       T->isDependentType() || T->isConstrained()) {
6769     // FIXME: Maybe don't rebuild if all template arguments are the same.
6770     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6771     NewArgList.reserve(NewTemplateArgs.size());
6772     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6773       NewArgList.push_back(ArgLoc.getArgument());
6774     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6775                                           NewArgList);
6776     if (Result.isNull())
6777       return QualType();
6778   }
6779 
6780   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6781   NewTL.setNameLoc(TL.getNameLoc());
6782   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6783   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6784   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6785   NewTL.setFoundDecl(TL.getFoundDecl());
6786   NewTL.setLAngleLoc(TL.getLAngleLoc());
6787   NewTL.setRAngleLoc(TL.getRAngleLoc());
6788   NewTL.setRParenLoc(TL.getRParenLoc());
6789   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6790     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6791 
6792   return Result;
6793 }
6794 
6795 template <typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL,TemplateName Template)6796 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6797                                                         TypeLocBuilder &TLB,
6798                                            TemplateSpecializationTypeLoc TL,
6799                                                       TemplateName Template) {
6800   TemplateArgumentListInfo NewTemplateArgs;
6801   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6802   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6803   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6804     ArgIterator;
6805   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6806                                               ArgIterator(TL, TL.getNumArgs()),
6807                                               NewTemplateArgs))
6808     return QualType();
6809 
6810   // FIXME: maybe don't rebuild if all the template arguments are the same.
6811 
6812   QualType Result =
6813     getDerived().RebuildTemplateSpecializationType(Template,
6814                                                    TL.getTemplateNameLoc(),
6815                                                    NewTemplateArgs);
6816 
6817   if (!Result.isNull()) {
6818     // Specializations of template template parameters are represented as
6819     // TemplateSpecializationTypes, and substitution of type alias templates
6820     // within a dependent context can transform them into
6821     // DependentTemplateSpecializationTypes.
6822     if (isa<DependentTemplateSpecializationType>(Result)) {
6823       DependentTemplateSpecializationTypeLoc NewTL
6824         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6825       NewTL.setElaboratedKeywordLoc(SourceLocation());
6826       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6827       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6828       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6829       NewTL.setLAngleLoc(TL.getLAngleLoc());
6830       NewTL.setRAngleLoc(TL.getRAngleLoc());
6831       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6832         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6833       return Result;
6834     }
6835 
6836     TemplateSpecializationTypeLoc NewTL
6837       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6838     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6839     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6840     NewTL.setLAngleLoc(TL.getLAngleLoc());
6841     NewTL.setRAngleLoc(TL.getRAngleLoc());
6842     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6843       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6844   }
6845 
6846   return Result;
6847 }
6848 
6849 template <typename Derived>
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,TemplateName Template,CXXScopeSpec & SS)6850 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6851                                      TypeLocBuilder &TLB,
6852                                      DependentTemplateSpecializationTypeLoc TL,
6853                                      TemplateName Template,
6854                                      CXXScopeSpec &SS) {
6855   TemplateArgumentListInfo NewTemplateArgs;
6856   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6857   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6858   typedef TemplateArgumentLocContainerIterator<
6859             DependentTemplateSpecializationTypeLoc> ArgIterator;
6860   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6861                                               ArgIterator(TL, TL.getNumArgs()),
6862                                               NewTemplateArgs))
6863     return QualType();
6864 
6865   // FIXME: maybe don't rebuild if all the template arguments are the same.
6866 
6867   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6868     QualType Result = getSema().Context.getDependentTemplateSpecializationType(
6869         TL.getTypePtr()->getKeyword(), DTN->getQualifier(),
6870         DTN->getIdentifier(), NewTemplateArgs.arguments());
6871 
6872     DependentTemplateSpecializationTypeLoc NewTL
6873       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6874     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6875     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6876     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6877     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6878     NewTL.setLAngleLoc(TL.getLAngleLoc());
6879     NewTL.setRAngleLoc(TL.getRAngleLoc());
6880     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6881       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6882     return Result;
6883   }
6884 
6885   QualType Result
6886     = getDerived().RebuildTemplateSpecializationType(Template,
6887                                                      TL.getTemplateNameLoc(),
6888                                                      NewTemplateArgs);
6889 
6890   if (!Result.isNull()) {
6891     /// FIXME: Wrap this in an elaborated-type-specifier?
6892     TemplateSpecializationTypeLoc NewTL
6893       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6894     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6895     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6896     NewTL.setLAngleLoc(TL.getLAngleLoc());
6897     NewTL.setRAngleLoc(TL.getRAngleLoc());
6898     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6899       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6900   }
6901 
6902   return Result;
6903 }
6904 
6905 template<typename Derived>
6906 QualType
TransformElaboratedType(TypeLocBuilder & TLB,ElaboratedTypeLoc TL)6907 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6908                                                 ElaboratedTypeLoc TL) {
6909   const ElaboratedType *T = TL.getTypePtr();
6910 
6911   NestedNameSpecifierLoc QualifierLoc;
6912   // NOTE: the qualifier in an ElaboratedType is optional.
6913   if (TL.getQualifierLoc()) {
6914     QualifierLoc
6915       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6916     if (!QualifierLoc)
6917       return QualType();
6918   }
6919 
6920   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6921   if (NamedT.isNull())
6922     return QualType();
6923 
6924   // C++0x [dcl.type.elab]p2:
6925   //   If the identifier resolves to a typedef-name or the simple-template-id
6926   //   resolves to an alias template specialization, the
6927   //   elaborated-type-specifier is ill-formed.
6928   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6929     if (const TemplateSpecializationType *TST =
6930           NamedT->getAs<TemplateSpecializationType>()) {
6931       TemplateName Template = TST->getTemplateName();
6932       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6933               Template.getAsTemplateDecl())) {
6934         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6935                      diag::err_tag_reference_non_tag)
6936             << TAT << Sema::NTK_TypeAliasTemplate
6937             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6938         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6939       }
6940     }
6941   }
6942 
6943   QualType Result = TL.getType();
6944   if (getDerived().AlwaysRebuild() ||
6945       QualifierLoc != TL.getQualifierLoc() ||
6946       NamedT != T->getNamedType()) {
6947     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6948                                                 T->getKeyword(),
6949                                                 QualifierLoc, NamedT);
6950     if (Result.isNull())
6951       return QualType();
6952   }
6953 
6954   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6955   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6956   NewTL.setQualifierLoc(QualifierLoc);
6957   return Result;
6958 }
6959 
6960 template<typename Derived>
TransformAttributedType(TypeLocBuilder & TLB,AttributedTypeLoc TL)6961 QualType TreeTransform<Derived>::TransformAttributedType(
6962                                                 TypeLocBuilder &TLB,
6963                                                 AttributedTypeLoc TL) {
6964   const AttributedType *oldType = TL.getTypePtr();
6965   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6966   if (modifiedType.isNull())
6967     return QualType();
6968 
6969   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6970   const Attr *oldAttr = TL.getAttr();
6971   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6972   if (oldAttr && !newAttr)
6973     return QualType();
6974 
6975   QualType result = TL.getType();
6976 
6977   // FIXME: dependent operand expressions?
6978   if (getDerived().AlwaysRebuild() ||
6979       modifiedType != oldType->getModifiedType()) {
6980     // TODO: this is really lame; we should really be rebuilding the
6981     // equivalent type from first principles.
6982     QualType equivalentType
6983       = getDerived().TransformType(oldType->getEquivalentType());
6984     if (equivalentType.isNull())
6985       return QualType();
6986 
6987     // Check whether we can add nullability; it is only represented as
6988     // type sugar, and therefore cannot be diagnosed in any other way.
6989     if (auto nullability = oldType->getImmediateNullability()) {
6990       if (!modifiedType->canHaveNullability()) {
6991         SemaRef.Diag(TL.getAttr()->getLocation(),
6992                      diag::err_nullability_nonpointer)
6993             << DiagNullabilityKind(*nullability, false) << modifiedType;
6994         return QualType();
6995       }
6996     }
6997 
6998     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6999                                                modifiedType,
7000                                                equivalentType);
7001   }
7002 
7003   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
7004   newTL.setAttr(newAttr);
7005   return result;
7006 }
7007 
7008 template <typename Derived>
TransformBTFTagAttributedType(TypeLocBuilder & TLB,BTFTagAttributedTypeLoc TL)7009 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
7010     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
7011   // The BTFTagAttributedType is available for C only.
7012   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
7013 }
7014 
7015 template<typename Derived>
7016 QualType
TransformParenType(TypeLocBuilder & TLB,ParenTypeLoc TL)7017 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
7018                                            ParenTypeLoc TL) {
7019   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7020   if (Inner.isNull())
7021     return QualType();
7022 
7023   QualType Result = TL.getType();
7024   if (getDerived().AlwaysRebuild() ||
7025       Inner != TL.getInnerLoc().getType()) {
7026     Result = getDerived().RebuildParenType(Inner);
7027     if (Result.isNull())
7028       return QualType();
7029   }
7030 
7031   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
7032   NewTL.setLParenLoc(TL.getLParenLoc());
7033   NewTL.setRParenLoc(TL.getRParenLoc());
7034   return Result;
7035 }
7036 
7037 template <typename Derived>
7038 QualType
TransformMacroQualifiedType(TypeLocBuilder & TLB,MacroQualifiedTypeLoc TL)7039 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
7040                                                     MacroQualifiedTypeLoc TL) {
7041   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7042   if (Inner.isNull())
7043     return QualType();
7044 
7045   QualType Result = TL.getType();
7046   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
7047     Result =
7048         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
7049     if (Result.isNull())
7050       return QualType();
7051   }
7052 
7053   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
7054   NewTL.setExpansionLoc(TL.getExpansionLoc());
7055   return Result;
7056 }
7057 
7058 template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL)7059 QualType TreeTransform<Derived>::TransformDependentNameType(
7060     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
7061   return TransformDependentNameType(TLB, TL, false);
7062 }
7063 
7064 template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL,bool DeducedTSTContext)7065 QualType TreeTransform<Derived>::TransformDependentNameType(
7066     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
7067   const DependentNameType *T = TL.getTypePtr();
7068 
7069   NestedNameSpecifierLoc QualifierLoc
7070     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7071   if (!QualifierLoc)
7072     return QualType();
7073 
7074   QualType Result
7075     = getDerived().RebuildDependentNameType(T->getKeyword(),
7076                                             TL.getElaboratedKeywordLoc(),
7077                                             QualifierLoc,
7078                                             T->getIdentifier(),
7079                                             TL.getNameLoc(),
7080                                             DeducedTSTContext);
7081   if (Result.isNull())
7082     return QualType();
7083 
7084   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
7085     QualType NamedT = ElabT->getNamedType();
7086     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
7087 
7088     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7089     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7090     NewTL.setQualifierLoc(QualifierLoc);
7091   } else {
7092     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
7093     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7094     NewTL.setQualifierLoc(QualifierLoc);
7095     NewTL.setNameLoc(TL.getNameLoc());
7096   }
7097   return Result;
7098 }
7099 
7100 template<typename Derived>
7101 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL)7102           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7103                                  DependentTemplateSpecializationTypeLoc TL) {
7104   NestedNameSpecifierLoc QualifierLoc;
7105   if (TL.getQualifierLoc()) {
7106     QualifierLoc
7107       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7108     if (!QualifierLoc)
7109       return QualType();
7110   }
7111 
7112   return getDerived()
7113            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
7114 }
7115 
7116 template<typename Derived>
7117 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,NestedNameSpecifierLoc QualifierLoc)7118 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7119                                    DependentTemplateSpecializationTypeLoc TL,
7120                                        NestedNameSpecifierLoc QualifierLoc) {
7121   const DependentTemplateSpecializationType *T = TL.getTypePtr();
7122 
7123   TemplateArgumentListInfo NewTemplateArgs;
7124   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7125   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7126 
7127   typedef TemplateArgumentLocContainerIterator<
7128   DependentTemplateSpecializationTypeLoc> ArgIterator;
7129   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7130                                               ArgIterator(TL, TL.getNumArgs()),
7131                                               NewTemplateArgs))
7132     return QualType();
7133 
7134   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7135       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
7136       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
7137       /*AllowInjectedClassName*/ false);
7138   if (Result.isNull())
7139     return QualType();
7140 
7141   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7142     QualType NamedT = ElabT->getNamedType();
7143 
7144     // Copy information relevant to the template specialization.
7145     TemplateSpecializationTypeLoc NamedTL
7146       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7147     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7148     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7149     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7150     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7151     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7152       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7153 
7154     // Copy information relevant to the elaborated type.
7155     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7156     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7157     NewTL.setQualifierLoc(QualifierLoc);
7158   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7159     DependentTemplateSpecializationTypeLoc SpecTL
7160       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7161     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7162     SpecTL.setQualifierLoc(QualifierLoc);
7163     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7164     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7165     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7166     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7167     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7168       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7169   } else {
7170     TemplateSpecializationTypeLoc SpecTL
7171       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7172     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7173     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7174     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7175     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7176     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7177       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7178   }
7179   return Result;
7180 }
7181 
7182 template<typename Derived>
TransformPackExpansionType(TypeLocBuilder & TLB,PackExpansionTypeLoc TL)7183 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7184                                                       PackExpansionTypeLoc TL) {
7185   QualType Pattern
7186     = getDerived().TransformType(TLB, TL.getPatternLoc());
7187   if (Pattern.isNull())
7188     return QualType();
7189 
7190   QualType Result = TL.getType();
7191   if (getDerived().AlwaysRebuild() ||
7192       Pattern != TL.getPatternLoc().getType()) {
7193     Result = getDerived().RebuildPackExpansionType(Pattern,
7194                                            TL.getPatternLoc().getSourceRange(),
7195                                                    TL.getEllipsisLoc(),
7196                                            TL.getTypePtr()->getNumExpansions());
7197     if (Result.isNull())
7198       return QualType();
7199   }
7200 
7201   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7202   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7203   return Result;
7204 }
7205 
7206 template<typename Derived>
7207 QualType
TransformObjCInterfaceType(TypeLocBuilder & TLB,ObjCInterfaceTypeLoc TL)7208 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7209                                                    ObjCInterfaceTypeLoc TL) {
7210   // ObjCInterfaceType is never dependent.
7211   TLB.pushFullCopy(TL);
7212   return TL.getType();
7213 }
7214 
7215 template<typename Derived>
7216 QualType
TransformObjCTypeParamType(TypeLocBuilder & TLB,ObjCTypeParamTypeLoc TL)7217 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7218                                                    ObjCTypeParamTypeLoc TL) {
7219   const ObjCTypeParamType *T = TL.getTypePtr();
7220   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7221       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7222   if (!OTP)
7223     return QualType();
7224 
7225   QualType Result = TL.getType();
7226   if (getDerived().AlwaysRebuild() ||
7227       OTP != T->getDecl()) {
7228     Result = getDerived().RebuildObjCTypeParamType(
7229         OTP, TL.getProtocolLAngleLoc(),
7230         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7231         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7232     if (Result.isNull())
7233       return QualType();
7234   }
7235 
7236   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7237   if (TL.getNumProtocols()) {
7238     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7239     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7240       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7241     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7242   }
7243   return Result;
7244 }
7245 
7246 template<typename Derived>
7247 QualType
TransformObjCObjectType(TypeLocBuilder & TLB,ObjCObjectTypeLoc TL)7248 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7249                                                 ObjCObjectTypeLoc TL) {
7250   // Transform base type.
7251   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7252   if (BaseType.isNull())
7253     return QualType();
7254 
7255   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7256 
7257   // Transform type arguments.
7258   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7259   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7260     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7261     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7262     QualType TypeArg = TypeArgInfo->getType();
7263     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7264       AnyChanged = true;
7265 
7266       // We have a pack expansion. Instantiate it.
7267       const auto *PackExpansion = PackExpansionLoc.getType()
7268                                     ->castAs<PackExpansionType>();
7269       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7270       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7271                                               Unexpanded);
7272       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7273 
7274       // Determine whether the set of unexpanded parameter packs can
7275       // and should be expanded.
7276       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7277       bool Expand = false;
7278       bool RetainExpansion = false;
7279       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7280       if (getDerived().TryExpandParameterPacks(
7281             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7282             Unexpanded, Expand, RetainExpansion, NumExpansions))
7283         return QualType();
7284 
7285       if (!Expand) {
7286         // We can't expand this pack expansion into separate arguments yet;
7287         // just substitute into the pattern and create a new pack expansion
7288         // type.
7289         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7290 
7291         TypeLocBuilder TypeArgBuilder;
7292         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7293         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7294                                                              PatternLoc);
7295         if (NewPatternType.isNull())
7296           return QualType();
7297 
7298         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7299                                       NewPatternType, NumExpansions);
7300         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7301         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7302         NewTypeArgInfos.push_back(
7303           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7304         continue;
7305       }
7306 
7307       // Substitute into the pack expansion pattern for each slice of the
7308       // pack.
7309       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7310         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7311 
7312         TypeLocBuilder TypeArgBuilder;
7313         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7314 
7315         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7316                                                          PatternLoc);
7317         if (NewTypeArg.isNull())
7318           return QualType();
7319 
7320         NewTypeArgInfos.push_back(
7321           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7322       }
7323 
7324       continue;
7325     }
7326 
7327     TypeLocBuilder TypeArgBuilder;
7328     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7329     QualType NewTypeArg =
7330         getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7331     if (NewTypeArg.isNull())
7332       return QualType();
7333 
7334     // If nothing changed, just keep the old TypeSourceInfo.
7335     if (NewTypeArg == TypeArg) {
7336       NewTypeArgInfos.push_back(TypeArgInfo);
7337       continue;
7338     }
7339 
7340     NewTypeArgInfos.push_back(
7341       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7342     AnyChanged = true;
7343   }
7344 
7345   QualType Result = TL.getType();
7346   if (getDerived().AlwaysRebuild() || AnyChanged) {
7347     // Rebuild the type.
7348     Result = getDerived().RebuildObjCObjectType(
7349         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7350         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7351         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7352         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7353 
7354     if (Result.isNull())
7355       return QualType();
7356   }
7357 
7358   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7359   NewT.setHasBaseTypeAsWritten(true);
7360   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7361   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7362     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7363   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7364   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7365   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7366     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7367   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7368   return Result;
7369 }
7370 
7371 template<typename Derived>
7372 QualType
TransformObjCObjectPointerType(TypeLocBuilder & TLB,ObjCObjectPointerTypeLoc TL)7373 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7374                                                ObjCObjectPointerTypeLoc TL) {
7375   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7376   if (PointeeType.isNull())
7377     return QualType();
7378 
7379   QualType Result = TL.getType();
7380   if (getDerived().AlwaysRebuild() ||
7381       PointeeType != TL.getPointeeLoc().getType()) {
7382     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7383                                                        TL.getStarLoc());
7384     if (Result.isNull())
7385       return QualType();
7386   }
7387 
7388   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7389   NewT.setStarLoc(TL.getStarLoc());
7390   return Result;
7391 }
7392 
7393 //===----------------------------------------------------------------------===//
7394 // Statement transformation
7395 //===----------------------------------------------------------------------===//
7396 template<typename Derived>
7397 StmtResult
TransformNullStmt(NullStmt * S)7398 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7399   return S;
7400 }
7401 
7402 template<typename Derived>
7403 StmtResult
TransformCompoundStmt(CompoundStmt * S)7404 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7405   return getDerived().TransformCompoundStmt(S, false);
7406 }
7407 
7408 template<typename Derived>
7409 StmtResult
TransformCompoundStmt(CompoundStmt * S,bool IsStmtExpr)7410 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7411                                               bool IsStmtExpr) {
7412   Sema::CompoundScopeRAII CompoundScope(getSema());
7413 
7414   const Stmt *ExprResult = S->getStmtExprResult();
7415   bool SubStmtInvalid = false;
7416   bool SubStmtChanged = false;
7417   SmallVector<Stmt*, 8> Statements;
7418   for (auto *B : S->body()) {
7419     StmtResult Result = getDerived().TransformStmt(
7420         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7421 
7422     if (Result.isInvalid()) {
7423       // Immediately fail if this was a DeclStmt, since it's very
7424       // likely that this will cause problems for future statements.
7425       if (isa<DeclStmt>(B))
7426         return StmtError();
7427 
7428       // Otherwise, just keep processing substatements and fail later.
7429       SubStmtInvalid = true;
7430       continue;
7431     }
7432 
7433     SubStmtChanged = SubStmtChanged || Result.get() != B;
7434     Statements.push_back(Result.getAs<Stmt>());
7435   }
7436 
7437   if (SubStmtInvalid)
7438     return StmtError();
7439 
7440   if (!getDerived().AlwaysRebuild() &&
7441       !SubStmtChanged)
7442     return S;
7443 
7444   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7445                                           Statements,
7446                                           S->getRBracLoc(),
7447                                           IsStmtExpr);
7448 }
7449 
7450 template<typename Derived>
7451 StmtResult
TransformCaseStmt(CaseStmt * S)7452 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7453   ExprResult LHS, RHS;
7454   {
7455     EnterExpressionEvaluationContext Unevaluated(
7456         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7457 
7458     // Transform the left-hand case value.
7459     LHS = getDerived().TransformExpr(S->getLHS());
7460     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7461     if (LHS.isInvalid())
7462       return StmtError();
7463 
7464     // Transform the right-hand case value (for the GNU case-range extension).
7465     RHS = getDerived().TransformExpr(S->getRHS());
7466     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7467     if (RHS.isInvalid())
7468       return StmtError();
7469   }
7470 
7471   // Build the case statement.
7472   // Case statements are always rebuilt so that they will attached to their
7473   // transformed switch statement.
7474   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7475                                                        LHS.get(),
7476                                                        S->getEllipsisLoc(),
7477                                                        RHS.get(),
7478                                                        S->getColonLoc());
7479   if (Case.isInvalid())
7480     return StmtError();
7481 
7482   // Transform the statement following the case
7483   StmtResult SubStmt =
7484       getDerived().TransformStmt(S->getSubStmt());
7485   if (SubStmt.isInvalid())
7486     return StmtError();
7487 
7488   // Attach the body to the case statement
7489   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7490 }
7491 
7492 template <typename Derived>
TransformDefaultStmt(DefaultStmt * S)7493 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7494   // Transform the statement following the default case
7495   StmtResult SubStmt =
7496       getDerived().TransformStmt(S->getSubStmt());
7497   if (SubStmt.isInvalid())
7498     return StmtError();
7499 
7500   // Default statements are always rebuilt
7501   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7502                                          SubStmt.get());
7503 }
7504 
7505 template<typename Derived>
7506 StmtResult
TransformLabelStmt(LabelStmt * S,StmtDiscardKind SDK)7507 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7508   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7509   if (SubStmt.isInvalid())
7510     return StmtError();
7511 
7512   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7513                                         S->getDecl());
7514   if (!LD)
7515     return StmtError();
7516 
7517   // If we're transforming "in-place" (we're not creating new local
7518   // declarations), assume we're replacing the old label statement
7519   // and clear out the reference to it.
7520   if (LD == S->getDecl())
7521     S->getDecl()->setStmt(nullptr);
7522 
7523   // FIXME: Pass the real colon location in.
7524   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7525                                        cast<LabelDecl>(LD), SourceLocation(),
7526                                        SubStmt.get());
7527 }
7528 
7529 template <typename Derived>
TransformAttr(const Attr * R)7530 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7531   if (!R)
7532     return R;
7533 
7534   switch (R->getKind()) {
7535 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7536 #define ATTR(X)
7537 #define PRAGMA_SPELLING_ATTR(X)                                                \
7538   case attr::X:                                                                \
7539     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7540 #include "clang/Basic/AttrList.inc"
7541   default:
7542     return R;
7543   }
7544 }
7545 
7546 template <typename Derived>
7547 StmtResult
TransformAttributedStmt(AttributedStmt * S,StmtDiscardKind SDK)7548 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7549                                                 StmtDiscardKind SDK) {
7550   bool AttrsChanged = false;
7551   SmallVector<const Attr *, 1> Attrs;
7552 
7553   // Visit attributes and keep track if any are transformed.
7554   for (const auto *I : S->getAttrs()) {
7555     const Attr *R = getDerived().TransformAttr(I);
7556     AttrsChanged |= (I != R);
7557     if (R)
7558       Attrs.push_back(R);
7559   }
7560 
7561   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7562   if (SubStmt.isInvalid())
7563     return StmtError();
7564 
7565   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7566     return S;
7567 
7568   // If transforming the attributes failed for all of the attributes in the
7569   // statement, don't make an AttributedStmt without attributes.
7570   if (Attrs.empty())
7571     return SubStmt;
7572 
7573   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7574                                             SubStmt.get());
7575 }
7576 
7577 template<typename Derived>
7578 StmtResult
TransformIfStmt(IfStmt * S)7579 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7580   // Transform the initialization statement
7581   StmtResult Init = getDerived().TransformStmt(S->getInit());
7582   if (Init.isInvalid())
7583     return StmtError();
7584 
7585   Sema::ConditionResult Cond;
7586   if (!S->isConsteval()) {
7587     // Transform the condition
7588     Cond = getDerived().TransformCondition(
7589         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7590         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7591                          : Sema::ConditionKind::Boolean);
7592     if (Cond.isInvalid())
7593       return StmtError();
7594   }
7595 
7596   // If this is a constexpr if, determine which arm we should instantiate.
7597   std::optional<bool> ConstexprConditionValue;
7598   if (S->isConstexpr())
7599     ConstexprConditionValue = Cond.getKnownValue();
7600 
7601   // Transform the "then" branch.
7602   StmtResult Then;
7603   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7604     Then = getDerived().TransformStmt(S->getThen());
7605     if (Then.isInvalid())
7606       return StmtError();
7607   } else {
7608     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7609   }
7610 
7611   // Transform the "else" branch.
7612   StmtResult Else;
7613   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7614     Else = getDerived().TransformStmt(S->getElse());
7615     if (Else.isInvalid())
7616       return StmtError();
7617   }
7618 
7619   if (!getDerived().AlwaysRebuild() &&
7620       Init.get() == S->getInit() &&
7621       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7622       Then.get() == S->getThen() &&
7623       Else.get() == S->getElse())
7624     return S;
7625 
7626   return getDerived().RebuildIfStmt(
7627       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7628       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7629 }
7630 
7631 template<typename Derived>
7632 StmtResult
TransformSwitchStmt(SwitchStmt * S)7633 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7634   // Transform the initialization statement
7635   StmtResult Init = getDerived().TransformStmt(S->getInit());
7636   if (Init.isInvalid())
7637     return StmtError();
7638 
7639   // Transform the condition.
7640   Sema::ConditionResult Cond = getDerived().TransformCondition(
7641       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7642       Sema::ConditionKind::Switch);
7643   if (Cond.isInvalid())
7644     return StmtError();
7645 
7646   // Rebuild the switch statement.
7647   StmtResult Switch =
7648       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7649                                           Init.get(), Cond, S->getRParenLoc());
7650   if (Switch.isInvalid())
7651     return StmtError();
7652 
7653   // Transform the body of the switch statement.
7654   StmtResult Body = getDerived().TransformStmt(S->getBody());
7655   if (Body.isInvalid())
7656     return StmtError();
7657 
7658   // Complete the switch statement.
7659   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7660                                             Body.get());
7661 }
7662 
7663 template<typename Derived>
7664 StmtResult
TransformWhileStmt(WhileStmt * S)7665 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7666   // Transform the condition
7667   Sema::ConditionResult Cond = getDerived().TransformCondition(
7668       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7669       Sema::ConditionKind::Boolean);
7670   if (Cond.isInvalid())
7671     return StmtError();
7672 
7673   // Transform the body
7674   StmtResult Body = getDerived().TransformStmt(S->getBody());
7675   if (Body.isInvalid())
7676     return StmtError();
7677 
7678   if (!getDerived().AlwaysRebuild() &&
7679       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7680       Body.get() == S->getBody())
7681     return Owned(S);
7682 
7683   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7684                                        Cond, S->getRParenLoc(), Body.get());
7685 }
7686 
7687 template<typename Derived>
7688 StmtResult
TransformDoStmt(DoStmt * S)7689 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7690   // Transform the body
7691   StmtResult Body = getDerived().TransformStmt(S->getBody());
7692   if (Body.isInvalid())
7693     return StmtError();
7694 
7695   // Transform the condition
7696   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7697   if (Cond.isInvalid())
7698     return StmtError();
7699 
7700   if (!getDerived().AlwaysRebuild() &&
7701       Cond.get() == S->getCond() &&
7702       Body.get() == S->getBody())
7703     return S;
7704 
7705   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7706                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7707                                     S->getRParenLoc());
7708 }
7709 
7710 template<typename Derived>
7711 StmtResult
TransformForStmt(ForStmt * S)7712 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7713   if (getSema().getLangOpts().OpenMP)
7714     getSema().startOpenMPLoop();
7715 
7716   // Transform the initialization statement
7717   StmtResult Init = getDerived().TransformStmt(S->getInit());
7718   if (Init.isInvalid())
7719     return StmtError();
7720 
7721   // In OpenMP loop region loop control variable must be captured and be
7722   // private. Perform analysis of first part (if any).
7723   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7724     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7725 
7726   // Transform the condition
7727   Sema::ConditionResult Cond = getDerived().TransformCondition(
7728       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7729       Sema::ConditionKind::Boolean);
7730   if (Cond.isInvalid())
7731     return StmtError();
7732 
7733   // Transform the increment
7734   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7735   if (Inc.isInvalid())
7736     return StmtError();
7737 
7738   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7739   if (S->getInc() && !FullInc.get())
7740     return StmtError();
7741 
7742   // Transform the body
7743   StmtResult Body = getDerived().TransformStmt(S->getBody());
7744   if (Body.isInvalid())
7745     return StmtError();
7746 
7747   if (!getDerived().AlwaysRebuild() &&
7748       Init.get() == S->getInit() &&
7749       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7750       Inc.get() == S->getInc() &&
7751       Body.get() == S->getBody())
7752     return S;
7753 
7754   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7755                                      Init.get(), Cond, FullInc,
7756                                      S->getRParenLoc(), Body.get());
7757 }
7758 
7759 template<typename Derived>
7760 StmtResult
TransformGotoStmt(GotoStmt * S)7761 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7762   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7763                                         S->getLabel());
7764   if (!LD)
7765     return StmtError();
7766 
7767   // Goto statements must always be rebuilt, to resolve the label.
7768   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7769                                       cast<LabelDecl>(LD));
7770 }
7771 
7772 template<typename Derived>
7773 StmtResult
TransformIndirectGotoStmt(IndirectGotoStmt * S)7774 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7775   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7776   if (Target.isInvalid())
7777     return StmtError();
7778   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7779 
7780   if (!getDerived().AlwaysRebuild() &&
7781       Target.get() == S->getTarget())
7782     return S;
7783 
7784   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7785                                               Target.get());
7786 }
7787 
7788 template<typename Derived>
7789 StmtResult
TransformContinueStmt(ContinueStmt * S)7790 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7791   return S;
7792 }
7793 
7794 template<typename Derived>
7795 StmtResult
TransformBreakStmt(BreakStmt * S)7796 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7797   return S;
7798 }
7799 
7800 template<typename Derived>
7801 StmtResult
TransformReturnStmt(ReturnStmt * S)7802 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7803   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7804                                                         /*NotCopyInit*/false);
7805   if (Result.isInvalid())
7806     return StmtError();
7807 
7808   // FIXME: We always rebuild the return statement because there is no way
7809   // to tell whether the return type of the function has changed.
7810   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7811 }
7812 
7813 template<typename Derived>
7814 StmtResult
TransformDeclStmt(DeclStmt * S)7815 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7816   bool DeclChanged = false;
7817   SmallVector<Decl *, 4> Decls;
7818   for (auto *D : S->decls()) {
7819     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7820     if (!Transformed)
7821       return StmtError();
7822 
7823     if (Transformed != D)
7824       DeclChanged = true;
7825 
7826     Decls.push_back(Transformed);
7827   }
7828 
7829   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7830     return S;
7831 
7832   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7833 }
7834 
7835 template<typename Derived>
7836 StmtResult
TransformGCCAsmStmt(GCCAsmStmt * S)7837 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7838 
7839   SmallVector<Expr*, 8> Constraints;
7840   SmallVector<Expr*, 8> Exprs;
7841   SmallVector<IdentifierInfo *, 4> Names;
7842 
7843   ExprResult AsmString;
7844   SmallVector<Expr*, 8> Clobbers;
7845 
7846   bool ExprsChanged = false;
7847 
7848   // Go through the outputs.
7849   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7850     Names.push_back(S->getOutputIdentifier(I));
7851 
7852     // No need to transform the constraint literal.
7853     Constraints.push_back(S->getOutputConstraintLiteral(I));
7854 
7855     // Transform the output expr.
7856     Expr *OutputExpr = S->getOutputExpr(I);
7857     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7858     if (Result.isInvalid())
7859       return StmtError();
7860 
7861     ExprsChanged |= Result.get() != OutputExpr;
7862 
7863     Exprs.push_back(Result.get());
7864   }
7865 
7866   // Go through the inputs.
7867   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7868     Names.push_back(S->getInputIdentifier(I));
7869 
7870     // No need to transform the constraint literal.
7871     Constraints.push_back(S->getInputConstraintLiteral(I));
7872 
7873     // Transform the input expr.
7874     Expr *InputExpr = S->getInputExpr(I);
7875     ExprResult Result = getDerived().TransformExpr(InputExpr);
7876     if (Result.isInvalid())
7877       return StmtError();
7878 
7879     ExprsChanged |= Result.get() != InputExpr;
7880 
7881     Exprs.push_back(Result.get());
7882   }
7883 
7884   // Go through the Labels.
7885   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7886     Names.push_back(S->getLabelIdentifier(I));
7887 
7888     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7889     if (Result.isInvalid())
7890       return StmtError();
7891     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7892     Exprs.push_back(Result.get());
7893   }
7894   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7895     return S;
7896 
7897   // Go through the clobbers.
7898   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7899     Clobbers.push_back(S->getClobberStringLiteral(I));
7900 
7901   // No need to transform the asm string literal.
7902   AsmString = S->getAsmString();
7903   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7904                                         S->isVolatile(), S->getNumOutputs(),
7905                                         S->getNumInputs(), Names.data(),
7906                                         Constraints, Exprs, AsmString.get(),
7907                                         Clobbers, S->getNumLabels(),
7908                                         S->getRParenLoc());
7909 }
7910 
7911 template<typename Derived>
7912 StmtResult
TransformMSAsmStmt(MSAsmStmt * S)7913 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7914   ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks());
7915 
7916   bool HadError = false, HadChange = false;
7917 
7918   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7919   SmallVector<Expr*, 8> TransformedExprs;
7920   TransformedExprs.reserve(SrcExprs.size());
7921   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7922     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7923     if (!Result.isUsable()) {
7924       HadError = true;
7925     } else {
7926       HadChange |= (Result.get() != SrcExprs[i]);
7927       TransformedExprs.push_back(Result.get());
7928     }
7929   }
7930 
7931   if (HadError) return StmtError();
7932   if (!HadChange && !getDerived().AlwaysRebuild())
7933     return Owned(S);
7934 
7935   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7936                                        AsmToks, S->getAsmString(),
7937                                        S->getNumOutputs(), S->getNumInputs(),
7938                                        S->getAllConstraints(), S->getClobbers(),
7939                                        TransformedExprs, S->getEndLoc());
7940 }
7941 
7942 // C++ Coroutines TS
7943 
7944 template<typename Derived>
7945 StmtResult
TransformCoroutineBodyStmt(CoroutineBodyStmt * S)7946 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7947   auto *ScopeInfo = SemaRef.getCurFunction();
7948   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7949   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7950          ScopeInfo->NeedsCoroutineSuspends &&
7951          ScopeInfo->CoroutineSuspends.first == nullptr &&
7952          ScopeInfo->CoroutineSuspends.second == nullptr &&
7953          "expected clean scope info");
7954 
7955   // Set that we have (possibly-invalid) suspend points before we do anything
7956   // that may fail.
7957   ScopeInfo->setNeedsCoroutineSuspends(false);
7958 
7959   // We re-build the coroutine promise object (and the coroutine parameters its
7960   // type and constructor depend on) based on the types used in our current
7961   // function. We must do so, and set it on the current FunctionScopeInfo,
7962   // before attempting to transform the other parts of the coroutine body
7963   // statement, such as the implicit suspend statements (because those
7964   // statements reference the FunctionScopeInfo::CoroutinePromise).
7965   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7966     return StmtError();
7967   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7968   if (!Promise)
7969     return StmtError();
7970   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7971   ScopeInfo->CoroutinePromise = Promise;
7972 
7973   // Transform the implicit coroutine statements constructed using dependent
7974   // types during the previous parse: initial and final suspensions, the return
7975   // object, and others. We also transform the coroutine function's body.
7976   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7977   if (InitSuspend.isInvalid())
7978     return StmtError();
7979   StmtResult FinalSuspend =
7980       getDerived().TransformStmt(S->getFinalSuspendStmt());
7981   if (FinalSuspend.isInvalid() ||
7982       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7983     return StmtError();
7984   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7985   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7986 
7987   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7988   if (BodyRes.isInvalid())
7989     return StmtError();
7990 
7991   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7992   if (Builder.isInvalid())
7993     return StmtError();
7994 
7995   Expr *ReturnObject = S->getReturnValueInit();
7996   assert(ReturnObject && "the return object is expected to be valid");
7997   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7998                                                      /*NoCopyInit*/ false);
7999   if (Res.isInvalid())
8000     return StmtError();
8001   Builder.ReturnValue = Res.get();
8002 
8003   // If during the previous parse the coroutine still had a dependent promise
8004   // statement, we may need to build some implicit coroutine statements
8005   // (such as exception and fallthrough handlers) for the first time.
8006   if (S->hasDependentPromiseType()) {
8007     // We can only build these statements, however, if the current promise type
8008     // is not dependent.
8009     if (!Promise->getType()->isDependentType()) {
8010       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
8011              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
8012              "these nodes should not have been built yet");
8013       if (!Builder.buildDependentStatements())
8014         return StmtError();
8015     }
8016   } else {
8017     if (auto *OnFallthrough = S->getFallthroughHandler()) {
8018       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
8019       if (Res.isInvalid())
8020         return StmtError();
8021       Builder.OnFallthrough = Res.get();
8022     }
8023 
8024     if (auto *OnException = S->getExceptionHandler()) {
8025       StmtResult Res = getDerived().TransformStmt(OnException);
8026       if (Res.isInvalid())
8027         return StmtError();
8028       Builder.OnException = Res.get();
8029     }
8030 
8031     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
8032       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
8033       if (Res.isInvalid())
8034         return StmtError();
8035       Builder.ReturnStmtOnAllocFailure = Res.get();
8036     }
8037 
8038     // Transform any additional statements we may have already built
8039     assert(S->getAllocate() && S->getDeallocate() &&
8040            "allocation and deallocation calls must already be built");
8041     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
8042     if (AllocRes.isInvalid())
8043       return StmtError();
8044     Builder.Allocate = AllocRes.get();
8045 
8046     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
8047     if (DeallocRes.isInvalid())
8048       return StmtError();
8049     Builder.Deallocate = DeallocRes.get();
8050 
8051     if (auto *ReturnStmt = S->getReturnStmt()) {
8052       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
8053       if (Res.isInvalid())
8054         return StmtError();
8055       Builder.ReturnStmt = Res.get();
8056     }
8057   }
8058 
8059   return getDerived().RebuildCoroutineBodyStmt(Builder);
8060 }
8061 
8062 template<typename Derived>
8063 StmtResult
TransformCoreturnStmt(CoreturnStmt * S)8064 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
8065   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
8066                                                         /*NotCopyInit*/false);
8067   if (Result.isInvalid())
8068     return StmtError();
8069 
8070   // Always rebuild; we don't know if this needs to be injected into a new
8071   // context or if the promise type has changed.
8072   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
8073                                           S->isImplicit());
8074 }
8075 
8076 template <typename Derived>
TransformCoawaitExpr(CoawaitExpr * E)8077 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
8078   ExprResult Operand = getDerived().TransformInitializer(E->getOperand(),
8079                                                          /*NotCopyInit*/ false);
8080   if (Operand.isInvalid())
8081     return ExprError();
8082 
8083   // Rebuild the common-expr from the operand rather than transforming it
8084   // separately.
8085 
8086   // FIXME: getCurScope() should not be used during template instantiation.
8087   // We should pick up the set of unqualified lookup results for operator
8088   // co_await during the initial parse.
8089   ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr(
8090       getSema().getCurScope(), E->getKeywordLoc());
8091 
8092   // Always rebuild; we don't know if this needs to be injected into a new
8093   // context or if the promise type has changed.
8094   return getDerived().RebuildCoawaitExpr(
8095       E->getKeywordLoc(), Operand.get(),
8096       cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit());
8097 }
8098 
8099 template <typename Derived>
8100 ExprResult
TransformDependentCoawaitExpr(DependentCoawaitExpr * E)8101 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
8102   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
8103                                                         /*NotCopyInit*/ false);
8104   if (OperandResult.isInvalid())
8105     return ExprError();
8106 
8107   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
8108           E->getOperatorCoawaitLookup());
8109 
8110   if (LookupResult.isInvalid())
8111     return ExprError();
8112 
8113   // Always rebuild; we don't know if this needs to be injected into a new
8114   // context or if the promise type has changed.
8115   return getDerived().RebuildDependentCoawaitExpr(
8116       E->getKeywordLoc(), OperandResult.get(),
8117       cast<UnresolvedLookupExpr>(LookupResult.get()));
8118 }
8119 
8120 template<typename Derived>
8121 ExprResult
TransformCoyieldExpr(CoyieldExpr * E)8122 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
8123   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
8124                                                         /*NotCopyInit*/false);
8125   if (Result.isInvalid())
8126     return ExprError();
8127 
8128   // Always rebuild; we don't know if this needs to be injected into a new
8129   // context or if the promise type has changed.
8130   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
8131 }
8132 
8133 // Objective-C Statements.
8134 
8135 template<typename Derived>
8136 StmtResult
TransformObjCAtTryStmt(ObjCAtTryStmt * S)8137 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8138   // Transform the body of the @try.
8139   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8140   if (TryBody.isInvalid())
8141     return StmtError();
8142 
8143   // Transform the @catch statements (if present).
8144   bool AnyCatchChanged = false;
8145   SmallVector<Stmt*, 8> CatchStmts;
8146   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8147     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8148     if (Catch.isInvalid())
8149       return StmtError();
8150     if (Catch.get() != S->getCatchStmt(I))
8151       AnyCatchChanged = true;
8152     CatchStmts.push_back(Catch.get());
8153   }
8154 
8155   // Transform the @finally statement (if present).
8156   StmtResult Finally;
8157   if (S->getFinallyStmt()) {
8158     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8159     if (Finally.isInvalid())
8160       return StmtError();
8161   }
8162 
8163   // If nothing changed, just retain this statement.
8164   if (!getDerived().AlwaysRebuild() &&
8165       TryBody.get() == S->getTryBody() &&
8166       !AnyCatchChanged &&
8167       Finally.get() == S->getFinallyStmt())
8168     return S;
8169 
8170   // Build a new statement.
8171   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8172                                            CatchStmts, Finally.get());
8173 }
8174 
8175 template<typename Derived>
8176 StmtResult
TransformObjCAtCatchStmt(ObjCAtCatchStmt * S)8177 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8178   // Transform the @catch parameter, if there is one.
8179   VarDecl *Var = nullptr;
8180   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8181     TypeSourceInfo *TSInfo = nullptr;
8182     if (FromVar->getTypeSourceInfo()) {
8183       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8184       if (!TSInfo)
8185         return StmtError();
8186     }
8187 
8188     QualType T;
8189     if (TSInfo)
8190       T = TSInfo->getType();
8191     else {
8192       T = getDerived().TransformType(FromVar->getType());
8193       if (T.isNull())
8194         return StmtError();
8195     }
8196 
8197     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8198     if (!Var)
8199       return StmtError();
8200   }
8201 
8202   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8203   if (Body.isInvalid())
8204     return StmtError();
8205 
8206   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8207                                              S->getRParenLoc(),
8208                                              Var, Body.get());
8209 }
8210 
8211 template<typename Derived>
8212 StmtResult
TransformObjCAtFinallyStmt(ObjCAtFinallyStmt * S)8213 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8214   // Transform the body.
8215   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8216   if (Body.isInvalid())
8217     return StmtError();
8218 
8219   // If nothing changed, just retain this statement.
8220   if (!getDerived().AlwaysRebuild() &&
8221       Body.get() == S->getFinallyBody())
8222     return S;
8223 
8224   // Build a new statement.
8225   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8226                                                Body.get());
8227 }
8228 
8229 template<typename Derived>
8230 StmtResult
TransformObjCAtThrowStmt(ObjCAtThrowStmt * S)8231 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8232   ExprResult Operand;
8233   if (S->getThrowExpr()) {
8234     Operand = getDerived().TransformExpr(S->getThrowExpr());
8235     if (Operand.isInvalid())
8236       return StmtError();
8237   }
8238 
8239   if (!getDerived().AlwaysRebuild() &&
8240       Operand.get() == S->getThrowExpr())
8241     return S;
8242 
8243   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8244 }
8245 
8246 template<typename Derived>
8247 StmtResult
TransformObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)8248 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8249                                                   ObjCAtSynchronizedStmt *S) {
8250   // Transform the object we are locking.
8251   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8252   if (Object.isInvalid())
8253     return StmtError();
8254   Object =
8255     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8256                                                   Object.get());
8257   if (Object.isInvalid())
8258     return StmtError();
8259 
8260   // Transform the body.
8261   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8262   if (Body.isInvalid())
8263     return StmtError();
8264 
8265   // If nothing change, just retain the current statement.
8266   if (!getDerived().AlwaysRebuild() &&
8267       Object.get() == S->getSynchExpr() &&
8268       Body.get() == S->getSynchBody())
8269     return S;
8270 
8271   // Build a new statement.
8272   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8273                                                     Object.get(), Body.get());
8274 }
8275 
8276 template<typename Derived>
8277 StmtResult
TransformObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)8278 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8279                                               ObjCAutoreleasePoolStmt *S) {
8280   // Transform the body.
8281   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8282   if (Body.isInvalid())
8283     return StmtError();
8284 
8285   // If nothing changed, just retain this statement.
8286   if (!getDerived().AlwaysRebuild() &&
8287       Body.get() == S->getSubStmt())
8288     return S;
8289 
8290   // Build a new statement.
8291   return getDerived().RebuildObjCAutoreleasePoolStmt(
8292                         S->getAtLoc(), Body.get());
8293 }
8294 
8295 template<typename Derived>
8296 StmtResult
TransformObjCForCollectionStmt(ObjCForCollectionStmt * S)8297 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8298                                                   ObjCForCollectionStmt *S) {
8299   // Transform the element statement.
8300   StmtResult Element =
8301       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8302   if (Element.isInvalid())
8303     return StmtError();
8304 
8305   // Transform the collection expression.
8306   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8307   if (Collection.isInvalid())
8308     return StmtError();
8309 
8310   // Transform the body.
8311   StmtResult Body = getDerived().TransformStmt(S->getBody());
8312   if (Body.isInvalid())
8313     return StmtError();
8314 
8315   // If nothing changed, just retain this statement.
8316   if (!getDerived().AlwaysRebuild() &&
8317       Element.get() == S->getElement() &&
8318       Collection.get() == S->getCollection() &&
8319       Body.get() == S->getBody())
8320     return S;
8321 
8322   // Build a new statement.
8323   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8324                                                    Element.get(),
8325                                                    Collection.get(),
8326                                                    S->getRParenLoc(),
8327                                                    Body.get());
8328 }
8329 
8330 template <typename Derived>
TransformCXXCatchStmt(CXXCatchStmt * S)8331 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8332   // Transform the exception declaration, if any.
8333   VarDecl *Var = nullptr;
8334   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8335     TypeSourceInfo *T =
8336         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8337     if (!T)
8338       return StmtError();
8339 
8340     Var = getDerived().RebuildExceptionDecl(
8341         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8342         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8343     if (!Var || Var->isInvalidDecl())
8344       return StmtError();
8345   }
8346 
8347   // Transform the actual exception handler.
8348   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8349   if (Handler.isInvalid())
8350     return StmtError();
8351 
8352   if (!getDerived().AlwaysRebuild() && !Var &&
8353       Handler.get() == S->getHandlerBlock())
8354     return S;
8355 
8356   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8357 }
8358 
8359 template <typename Derived>
TransformCXXTryStmt(CXXTryStmt * S)8360 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8361   // Transform the try block itself.
8362   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8363   if (TryBlock.isInvalid())
8364     return StmtError();
8365 
8366   // Transform the handlers.
8367   bool HandlerChanged = false;
8368   SmallVector<Stmt *, 8> Handlers;
8369   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8370     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8371     if (Handler.isInvalid())
8372       return StmtError();
8373 
8374     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8375     Handlers.push_back(Handler.getAs<Stmt>());
8376   }
8377 
8378   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8379       !HandlerChanged)
8380     return S;
8381 
8382   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8383                                         Handlers);
8384 }
8385 
8386 template<typename Derived>
8387 StmtResult
TransformCXXForRangeStmt(CXXForRangeStmt * S)8388 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8389   StmtResult Init =
8390       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8391   if (Init.isInvalid())
8392     return StmtError();
8393 
8394   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8395   if (Range.isInvalid())
8396     return StmtError();
8397 
8398   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8399   if (Begin.isInvalid())
8400     return StmtError();
8401   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8402   if (End.isInvalid())
8403     return StmtError();
8404 
8405   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8406   if (Cond.isInvalid())
8407     return StmtError();
8408   if (Cond.get())
8409     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8410   if (Cond.isInvalid())
8411     return StmtError();
8412   if (Cond.get())
8413     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8414 
8415   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8416   if (Inc.isInvalid())
8417     return StmtError();
8418   if (Inc.get())
8419     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8420 
8421   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8422   if (LoopVar.isInvalid())
8423     return StmtError();
8424 
8425   StmtResult NewStmt = S;
8426   if (getDerived().AlwaysRebuild() ||
8427       Init.get() != S->getInit() ||
8428       Range.get() != S->getRangeStmt() ||
8429       Begin.get() != S->getBeginStmt() ||
8430       End.get() != S->getEndStmt() ||
8431       Cond.get() != S->getCond() ||
8432       Inc.get() != S->getInc() ||
8433       LoopVar.get() != S->getLoopVarStmt()) {
8434     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8435                                                   S->getCoawaitLoc(), Init.get(),
8436                                                   S->getColonLoc(), Range.get(),
8437                                                   Begin.get(), End.get(),
8438                                                   Cond.get(),
8439                                                   Inc.get(), LoopVar.get(),
8440                                                   S->getRParenLoc());
8441     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8442       // Might not have attached any initializer to the loop variable.
8443       getSema().ActOnInitializerError(
8444           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8445       return StmtError();
8446     }
8447   }
8448 
8449   StmtResult Body = getDerived().TransformStmt(S->getBody());
8450   if (Body.isInvalid())
8451     return StmtError();
8452 
8453   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8454   // it now so we have a new statement to attach the body to.
8455   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8456     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8457                                                   S->getCoawaitLoc(), Init.get(),
8458                                                   S->getColonLoc(), Range.get(),
8459                                                   Begin.get(), End.get(),
8460                                                   Cond.get(),
8461                                                   Inc.get(), LoopVar.get(),
8462                                                   S->getRParenLoc());
8463     if (NewStmt.isInvalid())
8464       return StmtError();
8465   }
8466 
8467   if (NewStmt.get() == S)
8468     return S;
8469 
8470   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8471 }
8472 
8473 template<typename Derived>
8474 StmtResult
TransformMSDependentExistsStmt(MSDependentExistsStmt * S)8475 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8476                                                     MSDependentExistsStmt *S) {
8477   // Transform the nested-name-specifier, if any.
8478   NestedNameSpecifierLoc QualifierLoc;
8479   if (S->getQualifierLoc()) {
8480     QualifierLoc
8481       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8482     if (!QualifierLoc)
8483       return StmtError();
8484   }
8485 
8486   // Transform the declaration name.
8487   DeclarationNameInfo NameInfo = S->getNameInfo();
8488   if (NameInfo.getName()) {
8489     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8490     if (!NameInfo.getName())
8491       return StmtError();
8492   }
8493 
8494   // Check whether anything changed.
8495   if (!getDerived().AlwaysRebuild() &&
8496       QualifierLoc == S->getQualifierLoc() &&
8497       NameInfo.getName() == S->getNameInfo().getName())
8498     return S;
8499 
8500   // Determine whether this name exists, if we can.
8501   CXXScopeSpec SS;
8502   SS.Adopt(QualifierLoc);
8503   bool Dependent = false;
8504   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8505   case Sema::IER_Exists:
8506     if (S->isIfExists())
8507       break;
8508 
8509     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8510 
8511   case Sema::IER_DoesNotExist:
8512     if (S->isIfNotExists())
8513       break;
8514 
8515     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8516 
8517   case Sema::IER_Dependent:
8518     Dependent = true;
8519     break;
8520 
8521   case Sema::IER_Error:
8522     return StmtError();
8523   }
8524 
8525   // We need to continue with the instantiation, so do so now.
8526   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8527   if (SubStmt.isInvalid())
8528     return StmtError();
8529 
8530   // If we have resolved the name, just transform to the substatement.
8531   if (!Dependent)
8532     return SubStmt;
8533 
8534   // The name is still dependent, so build a dependent expression again.
8535   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8536                                                    S->isIfExists(),
8537                                                    QualifierLoc,
8538                                                    NameInfo,
8539                                                    SubStmt.get());
8540 }
8541 
8542 template<typename Derived>
8543 ExprResult
TransformMSPropertyRefExpr(MSPropertyRefExpr * E)8544 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8545   NestedNameSpecifierLoc QualifierLoc;
8546   if (E->getQualifierLoc()) {
8547     QualifierLoc
8548     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8549     if (!QualifierLoc)
8550       return ExprError();
8551   }
8552 
8553   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8554     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8555   if (!PD)
8556     return ExprError();
8557 
8558   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8559   if (Base.isInvalid())
8560     return ExprError();
8561 
8562   return new (SemaRef.getASTContext())
8563       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8564                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8565                         QualifierLoc, E->getMemberLoc());
8566 }
8567 
8568 template <typename Derived>
TransformMSPropertySubscriptExpr(MSPropertySubscriptExpr * E)8569 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8570     MSPropertySubscriptExpr *E) {
8571   auto BaseRes = getDerived().TransformExpr(E->getBase());
8572   if (BaseRes.isInvalid())
8573     return ExprError();
8574   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8575   if (IdxRes.isInvalid())
8576     return ExprError();
8577 
8578   if (!getDerived().AlwaysRebuild() &&
8579       BaseRes.get() == E->getBase() &&
8580       IdxRes.get() == E->getIdx())
8581     return E;
8582 
8583   return getDerived().RebuildArraySubscriptExpr(
8584       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8585 }
8586 
8587 template <typename Derived>
TransformSEHTryStmt(SEHTryStmt * S)8588 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8589   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8590   if (TryBlock.isInvalid())
8591     return StmtError();
8592 
8593   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8594   if (Handler.isInvalid())
8595     return StmtError();
8596 
8597   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8598       Handler.get() == S->getHandler())
8599     return S;
8600 
8601   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8602                                         TryBlock.get(), Handler.get());
8603 }
8604 
8605 template <typename Derived>
TransformSEHFinallyStmt(SEHFinallyStmt * S)8606 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8607   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8608   if (Block.isInvalid())
8609     return StmtError();
8610 
8611   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8612 }
8613 
8614 template <typename Derived>
TransformSEHExceptStmt(SEHExceptStmt * S)8615 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8616   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8617   if (FilterExpr.isInvalid())
8618     return StmtError();
8619 
8620   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8621   if (Block.isInvalid())
8622     return StmtError();
8623 
8624   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8625                                            Block.get());
8626 }
8627 
8628 template <typename Derived>
TransformSEHHandler(Stmt * Handler)8629 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8630   if (isa<SEHFinallyStmt>(Handler))
8631     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8632   else
8633     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8634 }
8635 
8636 template<typename Derived>
8637 StmtResult
TransformSEHLeaveStmt(SEHLeaveStmt * S)8638 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8639   return S;
8640 }
8641 
8642 //===----------------------------------------------------------------------===//
8643 // OpenMP directive transformation
8644 //===----------------------------------------------------------------------===//
8645 
8646 template <typename Derived>
8647 StmtResult
TransformOMPCanonicalLoop(OMPCanonicalLoop * L)8648 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8649   // OMPCanonicalLoops are eliminated during transformation, since they will be
8650   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8651   // after transformation.
8652   return getDerived().TransformStmt(L->getLoopStmt());
8653 }
8654 
8655 template <typename Derived>
TransformOMPExecutableDirective(OMPExecutableDirective * D)8656 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8657     OMPExecutableDirective *D) {
8658 
8659   // Transform the clauses
8660   llvm::SmallVector<OMPClause *, 16> TClauses;
8661   ArrayRef<OMPClause *> Clauses = D->clauses();
8662   TClauses.reserve(Clauses.size());
8663   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8664        I != E; ++I) {
8665     if (*I) {
8666       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8667       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8668       getDerived().getSema().EndOpenMPClause();
8669       if (Clause)
8670         TClauses.push_back(Clause);
8671     } else {
8672       TClauses.push_back(nullptr);
8673     }
8674   }
8675   StmtResult AssociatedStmt;
8676   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8677     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8678                                                   /*CurScope=*/nullptr);
8679     StmtResult Body;
8680     {
8681       Sema::CompoundScopeRAII CompoundScope(getSema());
8682       Stmt *CS;
8683       if (D->getDirectiveKind() == OMPD_atomic ||
8684           D->getDirectiveKind() == OMPD_critical ||
8685           D->getDirectiveKind() == OMPD_section ||
8686           D->getDirectiveKind() == OMPD_master)
8687         CS = D->getAssociatedStmt();
8688       else
8689         CS = D->getRawStmt();
8690       Body = getDerived().TransformStmt(CS);
8691       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8692           getSema().getLangOpts().OpenMPIRBuilder)
8693         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8694     }
8695     AssociatedStmt =
8696         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8697     if (AssociatedStmt.isInvalid()) {
8698       return StmtError();
8699     }
8700   }
8701   if (TClauses.size() != Clauses.size()) {
8702     return StmtError();
8703   }
8704 
8705   // Transform directive name for 'omp critical' directive.
8706   DeclarationNameInfo DirName;
8707   if (D->getDirectiveKind() == OMPD_critical) {
8708     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8709     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8710   }
8711   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8712   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8713     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8714   } else if (D->getDirectiveKind() == OMPD_cancel) {
8715     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8716   }
8717 
8718   return getDerived().RebuildOMPExecutableDirective(
8719       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8720       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8721 }
8722 
8723 template <typename Derived>
8724 StmtResult
TransformOMPMetaDirective(OMPMetaDirective * D)8725 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8726   // TODO: Fix This
8727   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8728       << getOpenMPDirectiveName(D->getDirectiveKind());
8729   return StmtError();
8730 }
8731 
8732 template <typename Derived>
8733 StmtResult
TransformOMPParallelDirective(OMPParallelDirective * D)8734 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8735   DeclarationNameInfo DirName;
8736   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8737                                              D->getBeginLoc());
8738   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8739   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8740   return Res;
8741 }
8742 
8743 template <typename Derived>
8744 StmtResult
TransformOMPSimdDirective(OMPSimdDirective * D)8745 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8746   DeclarationNameInfo DirName;
8747   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8748                                              D->getBeginLoc());
8749   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8750   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8751   return Res;
8752 }
8753 
8754 template <typename Derived>
8755 StmtResult
TransformOMPTileDirective(OMPTileDirective * D)8756 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8757   DeclarationNameInfo DirName;
8758   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8759                                              nullptr, D->getBeginLoc());
8760   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8761   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8762   return Res;
8763 }
8764 
8765 template <typename Derived>
8766 StmtResult
TransformOMPUnrollDirective(OMPUnrollDirective * D)8767 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8768   DeclarationNameInfo DirName;
8769   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8770                                              nullptr, D->getBeginLoc());
8771   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8772   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8773   return Res;
8774 }
8775 
8776 template <typename Derived>
8777 StmtResult
TransformOMPForDirective(OMPForDirective * D)8778 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8779   DeclarationNameInfo DirName;
8780   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8781                                              D->getBeginLoc());
8782   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8783   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8784   return Res;
8785 }
8786 
8787 template <typename Derived>
8788 StmtResult
TransformOMPForSimdDirective(OMPForSimdDirective * D)8789 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8790   DeclarationNameInfo DirName;
8791   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8792                                              D->getBeginLoc());
8793   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8794   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8795   return Res;
8796 }
8797 
8798 template <typename Derived>
8799 StmtResult
TransformOMPSectionsDirective(OMPSectionsDirective * D)8800 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8801   DeclarationNameInfo DirName;
8802   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8803                                              D->getBeginLoc());
8804   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8805   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8806   return Res;
8807 }
8808 
8809 template <typename Derived>
8810 StmtResult
TransformOMPSectionDirective(OMPSectionDirective * D)8811 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8812   DeclarationNameInfo DirName;
8813   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8814                                              D->getBeginLoc());
8815   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8816   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8817   return Res;
8818 }
8819 
8820 template <typename Derived>
8821 StmtResult
TransformOMPSingleDirective(OMPSingleDirective * D)8822 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8823   DeclarationNameInfo DirName;
8824   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8825                                              D->getBeginLoc());
8826   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8827   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8828   return Res;
8829 }
8830 
8831 template <typename Derived>
8832 StmtResult
TransformOMPMasterDirective(OMPMasterDirective * D)8833 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8834   DeclarationNameInfo DirName;
8835   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8836                                              D->getBeginLoc());
8837   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8838   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8839   return Res;
8840 }
8841 
8842 template <typename Derived>
8843 StmtResult
TransformOMPCriticalDirective(OMPCriticalDirective * D)8844 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8845   getDerived().getSema().StartOpenMPDSABlock(
8846       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8847   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8848   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8849   return Res;
8850 }
8851 
8852 template <typename Derived>
TransformOMPParallelForDirective(OMPParallelForDirective * D)8853 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8854     OMPParallelForDirective *D) {
8855   DeclarationNameInfo DirName;
8856   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8857                                              nullptr, D->getBeginLoc());
8858   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8859   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8860   return Res;
8861 }
8862 
8863 template <typename Derived>
TransformOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)8864 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8865     OMPParallelForSimdDirective *D) {
8866   DeclarationNameInfo DirName;
8867   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8868                                              nullptr, D->getBeginLoc());
8869   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8870   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8871   return Res;
8872 }
8873 
8874 template <typename Derived>
TransformOMPParallelMasterDirective(OMPParallelMasterDirective * D)8875 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8876     OMPParallelMasterDirective *D) {
8877   DeclarationNameInfo DirName;
8878   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8879                                              nullptr, D->getBeginLoc());
8880   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8881   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8882   return Res;
8883 }
8884 
8885 template <typename Derived>
TransformOMPParallelMaskedDirective(OMPParallelMaskedDirective * D)8886 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective(
8887     OMPParallelMaskedDirective *D) {
8888   DeclarationNameInfo DirName;
8889   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName,
8890                                              nullptr, D->getBeginLoc());
8891   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8892   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8893   return Res;
8894 }
8895 
8896 template <typename Derived>
TransformOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)8897 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8898     OMPParallelSectionsDirective *D) {
8899   DeclarationNameInfo DirName;
8900   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8901                                              nullptr, D->getBeginLoc());
8902   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8903   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8904   return Res;
8905 }
8906 
8907 template <typename Derived>
8908 StmtResult
TransformOMPTaskDirective(OMPTaskDirective * D)8909 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8910   DeclarationNameInfo DirName;
8911   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8912                                              D->getBeginLoc());
8913   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8914   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8915   return Res;
8916 }
8917 
8918 template <typename Derived>
TransformOMPTaskyieldDirective(OMPTaskyieldDirective * D)8919 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8920     OMPTaskyieldDirective *D) {
8921   DeclarationNameInfo DirName;
8922   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8923                                              D->getBeginLoc());
8924   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8925   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8926   return Res;
8927 }
8928 
8929 template <typename Derived>
8930 StmtResult
TransformOMPBarrierDirective(OMPBarrierDirective * D)8931 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8932   DeclarationNameInfo DirName;
8933   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8934                                              D->getBeginLoc());
8935   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8936   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8937   return Res;
8938 }
8939 
8940 template <typename Derived>
8941 StmtResult
TransformOMPTaskwaitDirective(OMPTaskwaitDirective * D)8942 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8943   DeclarationNameInfo DirName;
8944   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8945                                              D->getBeginLoc());
8946   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8947   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8948   return Res;
8949 }
8950 
8951 template <typename Derived>
8952 StmtResult
TransformOMPErrorDirective(OMPErrorDirective * D)8953 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) {
8954   DeclarationNameInfo DirName;
8955   getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr,
8956                                              D->getBeginLoc());
8957   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8958   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8959   return Res;
8960 }
8961 
8962 template <typename Derived>
TransformOMPTaskgroupDirective(OMPTaskgroupDirective * D)8963 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8964     OMPTaskgroupDirective *D) {
8965   DeclarationNameInfo DirName;
8966   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8967                                              D->getBeginLoc());
8968   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8969   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8970   return Res;
8971 }
8972 
8973 template <typename Derived>
8974 StmtResult
TransformOMPFlushDirective(OMPFlushDirective * D)8975 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8976   DeclarationNameInfo DirName;
8977   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8978                                              D->getBeginLoc());
8979   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8980   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8981   return Res;
8982 }
8983 
8984 template <typename Derived>
8985 StmtResult
TransformOMPDepobjDirective(OMPDepobjDirective * D)8986 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8987   DeclarationNameInfo DirName;
8988   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8989                                              D->getBeginLoc());
8990   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8991   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8992   return Res;
8993 }
8994 
8995 template <typename Derived>
8996 StmtResult
TransformOMPScanDirective(OMPScanDirective * D)8997 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8998   DeclarationNameInfo DirName;
8999   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
9000                                              D->getBeginLoc());
9001   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9002   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9003   return Res;
9004 }
9005 
9006 template <typename Derived>
9007 StmtResult
TransformOMPOrderedDirective(OMPOrderedDirective * D)9008 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
9009   DeclarationNameInfo DirName;
9010   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
9011                                              D->getBeginLoc());
9012   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9013   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9014   return Res;
9015 }
9016 
9017 template <typename Derived>
9018 StmtResult
TransformOMPAtomicDirective(OMPAtomicDirective * D)9019 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
9020   DeclarationNameInfo DirName;
9021   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
9022                                              D->getBeginLoc());
9023   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9024   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9025   return Res;
9026 }
9027 
9028 template <typename Derived>
9029 StmtResult
TransformOMPTargetDirective(OMPTargetDirective * D)9030 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
9031   DeclarationNameInfo DirName;
9032   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
9033                                              D->getBeginLoc());
9034   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9035   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9036   return Res;
9037 }
9038 
9039 template <typename Derived>
TransformOMPTargetDataDirective(OMPTargetDataDirective * D)9040 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
9041     OMPTargetDataDirective *D) {
9042   DeclarationNameInfo DirName;
9043   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
9044                                              D->getBeginLoc());
9045   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9046   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9047   return Res;
9048 }
9049 
9050 template <typename Derived>
TransformOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * D)9051 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
9052     OMPTargetEnterDataDirective *D) {
9053   DeclarationNameInfo DirName;
9054   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
9055                                              nullptr, D->getBeginLoc());
9056   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9057   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9058   return Res;
9059 }
9060 
9061 template <typename Derived>
TransformOMPTargetExitDataDirective(OMPTargetExitDataDirective * D)9062 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
9063     OMPTargetExitDataDirective *D) {
9064   DeclarationNameInfo DirName;
9065   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
9066                                              nullptr, D->getBeginLoc());
9067   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9068   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9069   return Res;
9070 }
9071 
9072 template <typename Derived>
TransformOMPTargetParallelDirective(OMPTargetParallelDirective * D)9073 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
9074     OMPTargetParallelDirective *D) {
9075   DeclarationNameInfo DirName;
9076   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
9077                                              nullptr, D->getBeginLoc());
9078   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9079   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9080   return Res;
9081 }
9082 
9083 template <typename Derived>
TransformOMPTargetParallelForDirective(OMPTargetParallelForDirective * D)9084 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
9085     OMPTargetParallelForDirective *D) {
9086   DeclarationNameInfo DirName;
9087   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
9088                                              nullptr, D->getBeginLoc());
9089   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9090   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9091   return Res;
9092 }
9093 
9094 template <typename Derived>
TransformOMPTargetUpdateDirective(OMPTargetUpdateDirective * D)9095 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
9096     OMPTargetUpdateDirective *D) {
9097   DeclarationNameInfo DirName;
9098   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
9099                                              nullptr, D->getBeginLoc());
9100   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9101   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9102   return Res;
9103 }
9104 
9105 template <typename Derived>
9106 StmtResult
TransformOMPTeamsDirective(OMPTeamsDirective * D)9107 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
9108   DeclarationNameInfo DirName;
9109   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
9110                                              D->getBeginLoc());
9111   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9112   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9113   return Res;
9114 }
9115 
9116 template <typename Derived>
TransformOMPCancellationPointDirective(OMPCancellationPointDirective * D)9117 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
9118     OMPCancellationPointDirective *D) {
9119   DeclarationNameInfo DirName;
9120   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
9121                                              nullptr, D->getBeginLoc());
9122   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9123   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9124   return Res;
9125 }
9126 
9127 template <typename Derived>
9128 StmtResult
TransformOMPCancelDirective(OMPCancelDirective * D)9129 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
9130   DeclarationNameInfo DirName;
9131   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, 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
TransformOMPTaskLoopDirective(OMPTaskLoopDirective * D)9140 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
9141   DeclarationNameInfo DirName;
9142   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
9143                                              D->getBeginLoc());
9144   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9145   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9146   return Res;
9147 }
9148 
9149 template <typename Derived>
TransformOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * D)9150 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
9151     OMPTaskLoopSimdDirective *D) {
9152   DeclarationNameInfo DirName;
9153   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
9154                                              nullptr, D->getBeginLoc());
9155   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9156   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9157   return Res;
9158 }
9159 
9160 template <typename Derived>
TransformOMPMasterTaskLoopDirective(OMPMasterTaskLoopDirective * D)9161 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9162     OMPMasterTaskLoopDirective *D) {
9163   DeclarationNameInfo DirName;
9164   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
9165                                              nullptr, D->getBeginLoc());
9166   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9167   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9168   return Res;
9169 }
9170 
9171 template <typename Derived>
TransformOMPMaskedTaskLoopDirective(OMPMaskedTaskLoopDirective * D)9172 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective(
9173     OMPMaskedTaskLoopDirective *D) {
9174   DeclarationNameInfo DirName;
9175   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName,
9176                                              nullptr, D->getBeginLoc());
9177   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9178   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9179   return Res;
9180 }
9181 
9182 template <typename Derived>
TransformOMPMasterTaskLoopSimdDirective(OMPMasterTaskLoopSimdDirective * D)9183 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9184     OMPMasterTaskLoopSimdDirective *D) {
9185   DeclarationNameInfo DirName;
9186   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9187                                              nullptr, D->getBeginLoc());
9188   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9189   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9190   return Res;
9191 }
9192 
9193 template <typename Derived>
TransformOMPMaskedTaskLoopSimdDirective(OMPMaskedTaskLoopSimdDirective * D)9194 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective(
9195     OMPMaskedTaskLoopSimdDirective *D) {
9196   DeclarationNameInfo DirName;
9197   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName,
9198                                              nullptr, D->getBeginLoc());
9199   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9200   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9201   return Res;
9202 }
9203 
9204 template <typename Derived>
TransformOMPParallelMasterTaskLoopDirective(OMPParallelMasterTaskLoopDirective * D)9205 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9206     OMPParallelMasterTaskLoopDirective *D) {
9207   DeclarationNameInfo DirName;
9208   getDerived().getSema().StartOpenMPDSABlock(
9209       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9210   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9211   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9212   return Res;
9213 }
9214 
9215 template <typename Derived>
TransformOMPParallelMaskedTaskLoopDirective(OMPParallelMaskedTaskLoopDirective * D)9216 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective(
9217     OMPParallelMaskedTaskLoopDirective *D) {
9218   DeclarationNameInfo DirName;
9219   getDerived().getSema().StartOpenMPDSABlock(
9220       OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc());
9221   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9222   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9223   return Res;
9224 }
9225 
9226 template <typename Derived>
9227 StmtResult
TransformOMPParallelMasterTaskLoopSimdDirective(OMPParallelMasterTaskLoopSimdDirective * D)9228 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9229     OMPParallelMasterTaskLoopSimdDirective *D) {
9230   DeclarationNameInfo DirName;
9231   getDerived().getSema().StartOpenMPDSABlock(
9232       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9233   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9234   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9235   return Res;
9236 }
9237 
9238 template <typename Derived>
9239 StmtResult
TransformOMPParallelMaskedTaskLoopSimdDirective(OMPParallelMaskedTaskLoopSimdDirective * D)9240 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective(
9241     OMPParallelMaskedTaskLoopSimdDirective *D) {
9242   DeclarationNameInfo DirName;
9243   getDerived().getSema().StartOpenMPDSABlock(
9244       OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9245   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9246   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9247   return Res;
9248 }
9249 
9250 template <typename Derived>
TransformOMPDistributeDirective(OMPDistributeDirective * D)9251 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9252     OMPDistributeDirective *D) {
9253   DeclarationNameInfo DirName;
9254   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9255                                              D->getBeginLoc());
9256   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9257   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9258   return Res;
9259 }
9260 
9261 template <typename Derived>
TransformOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * D)9262 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9263     OMPDistributeParallelForDirective *D) {
9264   DeclarationNameInfo DirName;
9265   getDerived().getSema().StartOpenMPDSABlock(
9266       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9267   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9268   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9269   return Res;
9270 }
9271 
9272 template <typename Derived>
9273 StmtResult
TransformOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * D)9274 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9275     OMPDistributeParallelForSimdDirective *D) {
9276   DeclarationNameInfo DirName;
9277   getDerived().getSema().StartOpenMPDSABlock(
9278       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9279   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9280   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9281   return Res;
9282 }
9283 
9284 template <typename Derived>
TransformOMPDistributeSimdDirective(OMPDistributeSimdDirective * D)9285 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9286     OMPDistributeSimdDirective *D) {
9287   DeclarationNameInfo DirName;
9288   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9289                                              nullptr, D->getBeginLoc());
9290   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9291   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9292   return Res;
9293 }
9294 
9295 template <typename Derived>
TransformOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * D)9296 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9297     OMPTargetParallelForSimdDirective *D) {
9298   DeclarationNameInfo DirName;
9299   getDerived().getSema().StartOpenMPDSABlock(
9300       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9301   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9302   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9303   return Res;
9304 }
9305 
9306 template <typename Derived>
TransformOMPTargetSimdDirective(OMPTargetSimdDirective * D)9307 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9308     OMPTargetSimdDirective *D) {
9309   DeclarationNameInfo DirName;
9310   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9311                                              D->getBeginLoc());
9312   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9313   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9314   return Res;
9315 }
9316 
9317 template <typename Derived>
TransformOMPTeamsDistributeDirective(OMPTeamsDistributeDirective * D)9318 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9319     OMPTeamsDistributeDirective *D) {
9320   DeclarationNameInfo DirName;
9321   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9322                                              nullptr, D->getBeginLoc());
9323   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9324   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9325   return Res;
9326 }
9327 
9328 template <typename Derived>
TransformOMPTeamsDistributeSimdDirective(OMPTeamsDistributeSimdDirective * D)9329 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9330     OMPTeamsDistributeSimdDirective *D) {
9331   DeclarationNameInfo DirName;
9332   getDerived().getSema().StartOpenMPDSABlock(
9333       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9334   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9335   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9336   return Res;
9337 }
9338 
9339 template <typename Derived>
TransformOMPTeamsDistributeParallelForSimdDirective(OMPTeamsDistributeParallelForSimdDirective * D)9340 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9341     OMPTeamsDistributeParallelForSimdDirective *D) {
9342   DeclarationNameInfo DirName;
9343   getDerived().getSema().StartOpenMPDSABlock(
9344       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9345       D->getBeginLoc());
9346   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9347   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9348   return Res;
9349 }
9350 
9351 template <typename Derived>
TransformOMPTeamsDistributeParallelForDirective(OMPTeamsDistributeParallelForDirective * D)9352 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9353     OMPTeamsDistributeParallelForDirective *D) {
9354   DeclarationNameInfo DirName;
9355   getDerived().getSema().StartOpenMPDSABlock(
9356       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9357   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9358   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9359   return Res;
9360 }
9361 
9362 template <typename Derived>
TransformOMPTargetTeamsDirective(OMPTargetTeamsDirective * D)9363 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9364     OMPTargetTeamsDirective *D) {
9365   DeclarationNameInfo DirName;
9366   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9367                                              nullptr, D->getBeginLoc());
9368   auto Res = getDerived().TransformOMPExecutableDirective(D);
9369   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9370   return Res;
9371 }
9372 
9373 template <typename Derived>
TransformOMPTargetTeamsDistributeDirective(OMPTargetTeamsDistributeDirective * D)9374 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9375     OMPTargetTeamsDistributeDirective *D) {
9376   DeclarationNameInfo DirName;
9377   getDerived().getSema().StartOpenMPDSABlock(
9378       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9379   auto Res = getDerived().TransformOMPExecutableDirective(D);
9380   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9381   return Res;
9382 }
9383 
9384 template <typename Derived>
9385 StmtResult
TransformOMPTargetTeamsDistributeParallelForDirective(OMPTargetTeamsDistributeParallelForDirective * D)9386 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9387     OMPTargetTeamsDistributeParallelForDirective *D) {
9388   DeclarationNameInfo DirName;
9389   getDerived().getSema().StartOpenMPDSABlock(
9390       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9391       D->getBeginLoc());
9392   auto Res = getDerived().TransformOMPExecutableDirective(D);
9393   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9394   return Res;
9395 }
9396 
9397 template <typename Derived>
9398 StmtResult TreeTransform<Derived>::
TransformOMPTargetTeamsDistributeParallelForSimdDirective(OMPTargetTeamsDistributeParallelForSimdDirective * D)9399     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9400         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9401   DeclarationNameInfo DirName;
9402   getDerived().getSema().StartOpenMPDSABlock(
9403       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9404       D->getBeginLoc());
9405   auto Res = getDerived().TransformOMPExecutableDirective(D);
9406   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9407   return Res;
9408 }
9409 
9410 template <typename Derived>
9411 StmtResult
TransformOMPTargetTeamsDistributeSimdDirective(OMPTargetTeamsDistributeSimdDirective * D)9412 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9413     OMPTargetTeamsDistributeSimdDirective *D) {
9414   DeclarationNameInfo DirName;
9415   getDerived().getSema().StartOpenMPDSABlock(
9416       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9417   auto Res = getDerived().TransformOMPExecutableDirective(D);
9418   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9419   return Res;
9420 }
9421 
9422 template <typename Derived>
9423 StmtResult
TransformOMPInteropDirective(OMPInteropDirective * D)9424 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9425   DeclarationNameInfo DirName;
9426   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9427                                              D->getBeginLoc());
9428   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9429   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9430   return Res;
9431 }
9432 
9433 template <typename Derived>
9434 StmtResult
TransformOMPDispatchDirective(OMPDispatchDirective * D)9435 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9436   DeclarationNameInfo DirName;
9437   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9438                                              D->getBeginLoc());
9439   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9440   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9441   return Res;
9442 }
9443 
9444 template <typename Derived>
9445 StmtResult
TransformOMPMaskedDirective(OMPMaskedDirective * D)9446 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9447   DeclarationNameInfo DirName;
9448   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9449                                              D->getBeginLoc());
9450   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9451   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9452   return Res;
9453 }
9454 
9455 template <typename Derived>
TransformOMPGenericLoopDirective(OMPGenericLoopDirective * D)9456 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9457     OMPGenericLoopDirective *D) {
9458   DeclarationNameInfo DirName;
9459   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9460                                              D->getBeginLoc());
9461   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9462   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9463   return Res;
9464 }
9465 
9466 template <typename Derived>
TransformOMPTeamsGenericLoopDirective(OMPTeamsGenericLoopDirective * D)9467 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
9468     OMPTeamsGenericLoopDirective *D) {
9469   DeclarationNameInfo DirName;
9470   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr,
9471                                              D->getBeginLoc());
9472   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9473   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9474   return Res;
9475 }
9476 
9477 template <typename Derived>
TransformOMPTargetTeamsGenericLoopDirective(OMPTargetTeamsGenericLoopDirective * D)9478 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
9479     OMPTargetTeamsGenericLoopDirective *D) {
9480   DeclarationNameInfo DirName;
9481   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName,
9482                                              nullptr, D->getBeginLoc());
9483   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9484   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9485   return Res;
9486 }
9487 
9488 template <typename Derived>
TransformOMPParallelGenericLoopDirective(OMPParallelGenericLoopDirective * D)9489 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
9490     OMPParallelGenericLoopDirective *D) {
9491   DeclarationNameInfo DirName;
9492   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName,
9493                                              nullptr, D->getBeginLoc());
9494   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9495   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9496   return Res;
9497 }
9498 
9499 template <typename Derived>
9500 StmtResult
TransformOMPTargetParallelGenericLoopDirective(OMPTargetParallelGenericLoopDirective * D)9501 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
9502     OMPTargetParallelGenericLoopDirective *D) {
9503   DeclarationNameInfo DirName;
9504   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName,
9505                                              nullptr, D->getBeginLoc());
9506   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9507   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9508   return Res;
9509 }
9510 
9511 //===----------------------------------------------------------------------===//
9512 // OpenMP clause transformation
9513 //===----------------------------------------------------------------------===//
9514 template <typename Derived>
TransformOMPIfClause(OMPIfClause * C)9515 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9516   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9517   if (Cond.isInvalid())
9518     return nullptr;
9519   return getDerived().RebuildOMPIfClause(
9520       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9521       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9522 }
9523 
9524 template <typename Derived>
TransformOMPFinalClause(OMPFinalClause * C)9525 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9526   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9527   if (Cond.isInvalid())
9528     return nullptr;
9529   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9530                                             C->getLParenLoc(), C->getEndLoc());
9531 }
9532 
9533 template <typename Derived>
9534 OMPClause *
TransformOMPNumThreadsClause(OMPNumThreadsClause * C)9535 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9536   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9537   if (NumThreads.isInvalid())
9538     return nullptr;
9539   return getDerived().RebuildOMPNumThreadsClause(
9540       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9541 }
9542 
9543 template <typename Derived>
9544 OMPClause *
TransformOMPSafelenClause(OMPSafelenClause * C)9545 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9546   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9547   if (E.isInvalid())
9548     return nullptr;
9549   return getDerived().RebuildOMPSafelenClause(
9550       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9551 }
9552 
9553 template <typename Derived>
9554 OMPClause *
TransformOMPAllocatorClause(OMPAllocatorClause * C)9555 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9556   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9557   if (E.isInvalid())
9558     return nullptr;
9559   return getDerived().RebuildOMPAllocatorClause(
9560       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9561 }
9562 
9563 template <typename Derived>
9564 OMPClause *
TransformOMPSimdlenClause(OMPSimdlenClause * C)9565 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9566   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9567   if (E.isInvalid())
9568     return nullptr;
9569   return getDerived().RebuildOMPSimdlenClause(
9570       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9571 }
9572 
9573 template <typename Derived>
TransformOMPSizesClause(OMPSizesClause * C)9574 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9575   SmallVector<Expr *, 4> TransformedSizes;
9576   TransformedSizes.reserve(C->getNumSizes());
9577   bool Changed = false;
9578   for (Expr *E : C->getSizesRefs()) {
9579     if (!E) {
9580       TransformedSizes.push_back(nullptr);
9581       continue;
9582     }
9583 
9584     ExprResult T = getDerived().TransformExpr(E);
9585     if (T.isInvalid())
9586       return nullptr;
9587     if (E != T.get())
9588       Changed = true;
9589     TransformedSizes.push_back(T.get());
9590   }
9591 
9592   if (!Changed && !getDerived().AlwaysRebuild())
9593     return C;
9594   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9595                                C->getLParenLoc(), C->getEndLoc());
9596 }
9597 
9598 template <typename Derived>
TransformOMPFullClause(OMPFullClause * C)9599 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9600   if (!getDerived().AlwaysRebuild())
9601     return C;
9602   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9603 }
9604 
9605 template <typename Derived>
9606 OMPClause *
TransformOMPPartialClause(OMPPartialClause * C)9607 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9608   ExprResult T = getDerived().TransformExpr(C->getFactor());
9609   if (T.isInvalid())
9610     return nullptr;
9611   Expr *Factor = T.get();
9612   bool Changed = Factor != C->getFactor();
9613 
9614   if (!Changed && !getDerived().AlwaysRebuild())
9615     return C;
9616   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9617                                  C->getEndLoc());
9618 }
9619 
9620 template <typename Derived>
9621 OMPClause *
TransformOMPCollapseClause(OMPCollapseClause * C)9622 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9623   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9624   if (E.isInvalid())
9625     return nullptr;
9626   return getDerived().RebuildOMPCollapseClause(
9627       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9628 }
9629 
9630 template <typename Derived>
9631 OMPClause *
TransformOMPDefaultClause(OMPDefaultClause * C)9632 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9633   return getDerived().RebuildOMPDefaultClause(
9634       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9635       C->getLParenLoc(), C->getEndLoc());
9636 }
9637 
9638 template <typename Derived>
9639 OMPClause *
TransformOMPProcBindClause(OMPProcBindClause * C)9640 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9641   return getDerived().RebuildOMPProcBindClause(
9642       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9643       C->getLParenLoc(), C->getEndLoc());
9644 }
9645 
9646 template <typename Derived>
9647 OMPClause *
TransformOMPScheduleClause(OMPScheduleClause * C)9648 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9649   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9650   if (E.isInvalid())
9651     return nullptr;
9652   return getDerived().RebuildOMPScheduleClause(
9653       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9654       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9655       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9656       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9657 }
9658 
9659 template <typename Derived>
9660 OMPClause *
TransformOMPOrderedClause(OMPOrderedClause * C)9661 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9662   ExprResult E;
9663   if (auto *Num = C->getNumForLoops()) {
9664     E = getDerived().TransformExpr(Num);
9665     if (E.isInvalid())
9666       return nullptr;
9667   }
9668   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9669                                               C->getLParenLoc(), E.get());
9670 }
9671 
9672 template <typename Derived>
9673 OMPClause *
TransformOMPDetachClause(OMPDetachClause * C)9674 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9675   ExprResult E;
9676   if (Expr *Evt = C->getEventHandler()) {
9677     E = getDerived().TransformExpr(Evt);
9678     if (E.isInvalid())
9679       return nullptr;
9680   }
9681   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9682                                              C->getLParenLoc(), C->getEndLoc());
9683 }
9684 
9685 template <typename Derived>
9686 OMPClause *
TransformOMPNowaitClause(OMPNowaitClause * C)9687 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9688   // No need to rebuild this clause, no template-dependent parameters.
9689   return C;
9690 }
9691 
9692 template <typename Derived>
9693 OMPClause *
TransformOMPUntiedClause(OMPUntiedClause * C)9694 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9695   // No need to rebuild this clause, no template-dependent parameters.
9696   return C;
9697 }
9698 
9699 template <typename Derived>
9700 OMPClause *
TransformOMPMergeableClause(OMPMergeableClause * C)9701 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9702   // No need to rebuild this clause, no template-dependent parameters.
9703   return C;
9704 }
9705 
9706 template <typename Derived>
TransformOMPReadClause(OMPReadClause * C)9707 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9708   // No need to rebuild this clause, no template-dependent parameters.
9709   return C;
9710 }
9711 
9712 template <typename Derived>
TransformOMPWriteClause(OMPWriteClause * C)9713 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9714   // No need to rebuild this clause, no template-dependent parameters.
9715   return C;
9716 }
9717 
9718 template <typename Derived>
9719 OMPClause *
TransformOMPUpdateClause(OMPUpdateClause * C)9720 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9721   // No need to rebuild this clause, no template-dependent parameters.
9722   return C;
9723 }
9724 
9725 template <typename Derived>
9726 OMPClause *
TransformOMPCaptureClause(OMPCaptureClause * C)9727 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9728   // No need to rebuild this clause, no template-dependent parameters.
9729   return C;
9730 }
9731 
9732 template <typename Derived>
9733 OMPClause *
TransformOMPCompareClause(OMPCompareClause * C)9734 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9735   // No need to rebuild this clause, no template-dependent parameters.
9736   return C;
9737 }
9738 
9739 template <typename Derived>
9740 OMPClause *
TransformOMPSeqCstClause(OMPSeqCstClause * C)9741 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9742   // No need to rebuild this clause, no template-dependent parameters.
9743   return C;
9744 }
9745 
9746 template <typename Derived>
9747 OMPClause *
TransformOMPAcqRelClause(OMPAcqRelClause * C)9748 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9749   // No need to rebuild this clause, no template-dependent parameters.
9750   return C;
9751 }
9752 
9753 template <typename Derived>
9754 OMPClause *
TransformOMPAcquireClause(OMPAcquireClause * C)9755 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9756   // No need to rebuild this clause, no template-dependent parameters.
9757   return C;
9758 }
9759 
9760 template <typename Derived>
9761 OMPClause *
TransformOMPReleaseClause(OMPReleaseClause * C)9762 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9763   // No need to rebuild this clause, no template-dependent parameters.
9764   return C;
9765 }
9766 
9767 template <typename Derived>
9768 OMPClause *
TransformOMPRelaxedClause(OMPRelaxedClause * C)9769 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9770   // No need to rebuild this clause, no template-dependent parameters.
9771   return C;
9772 }
9773 
9774 template <typename Derived>
9775 OMPClause *
TransformOMPThreadsClause(OMPThreadsClause * C)9776 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9777   // No need to rebuild this clause, no template-dependent parameters.
9778   return C;
9779 }
9780 
9781 template <typename Derived>
TransformOMPSIMDClause(OMPSIMDClause * C)9782 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9783   // No need to rebuild this clause, no template-dependent parameters.
9784   return C;
9785 }
9786 
9787 template <typename Derived>
9788 OMPClause *
TransformOMPNogroupClause(OMPNogroupClause * C)9789 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9790   // No need to rebuild this clause, no template-dependent parameters.
9791   return C;
9792 }
9793 
9794 template <typename Derived>
TransformOMPInitClause(OMPInitClause * C)9795 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9796   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9797   if (IVR.isInvalid())
9798     return nullptr;
9799 
9800   OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync());
9801   InteropInfo.PreferTypes.reserve(C->varlist_size() - 1);
9802   for (Expr *E : llvm::drop_begin(C->varlists())) {
9803     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9804     if (ER.isInvalid())
9805       return nullptr;
9806     InteropInfo.PreferTypes.push_back(ER.get());
9807   }
9808   return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo,
9809                                            C->getBeginLoc(), C->getLParenLoc(),
9810                                            C->getVarLoc(), C->getEndLoc());
9811 }
9812 
9813 template <typename Derived>
TransformOMPUseClause(OMPUseClause * C)9814 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9815   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9816   if (ER.isInvalid())
9817     return nullptr;
9818   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9819                                           C->getLParenLoc(), C->getVarLoc(),
9820                                           C->getEndLoc());
9821 }
9822 
9823 template <typename Derived>
9824 OMPClause *
TransformOMPDestroyClause(OMPDestroyClause * C)9825 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9826   ExprResult ER;
9827   if (Expr *IV = C->getInteropVar()) {
9828     ER = getDerived().TransformExpr(IV);
9829     if (ER.isInvalid())
9830       return nullptr;
9831   }
9832   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9833                                               C->getLParenLoc(), C->getVarLoc(),
9834                                               C->getEndLoc());
9835 }
9836 
9837 template <typename Derived>
9838 OMPClause *
TransformOMPNovariantsClause(OMPNovariantsClause * C)9839 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9840   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9841   if (Cond.isInvalid())
9842     return nullptr;
9843   return getDerived().RebuildOMPNovariantsClause(
9844       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9845 }
9846 
9847 template <typename Derived>
9848 OMPClause *
TransformOMPNocontextClause(OMPNocontextClause * C)9849 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9850   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9851   if (Cond.isInvalid())
9852     return nullptr;
9853   return getDerived().RebuildOMPNocontextClause(
9854       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9855 }
9856 
9857 template <typename Derived>
9858 OMPClause *
TransformOMPFilterClause(OMPFilterClause * C)9859 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9860   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9861   if (ThreadID.isInvalid())
9862     return nullptr;
9863   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9864                                              C->getLParenLoc(), C->getEndLoc());
9865 }
9866 
9867 template <typename Derived>
TransformOMPAlignClause(OMPAlignClause * C)9868 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9869   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9870   if (E.isInvalid())
9871     return nullptr;
9872   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9873                                             C->getLParenLoc(), C->getEndLoc());
9874 }
9875 
9876 template <typename Derived>
TransformOMPUnifiedAddressClause(OMPUnifiedAddressClause * C)9877 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9878     OMPUnifiedAddressClause *C) {
9879   llvm_unreachable("unified_address clause cannot appear in dependent context");
9880 }
9881 
9882 template <typename Derived>
TransformOMPUnifiedSharedMemoryClause(OMPUnifiedSharedMemoryClause * C)9883 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9884     OMPUnifiedSharedMemoryClause *C) {
9885   llvm_unreachable(
9886       "unified_shared_memory clause cannot appear in dependent context");
9887 }
9888 
9889 template <typename Derived>
TransformOMPReverseOffloadClause(OMPReverseOffloadClause * C)9890 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9891     OMPReverseOffloadClause *C) {
9892   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9893 }
9894 
9895 template <typename Derived>
TransformOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause * C)9896 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9897     OMPDynamicAllocatorsClause *C) {
9898   llvm_unreachable(
9899       "dynamic_allocators clause cannot appear in dependent context");
9900 }
9901 
9902 template <typename Derived>
TransformOMPAtomicDefaultMemOrderClause(OMPAtomicDefaultMemOrderClause * C)9903 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9904     OMPAtomicDefaultMemOrderClause *C) {
9905   llvm_unreachable(
9906       "atomic_default_mem_order clause cannot appear in dependent context");
9907 }
9908 
9909 template <typename Derived>
TransformOMPAtClause(OMPAtClause * C)9910 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) {
9911   return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(),
9912                                          C->getBeginLoc(), C->getLParenLoc(),
9913                                          C->getEndLoc());
9914 }
9915 
9916 template <typename Derived>
9917 OMPClause *
TransformOMPSeverityClause(OMPSeverityClause * C)9918 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) {
9919   return getDerived().RebuildOMPSeverityClause(
9920       C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(),
9921       C->getLParenLoc(), C->getEndLoc());
9922 }
9923 
9924 template <typename Derived>
9925 OMPClause *
TransformOMPMessageClause(OMPMessageClause * C)9926 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) {
9927   ExprResult E = getDerived().TransformExpr(C->getMessageString());
9928   if (E.isInvalid())
9929     return nullptr;
9930   return getDerived().RebuildOMPMessageClause(
9931       C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(),
9932       C->getEndLoc());
9933 }
9934 
9935 template <typename Derived>
9936 OMPClause *
TransformOMPPrivateClause(OMPPrivateClause * C)9937 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9938   llvm::SmallVector<Expr *, 16> Vars;
9939   Vars.reserve(C->varlist_size());
9940   for (auto *VE : C->varlists()) {
9941     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9942     if (EVar.isInvalid())
9943       return nullptr;
9944     Vars.push_back(EVar.get());
9945   }
9946   return getDerived().RebuildOMPPrivateClause(
9947       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9948 }
9949 
9950 template <typename Derived>
TransformOMPFirstprivateClause(OMPFirstprivateClause * C)9951 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9952     OMPFirstprivateClause *C) {
9953   llvm::SmallVector<Expr *, 16> Vars;
9954   Vars.reserve(C->varlist_size());
9955   for (auto *VE : C->varlists()) {
9956     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9957     if (EVar.isInvalid())
9958       return nullptr;
9959     Vars.push_back(EVar.get());
9960   }
9961   return getDerived().RebuildOMPFirstprivateClause(
9962       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9963 }
9964 
9965 template <typename Derived>
9966 OMPClause *
TransformOMPLastprivateClause(OMPLastprivateClause * C)9967 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9968   llvm::SmallVector<Expr *, 16> Vars;
9969   Vars.reserve(C->varlist_size());
9970   for (auto *VE : C->varlists()) {
9971     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9972     if (EVar.isInvalid())
9973       return nullptr;
9974     Vars.push_back(EVar.get());
9975   }
9976   return getDerived().RebuildOMPLastprivateClause(
9977       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9978       C->getLParenLoc(), C->getEndLoc());
9979 }
9980 
9981 template <typename Derived>
9982 OMPClause *
TransformOMPSharedClause(OMPSharedClause * C)9983 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9984   llvm::SmallVector<Expr *, 16> Vars;
9985   Vars.reserve(C->varlist_size());
9986   for (auto *VE : C->varlists()) {
9987     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9988     if (EVar.isInvalid())
9989       return nullptr;
9990     Vars.push_back(EVar.get());
9991   }
9992   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9993                                              C->getLParenLoc(), C->getEndLoc());
9994 }
9995 
9996 template <typename Derived>
9997 OMPClause *
TransformOMPReductionClause(OMPReductionClause * C)9998 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9999   llvm::SmallVector<Expr *, 16> Vars;
10000   Vars.reserve(C->varlist_size());
10001   for (auto *VE : C->varlists()) {
10002     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10003     if (EVar.isInvalid())
10004       return nullptr;
10005     Vars.push_back(EVar.get());
10006   }
10007   CXXScopeSpec ReductionIdScopeSpec;
10008   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10009 
10010   DeclarationNameInfo NameInfo = C->getNameInfo();
10011   if (NameInfo.getName()) {
10012     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10013     if (!NameInfo.getName())
10014       return nullptr;
10015   }
10016   // Build a list of all UDR decls with the same names ranged by the Scopes.
10017   // The Scope boundary is a duplication of the previous decl.
10018   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10019   for (auto *E : C->reduction_ops()) {
10020     // Transform all the decls.
10021     if (E) {
10022       auto *ULE = cast<UnresolvedLookupExpr>(E);
10023       UnresolvedSet<8> Decls;
10024       for (auto *D : ULE->decls()) {
10025         NamedDecl *InstD =
10026             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10027         Decls.addDecl(InstD, InstD->getAccess());
10028       }
10029       UnresolvedReductions.push_back(
10030        UnresolvedLookupExpr::Create(
10031           SemaRef.Context, /*NamingClass=*/nullptr,
10032           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
10033           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
10034           Decls.begin(), Decls.end()));
10035     } else
10036       UnresolvedReductions.push_back(nullptr);
10037   }
10038   return getDerived().RebuildOMPReductionClause(
10039       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
10040       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
10041       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10042 }
10043 
10044 template <typename Derived>
TransformOMPTaskReductionClause(OMPTaskReductionClause * C)10045 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
10046     OMPTaskReductionClause *C) {
10047   llvm::SmallVector<Expr *, 16> Vars;
10048   Vars.reserve(C->varlist_size());
10049   for (auto *VE : C->varlists()) {
10050     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10051     if (EVar.isInvalid())
10052       return nullptr;
10053     Vars.push_back(EVar.get());
10054   }
10055   CXXScopeSpec ReductionIdScopeSpec;
10056   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10057 
10058   DeclarationNameInfo NameInfo = C->getNameInfo();
10059   if (NameInfo.getName()) {
10060     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10061     if (!NameInfo.getName())
10062       return nullptr;
10063   }
10064   // Build a list of all UDR decls with the same names ranged by the Scopes.
10065   // The Scope boundary is a duplication of the previous decl.
10066   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10067   for (auto *E : C->reduction_ops()) {
10068     // Transform all the decls.
10069     if (E) {
10070       auto *ULE = cast<UnresolvedLookupExpr>(E);
10071       UnresolvedSet<8> Decls;
10072       for (auto *D : ULE->decls()) {
10073         NamedDecl *InstD =
10074             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10075         Decls.addDecl(InstD, InstD->getAccess());
10076       }
10077       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10078           SemaRef.Context, /*NamingClass=*/nullptr,
10079           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10080           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10081     } else
10082       UnresolvedReductions.push_back(nullptr);
10083   }
10084   return getDerived().RebuildOMPTaskReductionClause(
10085       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10086       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10087 }
10088 
10089 template <typename Derived>
10090 OMPClause *
TransformOMPInReductionClause(OMPInReductionClause * C)10091 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
10092   llvm::SmallVector<Expr *, 16> Vars;
10093   Vars.reserve(C->varlist_size());
10094   for (auto *VE : C->varlists()) {
10095     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10096     if (EVar.isInvalid())
10097       return nullptr;
10098     Vars.push_back(EVar.get());
10099   }
10100   CXXScopeSpec ReductionIdScopeSpec;
10101   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10102 
10103   DeclarationNameInfo NameInfo = C->getNameInfo();
10104   if (NameInfo.getName()) {
10105     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10106     if (!NameInfo.getName())
10107       return nullptr;
10108   }
10109   // Build a list of all UDR decls with the same names ranged by the Scopes.
10110   // The Scope boundary is a duplication of the previous decl.
10111   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10112   for (auto *E : C->reduction_ops()) {
10113     // Transform all the decls.
10114     if (E) {
10115       auto *ULE = cast<UnresolvedLookupExpr>(E);
10116       UnresolvedSet<8> Decls;
10117       for (auto *D : ULE->decls()) {
10118         NamedDecl *InstD =
10119             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10120         Decls.addDecl(InstD, InstD->getAccess());
10121       }
10122       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10123           SemaRef.Context, /*NamingClass=*/nullptr,
10124           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10125           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10126     } else
10127       UnresolvedReductions.push_back(nullptr);
10128   }
10129   return getDerived().RebuildOMPInReductionClause(
10130       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10131       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10132 }
10133 
10134 template <typename Derived>
10135 OMPClause *
TransformOMPLinearClause(OMPLinearClause * C)10136 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
10137   llvm::SmallVector<Expr *, 16> Vars;
10138   Vars.reserve(C->varlist_size());
10139   for (auto *VE : C->varlists()) {
10140     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10141     if (EVar.isInvalid())
10142       return nullptr;
10143     Vars.push_back(EVar.get());
10144   }
10145   ExprResult Step = getDerived().TransformExpr(C->getStep());
10146   if (Step.isInvalid())
10147     return nullptr;
10148   return getDerived().RebuildOMPLinearClause(
10149       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
10150       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
10151 }
10152 
10153 template <typename Derived>
10154 OMPClause *
TransformOMPAlignedClause(OMPAlignedClause * C)10155 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
10156   llvm::SmallVector<Expr *, 16> Vars;
10157   Vars.reserve(C->varlist_size());
10158   for (auto *VE : C->varlists()) {
10159     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10160     if (EVar.isInvalid())
10161       return nullptr;
10162     Vars.push_back(EVar.get());
10163   }
10164   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
10165   if (Alignment.isInvalid())
10166     return nullptr;
10167   return getDerived().RebuildOMPAlignedClause(
10168       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
10169       C->getColonLoc(), C->getEndLoc());
10170 }
10171 
10172 template <typename Derived>
10173 OMPClause *
TransformOMPCopyinClause(OMPCopyinClause * C)10174 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
10175   llvm::SmallVector<Expr *, 16> Vars;
10176   Vars.reserve(C->varlist_size());
10177   for (auto *VE : C->varlists()) {
10178     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10179     if (EVar.isInvalid())
10180       return nullptr;
10181     Vars.push_back(EVar.get());
10182   }
10183   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
10184                                              C->getLParenLoc(), C->getEndLoc());
10185 }
10186 
10187 template <typename Derived>
10188 OMPClause *
TransformOMPCopyprivateClause(OMPCopyprivateClause * C)10189 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
10190   llvm::SmallVector<Expr *, 16> Vars;
10191   Vars.reserve(C->varlist_size());
10192   for (auto *VE : C->varlists()) {
10193     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10194     if (EVar.isInvalid())
10195       return nullptr;
10196     Vars.push_back(EVar.get());
10197   }
10198   return getDerived().RebuildOMPCopyprivateClause(
10199       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10200 }
10201 
10202 template <typename Derived>
TransformOMPFlushClause(OMPFlushClause * C)10203 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
10204   llvm::SmallVector<Expr *, 16> Vars;
10205   Vars.reserve(C->varlist_size());
10206   for (auto *VE : C->varlists()) {
10207     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10208     if (EVar.isInvalid())
10209       return nullptr;
10210     Vars.push_back(EVar.get());
10211   }
10212   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
10213                                             C->getLParenLoc(), C->getEndLoc());
10214 }
10215 
10216 template <typename Derived>
10217 OMPClause *
TransformOMPDepobjClause(OMPDepobjClause * C)10218 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
10219   ExprResult E = getDerived().TransformExpr(C->getDepobj());
10220   if (E.isInvalid())
10221     return nullptr;
10222   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
10223                                              C->getLParenLoc(), C->getEndLoc());
10224 }
10225 
10226 template <typename Derived>
10227 OMPClause *
TransformOMPDependClause(OMPDependClause * C)10228 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
10229   llvm::SmallVector<Expr *, 16> Vars;
10230   Expr *DepModifier = C->getModifier();
10231   if (DepModifier) {
10232     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
10233     if (DepModRes.isInvalid())
10234       return nullptr;
10235     DepModifier = DepModRes.get();
10236   }
10237   Vars.reserve(C->varlist_size());
10238   for (auto *VE : C->varlists()) {
10239     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10240     if (EVar.isInvalid())
10241       return nullptr;
10242     Vars.push_back(EVar.get());
10243   }
10244   return getDerived().RebuildOMPDependClause(
10245       {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(),
10246        C->getOmpAllMemoryLoc()},
10247       DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10248 }
10249 
10250 template <typename Derived>
10251 OMPClause *
TransformOMPDeviceClause(OMPDeviceClause * C)10252 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
10253   ExprResult E = getDerived().TransformExpr(C->getDevice());
10254   if (E.isInvalid())
10255     return nullptr;
10256   return getDerived().RebuildOMPDeviceClause(
10257       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10258       C->getModifierLoc(), C->getEndLoc());
10259 }
10260 
10261 template <typename Derived, class T>
transformOMPMappableExprListClause(TreeTransform<Derived> & TT,OMPMappableExprListClause<T> * C,llvm::SmallVectorImpl<Expr * > & Vars,CXXScopeSpec & MapperIdScopeSpec,DeclarationNameInfo & MapperIdInfo,llvm::SmallVectorImpl<Expr * > & UnresolvedMappers)10262 bool transformOMPMappableExprListClause(
10263     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
10264     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
10265     DeclarationNameInfo &MapperIdInfo,
10266     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
10267   // Transform expressions in the list.
10268   Vars.reserve(C->varlist_size());
10269   for (auto *VE : C->varlists()) {
10270     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
10271     if (EVar.isInvalid())
10272       return true;
10273     Vars.push_back(EVar.get());
10274   }
10275   // Transform mapper scope specifier and identifier.
10276   NestedNameSpecifierLoc QualifierLoc;
10277   if (C->getMapperQualifierLoc()) {
10278     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
10279         C->getMapperQualifierLoc());
10280     if (!QualifierLoc)
10281       return true;
10282   }
10283   MapperIdScopeSpec.Adopt(QualifierLoc);
10284   MapperIdInfo = C->getMapperIdInfo();
10285   if (MapperIdInfo.getName()) {
10286     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10287     if (!MapperIdInfo.getName())
10288       return true;
10289   }
10290   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10291   // the previous user-defined mapper lookup in dependent environment.
10292   for (auto *E : C->mapperlists()) {
10293     // Transform all the decls.
10294     if (E) {
10295       auto *ULE = cast<UnresolvedLookupExpr>(E);
10296       UnresolvedSet<8> Decls;
10297       for (auto *D : ULE->decls()) {
10298         NamedDecl *InstD =
10299             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10300         Decls.addDecl(InstD, InstD->getAccess());
10301       }
10302       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10303           TT.getSema().Context, /*NamingClass=*/nullptr,
10304           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10305           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10306           Decls.end()));
10307     } else {
10308       UnresolvedMappers.push_back(nullptr);
10309     }
10310   }
10311   return false;
10312 }
10313 
10314 template <typename Derived>
TransformOMPMapClause(OMPMapClause * C)10315 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10316   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10317   llvm::SmallVector<Expr *, 16> Vars;
10318   Expr *IteratorModifier = C->getIteratorModifier();
10319   if (IteratorModifier) {
10320     ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier);
10321     if (MapModRes.isInvalid())
10322       return nullptr;
10323     IteratorModifier = MapModRes.get();
10324   }
10325   CXXScopeSpec MapperIdScopeSpec;
10326   DeclarationNameInfo MapperIdInfo;
10327   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10328   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10329           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10330     return nullptr;
10331   return getDerived().RebuildOMPMapClause(
10332       IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(),
10333       MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(),
10334       C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10335 }
10336 
10337 template <typename Derived>
10338 OMPClause *
TransformOMPAllocateClause(OMPAllocateClause * C)10339 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10340   Expr *Allocator = C->getAllocator();
10341   if (Allocator) {
10342     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10343     if (AllocatorRes.isInvalid())
10344       return nullptr;
10345     Allocator = AllocatorRes.get();
10346   }
10347   llvm::SmallVector<Expr *, 16> Vars;
10348   Vars.reserve(C->varlist_size());
10349   for (auto *VE : C->varlists()) {
10350     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10351     if (EVar.isInvalid())
10352       return nullptr;
10353     Vars.push_back(EVar.get());
10354   }
10355   return getDerived().RebuildOMPAllocateClause(
10356       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10357       C->getEndLoc());
10358 }
10359 
10360 template <typename Derived>
10361 OMPClause *
TransformOMPNumTeamsClause(OMPNumTeamsClause * C)10362 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10363   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10364   if (E.isInvalid())
10365     return nullptr;
10366   return getDerived().RebuildOMPNumTeamsClause(
10367       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10368 }
10369 
10370 template <typename Derived>
10371 OMPClause *
TransformOMPThreadLimitClause(OMPThreadLimitClause * C)10372 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10373   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10374   if (E.isInvalid())
10375     return nullptr;
10376   return getDerived().RebuildOMPThreadLimitClause(
10377       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10378 }
10379 
10380 template <typename Derived>
10381 OMPClause *
TransformOMPPriorityClause(OMPPriorityClause * C)10382 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10383   ExprResult E = getDerived().TransformExpr(C->getPriority());
10384   if (E.isInvalid())
10385     return nullptr;
10386   return getDerived().RebuildOMPPriorityClause(
10387       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10388 }
10389 
10390 template <typename Derived>
10391 OMPClause *
TransformOMPGrainsizeClause(OMPGrainsizeClause * C)10392 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10393   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10394   if (E.isInvalid())
10395     return nullptr;
10396   return getDerived().RebuildOMPGrainsizeClause(
10397       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10398       C->getModifierLoc(), C->getEndLoc());
10399 }
10400 
10401 template <typename Derived>
10402 OMPClause *
TransformOMPNumTasksClause(OMPNumTasksClause * C)10403 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10404   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10405   if (E.isInvalid())
10406     return nullptr;
10407   return getDerived().RebuildOMPNumTasksClause(
10408       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10409       C->getModifierLoc(), C->getEndLoc());
10410 }
10411 
10412 template <typename Derived>
TransformOMPHintClause(OMPHintClause * C)10413 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10414   ExprResult E = getDerived().TransformExpr(C->getHint());
10415   if (E.isInvalid())
10416     return nullptr;
10417   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10418                                            C->getLParenLoc(), C->getEndLoc());
10419 }
10420 
10421 template <typename Derived>
TransformOMPDistScheduleClause(OMPDistScheduleClause * C)10422 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10423     OMPDistScheduleClause *C) {
10424   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10425   if (E.isInvalid())
10426     return nullptr;
10427   return getDerived().RebuildOMPDistScheduleClause(
10428       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10429       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10430 }
10431 
10432 template <typename Derived>
10433 OMPClause *
TransformOMPDefaultmapClause(OMPDefaultmapClause * C)10434 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10435   // Rebuild Defaultmap Clause since we need to invoke the checking of
10436   // defaultmap(none:variable-category) after template initialization.
10437   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10438                                                  C->getDefaultmapKind(),
10439                                                  C->getBeginLoc(),
10440                                                  C->getLParenLoc(),
10441                                                  C->getDefaultmapModifierLoc(),
10442                                                  C->getDefaultmapKindLoc(),
10443                                                  C->getEndLoc());
10444 }
10445 
10446 template <typename Derived>
TransformOMPToClause(OMPToClause * C)10447 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10448   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10449   llvm::SmallVector<Expr *, 16> Vars;
10450   CXXScopeSpec MapperIdScopeSpec;
10451   DeclarationNameInfo MapperIdInfo;
10452   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10453   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10454           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10455     return nullptr;
10456   return getDerived().RebuildOMPToClause(
10457       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10458       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10459 }
10460 
10461 template <typename Derived>
TransformOMPFromClause(OMPFromClause * C)10462 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10463   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10464   llvm::SmallVector<Expr *, 16> Vars;
10465   CXXScopeSpec MapperIdScopeSpec;
10466   DeclarationNameInfo MapperIdInfo;
10467   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10468   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10469           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10470     return nullptr;
10471   return getDerived().RebuildOMPFromClause(
10472       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10473       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10474 }
10475 
10476 template <typename Derived>
TransformOMPUseDevicePtrClause(OMPUseDevicePtrClause * C)10477 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10478     OMPUseDevicePtrClause *C) {
10479   llvm::SmallVector<Expr *, 16> Vars;
10480   Vars.reserve(C->varlist_size());
10481   for (auto *VE : C->varlists()) {
10482     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10483     if (EVar.isInvalid())
10484       return nullptr;
10485     Vars.push_back(EVar.get());
10486   }
10487   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10488   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10489 }
10490 
10491 template <typename Derived>
TransformOMPUseDeviceAddrClause(OMPUseDeviceAddrClause * C)10492 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10493     OMPUseDeviceAddrClause *C) {
10494   llvm::SmallVector<Expr *, 16> Vars;
10495   Vars.reserve(C->varlist_size());
10496   for (auto *VE : C->varlists()) {
10497     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10498     if (EVar.isInvalid())
10499       return nullptr;
10500     Vars.push_back(EVar.get());
10501   }
10502   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10503   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10504 }
10505 
10506 template <typename Derived>
10507 OMPClause *
TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause * C)10508 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10509   llvm::SmallVector<Expr *, 16> Vars;
10510   Vars.reserve(C->varlist_size());
10511   for (auto *VE : C->varlists()) {
10512     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10513     if (EVar.isInvalid())
10514       return nullptr;
10515     Vars.push_back(EVar.get());
10516   }
10517   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10518   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10519 }
10520 
10521 template <typename Derived>
TransformOMPHasDeviceAddrClause(OMPHasDeviceAddrClause * C)10522 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
10523     OMPHasDeviceAddrClause *C) {
10524   llvm::SmallVector<Expr *, 16> Vars;
10525   Vars.reserve(C->varlist_size());
10526   for (auto *VE : C->varlists()) {
10527     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10528     if (EVar.isInvalid())
10529       return nullptr;
10530     Vars.push_back(EVar.get());
10531   }
10532   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10533   return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
10534 }
10535 
10536 template <typename Derived>
10537 OMPClause *
TransformOMPNontemporalClause(OMPNontemporalClause * C)10538 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10539   llvm::SmallVector<Expr *, 16> Vars;
10540   Vars.reserve(C->varlist_size());
10541   for (auto *VE : C->varlists()) {
10542     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10543     if (EVar.isInvalid())
10544       return nullptr;
10545     Vars.push_back(EVar.get());
10546   }
10547   return getDerived().RebuildOMPNontemporalClause(
10548       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10549 }
10550 
10551 template <typename Derived>
10552 OMPClause *
TransformOMPInclusiveClause(OMPInclusiveClause * C)10553 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10554   llvm::SmallVector<Expr *, 16> Vars;
10555   Vars.reserve(C->varlist_size());
10556   for (auto *VE : C->varlists()) {
10557     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10558     if (EVar.isInvalid())
10559       return nullptr;
10560     Vars.push_back(EVar.get());
10561   }
10562   return getDerived().RebuildOMPInclusiveClause(
10563       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10564 }
10565 
10566 template <typename Derived>
10567 OMPClause *
TransformOMPExclusiveClause(OMPExclusiveClause * C)10568 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10569   llvm::SmallVector<Expr *, 16> Vars;
10570   Vars.reserve(C->varlist_size());
10571   for (auto *VE : C->varlists()) {
10572     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10573     if (EVar.isInvalid())
10574       return nullptr;
10575     Vars.push_back(EVar.get());
10576   }
10577   return getDerived().RebuildOMPExclusiveClause(
10578       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10579 }
10580 
10581 template <typename Derived>
TransformOMPUsesAllocatorsClause(OMPUsesAllocatorsClause * C)10582 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10583     OMPUsesAllocatorsClause *C) {
10584   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10585   Data.reserve(C->getNumberOfAllocators());
10586   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10587     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10588     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10589     if (Allocator.isInvalid())
10590       continue;
10591     ExprResult AllocatorTraits;
10592     if (Expr *AT = D.AllocatorTraits) {
10593       AllocatorTraits = getDerived().TransformExpr(AT);
10594       if (AllocatorTraits.isInvalid())
10595         continue;
10596     }
10597     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10598     NewD.Allocator = Allocator.get();
10599     NewD.AllocatorTraits = AllocatorTraits.get();
10600     NewD.LParenLoc = D.LParenLoc;
10601     NewD.RParenLoc = D.RParenLoc;
10602   }
10603   return getDerived().RebuildOMPUsesAllocatorsClause(
10604       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10605 }
10606 
10607 template <typename Derived>
10608 OMPClause *
TransformOMPAffinityClause(OMPAffinityClause * C)10609 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10610   SmallVector<Expr *, 4> Locators;
10611   Locators.reserve(C->varlist_size());
10612   ExprResult ModifierRes;
10613   if (Expr *Modifier = C->getModifier()) {
10614     ModifierRes = getDerived().TransformExpr(Modifier);
10615     if (ModifierRes.isInvalid())
10616       return nullptr;
10617   }
10618   for (Expr *E : C->varlists()) {
10619     ExprResult Locator = getDerived().TransformExpr(E);
10620     if (Locator.isInvalid())
10621       continue;
10622     Locators.push_back(Locator.get());
10623   }
10624   return getDerived().RebuildOMPAffinityClause(
10625       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10626       ModifierRes.get(), Locators);
10627 }
10628 
10629 template <typename Derived>
TransformOMPOrderClause(OMPOrderClause * C)10630 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10631   return getDerived().RebuildOMPOrderClause(
10632       C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(),
10633       C->getEndLoc(), C->getModifier(), C->getModifierKwLoc());
10634 }
10635 
10636 template <typename Derived>
TransformOMPBindClause(OMPBindClause * C)10637 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10638   return getDerived().RebuildOMPBindClause(
10639       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10640       C->getLParenLoc(), C->getEndLoc());
10641 }
10642 
10643 template <typename Derived>
TransformOMPXDynCGroupMemClause(OMPXDynCGroupMemClause * C)10644 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause(
10645     OMPXDynCGroupMemClause *C) {
10646   ExprResult Size = getDerived().TransformExpr(C->getSize());
10647   if (Size.isInvalid())
10648     return nullptr;
10649   return getDerived().RebuildOMPXDynCGroupMemClause(
10650       Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10651 }
10652 
10653 //===----------------------------------------------------------------------===//
10654 // Expression transformation
10655 //===----------------------------------------------------------------------===//
10656 template<typename Derived>
10657 ExprResult
TransformConstantExpr(ConstantExpr * E)10658 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10659   return TransformExpr(E->getSubExpr());
10660 }
10661 
10662 template <typename Derived>
TransformSYCLUniqueStableNameExpr(SYCLUniqueStableNameExpr * E)10663 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10664     SYCLUniqueStableNameExpr *E) {
10665   if (!E->isTypeDependent())
10666     return E;
10667 
10668   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10669 
10670   if (!NewT)
10671     return ExprError();
10672 
10673   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10674     return E;
10675 
10676   return getDerived().RebuildSYCLUniqueStableNameExpr(
10677       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10678 }
10679 
10680 template<typename Derived>
10681 ExprResult
TransformPredefinedExpr(PredefinedExpr * E)10682 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10683   if (!E->isTypeDependent())
10684     return E;
10685 
10686   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10687                                             E->getIdentKind());
10688 }
10689 
10690 template<typename Derived>
10691 ExprResult
TransformDeclRefExpr(DeclRefExpr * E)10692 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10693   NestedNameSpecifierLoc QualifierLoc;
10694   if (E->getQualifierLoc()) {
10695     QualifierLoc
10696       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10697     if (!QualifierLoc)
10698       return ExprError();
10699   }
10700 
10701   ValueDecl *ND
10702     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10703                                                          E->getDecl()));
10704   if (!ND)
10705     return ExprError();
10706 
10707   NamedDecl *Found = ND;
10708   if (E->getFoundDecl() != E->getDecl()) {
10709     Found = cast_or_null<NamedDecl>(
10710         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10711     if (!Found)
10712       return ExprError();
10713   }
10714 
10715   DeclarationNameInfo NameInfo = E->getNameInfo();
10716   if (NameInfo.getName()) {
10717     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10718     if (!NameInfo.getName())
10719       return ExprError();
10720   }
10721 
10722   if (!getDerived().AlwaysRebuild() &&
10723       QualifierLoc == E->getQualifierLoc() &&
10724       ND == E->getDecl() &&
10725       Found == E->getFoundDecl() &&
10726       NameInfo.getName() == E->getDecl()->getDeclName() &&
10727       !E->hasExplicitTemplateArgs()) {
10728 
10729     // Mark it referenced in the new context regardless.
10730     // FIXME: this is a bit instantiation-specific.
10731     SemaRef.MarkDeclRefReferenced(E);
10732 
10733     return E;
10734   }
10735 
10736   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10737   if (E->hasExplicitTemplateArgs()) {
10738     TemplateArgs = &TransArgs;
10739     TransArgs.setLAngleLoc(E->getLAngleLoc());
10740     TransArgs.setRAngleLoc(E->getRAngleLoc());
10741     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10742                                                 E->getNumTemplateArgs(),
10743                                                 TransArgs))
10744       return ExprError();
10745   }
10746 
10747   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10748                                          Found, TemplateArgs);
10749 }
10750 
10751 template<typename Derived>
10752 ExprResult
TransformIntegerLiteral(IntegerLiteral * E)10753 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10754   return E;
10755 }
10756 
10757 template <typename Derived>
TransformFixedPointLiteral(FixedPointLiteral * E)10758 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10759     FixedPointLiteral *E) {
10760   return E;
10761 }
10762 
10763 template<typename Derived>
10764 ExprResult
TransformFloatingLiteral(FloatingLiteral * E)10765 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10766   return E;
10767 }
10768 
10769 template<typename Derived>
10770 ExprResult
TransformImaginaryLiteral(ImaginaryLiteral * E)10771 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10772   return E;
10773 }
10774 
10775 template<typename Derived>
10776 ExprResult
TransformStringLiteral(StringLiteral * E)10777 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10778   return E;
10779 }
10780 
10781 template<typename Derived>
10782 ExprResult
TransformCharacterLiteral(CharacterLiteral * E)10783 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10784   return E;
10785 }
10786 
10787 template<typename Derived>
10788 ExprResult
TransformUserDefinedLiteral(UserDefinedLiteral * E)10789 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10790   return getDerived().TransformCallExpr(E);
10791 }
10792 
10793 template<typename Derived>
10794 ExprResult
TransformGenericSelectionExpr(GenericSelectionExpr * E)10795 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10796   ExprResult ControllingExpr =
10797     getDerived().TransformExpr(E->getControllingExpr());
10798   if (ControllingExpr.isInvalid())
10799     return ExprError();
10800 
10801   SmallVector<Expr *, 4> AssocExprs;
10802   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10803   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10804     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10805     if (TSI) {
10806       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10807       if (!AssocType)
10808         return ExprError();
10809       AssocTypes.push_back(AssocType);
10810     } else {
10811       AssocTypes.push_back(nullptr);
10812     }
10813 
10814     ExprResult AssocExpr =
10815         getDerived().TransformExpr(Assoc.getAssociationExpr());
10816     if (AssocExpr.isInvalid())
10817       return ExprError();
10818     AssocExprs.push_back(AssocExpr.get());
10819   }
10820 
10821   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10822                                                   E->getDefaultLoc(),
10823                                                   E->getRParenLoc(),
10824                                                   ControllingExpr.get(),
10825                                                   AssocTypes,
10826                                                   AssocExprs);
10827 }
10828 
10829 template<typename Derived>
10830 ExprResult
TransformParenExpr(ParenExpr * E)10831 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10832   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10833   if (SubExpr.isInvalid())
10834     return ExprError();
10835 
10836   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10837     return E;
10838 
10839   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10840                                        E->getRParen());
10841 }
10842 
10843 /// The operand of a unary address-of operator has special rules: it's
10844 /// allowed to refer to a non-static member of a class even if there's no 'this'
10845 /// object available.
10846 template<typename Derived>
10847 ExprResult
TransformAddressOfOperand(Expr * E)10848 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10849   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10850     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10851   else
10852     return getDerived().TransformExpr(E);
10853 }
10854 
10855 template<typename Derived>
10856 ExprResult
TransformUnaryOperator(UnaryOperator * E)10857 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10858   ExprResult SubExpr;
10859   if (E->getOpcode() == UO_AddrOf)
10860     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10861   else
10862     SubExpr = TransformExpr(E->getSubExpr());
10863   if (SubExpr.isInvalid())
10864     return ExprError();
10865 
10866   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10867     return E;
10868 
10869   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10870                                            E->getOpcode(),
10871                                            SubExpr.get());
10872 }
10873 
10874 template<typename Derived>
10875 ExprResult
TransformOffsetOfExpr(OffsetOfExpr * E)10876 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10877   // Transform the type.
10878   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10879   if (!Type)
10880     return ExprError();
10881 
10882   // Transform all of the components into components similar to what the
10883   // parser uses.
10884   // FIXME: It would be slightly more efficient in the non-dependent case to
10885   // just map FieldDecls, rather than requiring the rebuilder to look for
10886   // the fields again. However, __builtin_offsetof is rare enough in
10887   // template code that we don't care.
10888   bool ExprChanged = false;
10889   typedef Sema::OffsetOfComponent Component;
10890   SmallVector<Component, 4> Components;
10891   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10892     const OffsetOfNode &ON = E->getComponent(I);
10893     Component Comp;
10894     Comp.isBrackets = true;
10895     Comp.LocStart = ON.getSourceRange().getBegin();
10896     Comp.LocEnd = ON.getSourceRange().getEnd();
10897     switch (ON.getKind()) {
10898     case OffsetOfNode::Array: {
10899       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10900       ExprResult Index = getDerived().TransformExpr(FromIndex);
10901       if (Index.isInvalid())
10902         return ExprError();
10903 
10904       ExprChanged = ExprChanged || Index.get() != FromIndex;
10905       Comp.isBrackets = true;
10906       Comp.U.E = Index.get();
10907       break;
10908     }
10909 
10910     case OffsetOfNode::Field:
10911     case OffsetOfNode::Identifier:
10912       Comp.isBrackets = false;
10913       Comp.U.IdentInfo = ON.getFieldName();
10914       if (!Comp.U.IdentInfo)
10915         continue;
10916 
10917       break;
10918 
10919     case OffsetOfNode::Base:
10920       // Will be recomputed during the rebuild.
10921       continue;
10922     }
10923 
10924     Components.push_back(Comp);
10925   }
10926 
10927   // If nothing changed, retain the existing expression.
10928   if (!getDerived().AlwaysRebuild() &&
10929       Type == E->getTypeSourceInfo() &&
10930       !ExprChanged)
10931     return E;
10932 
10933   // Build a new offsetof expression.
10934   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10935                                           Components, E->getRParenLoc());
10936 }
10937 
10938 template<typename Derived>
10939 ExprResult
TransformOpaqueValueExpr(OpaqueValueExpr * E)10940 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10941   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10942          "opaque value expression requires transformation");
10943   return E;
10944 }
10945 
10946 template<typename Derived>
10947 ExprResult
TransformTypoExpr(TypoExpr * E)10948 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10949   return E;
10950 }
10951 
10952 template <typename Derived>
TransformRecoveryExpr(RecoveryExpr * E)10953 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10954   llvm::SmallVector<Expr *, 8> Children;
10955   bool Changed = false;
10956   for (Expr *C : E->subExpressions()) {
10957     ExprResult NewC = getDerived().TransformExpr(C);
10958     if (NewC.isInvalid())
10959       return ExprError();
10960     Children.push_back(NewC.get());
10961 
10962     Changed |= NewC.get() != C;
10963   }
10964   if (!getDerived().AlwaysRebuild() && !Changed)
10965     return E;
10966   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10967                                           Children, E->getType());
10968 }
10969 
10970 template<typename Derived>
10971 ExprResult
TransformPseudoObjectExpr(PseudoObjectExpr * E)10972 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10973   // Rebuild the syntactic form.  The original syntactic form has
10974   // opaque-value expressions in it, so strip those away and rebuild
10975   // the result.  This is a really awful way of doing this, but the
10976   // better solution (rebuilding the semantic expressions and
10977   // rebinding OVEs as necessary) doesn't work; we'd need
10978   // TreeTransform to not strip away implicit conversions.
10979   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10980   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10981   if (result.isInvalid()) return ExprError();
10982 
10983   // If that gives us a pseudo-object result back, the pseudo-object
10984   // expression must have been an lvalue-to-rvalue conversion which we
10985   // should reapply.
10986   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10987     result = SemaRef.checkPseudoObjectRValue(result.get());
10988 
10989   return result;
10990 }
10991 
10992 template<typename Derived>
10993 ExprResult
TransformUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)10994 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10995                                                 UnaryExprOrTypeTraitExpr *E) {
10996   if (E->isArgumentType()) {
10997     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10998 
10999     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11000     if (!NewT)
11001       return ExprError();
11002 
11003     if (!getDerived().AlwaysRebuild() && OldT == NewT)
11004       return E;
11005 
11006     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
11007                                                     E->getKind(),
11008                                                     E->getSourceRange());
11009   }
11010 
11011   // C++0x [expr.sizeof]p1:
11012   //   The operand is either an expression, which is an unevaluated operand
11013   //   [...]
11014   EnterExpressionEvaluationContext Unevaluated(
11015       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11016       Sema::ReuseLambdaContextDecl);
11017 
11018   // Try to recover if we have something like sizeof(T::X) where X is a type.
11019   // Notably, there must be *exactly* one set of parens if X is a type.
11020   TypeSourceInfo *RecoveryTSI = nullptr;
11021   ExprResult SubExpr;
11022   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
11023   if (auto *DRE =
11024           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
11025     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
11026         PE, DRE, false, &RecoveryTSI);
11027   else
11028     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
11029 
11030   if (RecoveryTSI) {
11031     return getDerived().RebuildUnaryExprOrTypeTrait(
11032         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
11033   } else if (SubExpr.isInvalid())
11034     return ExprError();
11035 
11036   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
11037     return E;
11038 
11039   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
11040                                                   E->getOperatorLoc(),
11041                                                   E->getKind(),
11042                                                   E->getSourceRange());
11043 }
11044 
11045 template<typename Derived>
11046 ExprResult
TransformArraySubscriptExpr(ArraySubscriptExpr * E)11047 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
11048   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11049   if (LHS.isInvalid())
11050     return ExprError();
11051 
11052   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11053   if (RHS.isInvalid())
11054     return ExprError();
11055 
11056 
11057   if (!getDerived().AlwaysRebuild() &&
11058       LHS.get() == E->getLHS() &&
11059       RHS.get() == E->getRHS())
11060     return E;
11061 
11062   return getDerived().RebuildArraySubscriptExpr(
11063       LHS.get(),
11064       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
11065 }
11066 
11067 template <typename Derived>
11068 ExprResult
TransformMatrixSubscriptExpr(MatrixSubscriptExpr * E)11069 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
11070   ExprResult Base = getDerived().TransformExpr(E->getBase());
11071   if (Base.isInvalid())
11072     return ExprError();
11073 
11074   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
11075   if (RowIdx.isInvalid())
11076     return ExprError();
11077 
11078   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
11079   if (ColumnIdx.isInvalid())
11080     return ExprError();
11081 
11082   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11083       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
11084     return E;
11085 
11086   return getDerived().RebuildMatrixSubscriptExpr(
11087       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
11088 }
11089 
11090 template <typename Derived>
11091 ExprResult
TransformOMPArraySectionExpr(OMPArraySectionExpr * E)11092 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
11093   ExprResult Base = getDerived().TransformExpr(E->getBase());
11094   if (Base.isInvalid())
11095     return ExprError();
11096 
11097   ExprResult LowerBound;
11098   if (E->getLowerBound()) {
11099     LowerBound = getDerived().TransformExpr(E->getLowerBound());
11100     if (LowerBound.isInvalid())
11101       return ExprError();
11102   }
11103 
11104   ExprResult Length;
11105   if (E->getLength()) {
11106     Length = getDerived().TransformExpr(E->getLength());
11107     if (Length.isInvalid())
11108       return ExprError();
11109   }
11110 
11111   ExprResult Stride;
11112   if (Expr *Str = E->getStride()) {
11113     Stride = getDerived().TransformExpr(Str);
11114     if (Stride.isInvalid())
11115       return ExprError();
11116   }
11117 
11118   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11119       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
11120     return E;
11121 
11122   return getDerived().RebuildOMPArraySectionExpr(
11123       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
11124       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
11125       E->getRBracketLoc());
11126 }
11127 
11128 template <typename Derived>
11129 ExprResult
TransformOMPArrayShapingExpr(OMPArrayShapingExpr * E)11130 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
11131   ExprResult Base = getDerived().TransformExpr(E->getBase());
11132   if (Base.isInvalid())
11133     return ExprError();
11134 
11135   SmallVector<Expr *, 4> Dims;
11136   bool ErrorFound = false;
11137   for (Expr *Dim : E->getDimensions()) {
11138     ExprResult DimRes = getDerived().TransformExpr(Dim);
11139     if (DimRes.isInvalid()) {
11140       ErrorFound = true;
11141       continue;
11142     }
11143     Dims.push_back(DimRes.get());
11144   }
11145 
11146   if (ErrorFound)
11147     return ExprError();
11148   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
11149                                                  E->getRParenLoc(), Dims,
11150                                                  E->getBracketsRanges());
11151 }
11152 
11153 template <typename Derived>
11154 ExprResult
TransformOMPIteratorExpr(OMPIteratorExpr * E)11155 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
11156   unsigned NumIterators = E->numOfIterators();
11157   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
11158 
11159   bool ErrorFound = false;
11160   bool NeedToRebuild = getDerived().AlwaysRebuild();
11161   for (unsigned I = 0; I < NumIterators; ++I) {
11162     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
11163     Data[I].DeclIdent = D->getIdentifier();
11164     Data[I].DeclIdentLoc = D->getLocation();
11165     if (D->getLocation() == D->getBeginLoc()) {
11166       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
11167              "Implicit type must be int.");
11168     } else {
11169       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
11170       QualType DeclTy = getDerived().TransformType(D->getType());
11171       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
11172     }
11173     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
11174     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
11175     ExprResult End = getDerived().TransformExpr(Range.End);
11176     ExprResult Step = getDerived().TransformExpr(Range.Step);
11177     ErrorFound = ErrorFound ||
11178                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
11179                                                !Data[I].Type.get().isNull())) ||
11180                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
11181     if (ErrorFound)
11182       continue;
11183     Data[I].Range.Begin = Begin.get();
11184     Data[I].Range.End = End.get();
11185     Data[I].Range.Step = Step.get();
11186     Data[I].AssignLoc = E->getAssignLoc(I);
11187     Data[I].ColonLoc = E->getColonLoc(I);
11188     Data[I].SecColonLoc = E->getSecondColonLoc(I);
11189     NeedToRebuild =
11190         NeedToRebuild ||
11191         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
11192                                        D->getType().getTypePtrOrNull()) ||
11193         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
11194         Range.Step != Data[I].Range.Step;
11195   }
11196   if (ErrorFound)
11197     return ExprError();
11198   if (!NeedToRebuild)
11199     return E;
11200 
11201   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
11202       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
11203   if (!Res.isUsable())
11204     return Res;
11205   auto *IE = cast<OMPIteratorExpr>(Res.get());
11206   for (unsigned I = 0; I < NumIterators; ++I)
11207     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
11208                                       IE->getIteratorDecl(I));
11209   return Res;
11210 }
11211 
11212 template<typename Derived>
11213 ExprResult
TransformCallExpr(CallExpr * E)11214 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
11215   // Transform the callee.
11216   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11217   if (Callee.isInvalid())
11218     return ExprError();
11219 
11220   // Transform arguments.
11221   bool ArgChanged = false;
11222   SmallVector<Expr*, 8> Args;
11223   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11224                                   &ArgChanged))
11225     return ExprError();
11226 
11227   if (!getDerived().AlwaysRebuild() &&
11228       Callee.get() == E->getCallee() &&
11229       !ArgChanged)
11230     return SemaRef.MaybeBindToTemporary(E);
11231 
11232   // FIXME: Wrong source location information for the '('.
11233   SourceLocation FakeLParenLoc
11234     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11235 
11236   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11237   if (E->hasStoredFPFeatures()) {
11238     FPOptionsOverride NewOverrides = E->getFPFeatures();
11239     getSema().CurFPFeatures =
11240         NewOverrides.applyOverrides(getSema().getLangOpts());
11241     getSema().FpPragmaStack.CurrentValue = NewOverrides;
11242   }
11243 
11244   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11245                                       Args,
11246                                       E->getRParenLoc());
11247 }
11248 
11249 template<typename Derived>
11250 ExprResult
TransformMemberExpr(MemberExpr * E)11251 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
11252   ExprResult Base = getDerived().TransformExpr(E->getBase());
11253   if (Base.isInvalid())
11254     return ExprError();
11255 
11256   NestedNameSpecifierLoc QualifierLoc;
11257   if (E->hasQualifier()) {
11258     QualifierLoc
11259       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11260 
11261     if (!QualifierLoc)
11262       return ExprError();
11263   }
11264   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11265 
11266   ValueDecl *Member
11267     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
11268                                                          E->getMemberDecl()));
11269   if (!Member)
11270     return ExprError();
11271 
11272   NamedDecl *FoundDecl = E->getFoundDecl();
11273   if (FoundDecl == E->getMemberDecl()) {
11274     FoundDecl = Member;
11275   } else {
11276     FoundDecl = cast_or_null<NamedDecl>(
11277                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
11278     if (!FoundDecl)
11279       return ExprError();
11280   }
11281 
11282   if (!getDerived().AlwaysRebuild() &&
11283       Base.get() == E->getBase() &&
11284       QualifierLoc == E->getQualifierLoc() &&
11285       Member == E->getMemberDecl() &&
11286       FoundDecl == E->getFoundDecl() &&
11287       !E->hasExplicitTemplateArgs()) {
11288 
11289     // Skip for member expression of (this->f), rebuilt thisi->f is needed
11290     // for Openmp where the field need to be privatizized in the case.
11291     if (!(isa<CXXThisExpr>(E->getBase()) &&
11292           getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) {
11293       // Mark it referenced in the new context regardless.
11294       // FIXME: this is a bit instantiation-specific.
11295       SemaRef.MarkMemberReferenced(E);
11296       return E;
11297     }
11298   }
11299 
11300   TemplateArgumentListInfo TransArgs;
11301   if (E->hasExplicitTemplateArgs()) {
11302     TransArgs.setLAngleLoc(E->getLAngleLoc());
11303     TransArgs.setRAngleLoc(E->getRAngleLoc());
11304     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11305                                                 E->getNumTemplateArgs(),
11306                                                 TransArgs))
11307       return ExprError();
11308   }
11309 
11310   // FIXME: Bogus source location for the operator
11311   SourceLocation FakeOperatorLoc =
11312       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
11313 
11314   // FIXME: to do this check properly, we will need to preserve the
11315   // first-qualifier-in-scope here, just in case we had a dependent
11316   // base (and therefore couldn't do the check) and a
11317   // nested-name-qualifier (and therefore could do the lookup).
11318   NamedDecl *FirstQualifierInScope = nullptr;
11319   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
11320   if (MemberNameInfo.getName()) {
11321     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11322     if (!MemberNameInfo.getName())
11323       return ExprError();
11324   }
11325 
11326   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11327                                         E->isArrow(),
11328                                         QualifierLoc,
11329                                         TemplateKWLoc,
11330                                         MemberNameInfo,
11331                                         Member,
11332                                         FoundDecl,
11333                                         (E->hasExplicitTemplateArgs()
11334                                            ? &TransArgs : nullptr),
11335                                         FirstQualifierInScope);
11336 }
11337 
11338 template<typename Derived>
11339 ExprResult
TransformBinaryOperator(BinaryOperator * E)11340 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11341   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11342   if (LHS.isInvalid())
11343     return ExprError();
11344 
11345   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11346   if (RHS.isInvalid())
11347     return ExprError();
11348 
11349   if (!getDerived().AlwaysRebuild() &&
11350       LHS.get() == E->getLHS() &&
11351       RHS.get() == E->getRHS())
11352     return E;
11353 
11354   if (E->isCompoundAssignmentOp())
11355     // FPFeatures has already been established from trailing storage
11356     return getDerived().RebuildBinaryOperator(
11357         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11358   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11359   FPOptionsOverride NewOverrides(E->getFPFeatures());
11360   getSema().CurFPFeatures =
11361       NewOverrides.applyOverrides(getSema().getLangOpts());
11362   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11363   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11364                                             LHS.get(), RHS.get());
11365 }
11366 
11367 template <typename Derived>
TransformCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator * E)11368 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11369     CXXRewrittenBinaryOperator *E) {
11370   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11371 
11372   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11373   if (LHS.isInvalid())
11374     return ExprError();
11375 
11376   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11377   if (RHS.isInvalid())
11378     return ExprError();
11379 
11380   // Extract the already-resolved callee declarations so that we can restrict
11381   // ourselves to using them as the unqualified lookup results when rebuilding.
11382   UnresolvedSet<2> UnqualLookups;
11383   bool ChangedAnyLookups = false;
11384   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11385                             const_cast<Expr *>(Decomp.InnerBinOp)};
11386   for (Expr *PossibleBinOp : PossibleBinOps) {
11387     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11388     if (!Op)
11389       continue;
11390     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11391     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11392       continue;
11393 
11394     // Transform the callee in case we built a call to a local extern
11395     // declaration.
11396     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11397         E->getOperatorLoc(), Callee->getFoundDecl()));
11398     if (!Found)
11399       return ExprError();
11400     if (Found != Callee->getFoundDecl())
11401       ChangedAnyLookups = true;
11402     UnqualLookups.addDecl(Found);
11403   }
11404 
11405   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11406       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11407     // Mark all functions used in the rewrite as referenced. Note that when
11408     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11409     // function calls, and/or there might be a user-defined conversion sequence
11410     // applied to the operands of the <.
11411     // FIXME: this is a bit instantiation-specific.
11412     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11413     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11414     return E;
11415   }
11416 
11417   return getDerived().RebuildCXXRewrittenBinaryOperator(
11418       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11419 }
11420 
11421 template<typename Derived>
11422 ExprResult
TransformCompoundAssignOperator(CompoundAssignOperator * E)11423 TreeTransform<Derived>::TransformCompoundAssignOperator(
11424                                                       CompoundAssignOperator *E) {
11425   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11426   FPOptionsOverride NewOverrides(E->getFPFeatures());
11427   getSema().CurFPFeatures =
11428       NewOverrides.applyOverrides(getSema().getLangOpts());
11429   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11430   return getDerived().TransformBinaryOperator(E);
11431 }
11432 
11433 template<typename Derived>
11434 ExprResult TreeTransform<Derived>::
TransformBinaryConditionalOperator(BinaryConditionalOperator * e)11435 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11436   // Just rebuild the common and RHS expressions and see whether we
11437   // get any changes.
11438 
11439   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11440   if (commonExpr.isInvalid())
11441     return ExprError();
11442 
11443   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11444   if (rhs.isInvalid())
11445     return ExprError();
11446 
11447   if (!getDerived().AlwaysRebuild() &&
11448       commonExpr.get() == e->getCommon() &&
11449       rhs.get() == e->getFalseExpr())
11450     return e;
11451 
11452   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11453                                                  e->getQuestionLoc(),
11454                                                  nullptr,
11455                                                  e->getColonLoc(),
11456                                                  rhs.get());
11457 }
11458 
11459 template<typename Derived>
11460 ExprResult
TransformConditionalOperator(ConditionalOperator * E)11461 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11462   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11463   if (Cond.isInvalid())
11464     return ExprError();
11465 
11466   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11467   if (LHS.isInvalid())
11468     return ExprError();
11469 
11470   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11471   if (RHS.isInvalid())
11472     return ExprError();
11473 
11474   if (!getDerived().AlwaysRebuild() &&
11475       Cond.get() == E->getCond() &&
11476       LHS.get() == E->getLHS() &&
11477       RHS.get() == E->getRHS())
11478     return E;
11479 
11480   return getDerived().RebuildConditionalOperator(Cond.get(),
11481                                                  E->getQuestionLoc(),
11482                                                  LHS.get(),
11483                                                  E->getColonLoc(),
11484                                                  RHS.get());
11485 }
11486 
11487 template<typename Derived>
11488 ExprResult
TransformImplicitCastExpr(ImplicitCastExpr * E)11489 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11490   // Implicit casts are eliminated during transformation, since they
11491   // will be recomputed by semantic analysis after transformation.
11492   return getDerived().TransformExpr(E->getSubExprAsWritten());
11493 }
11494 
11495 template<typename Derived>
11496 ExprResult
TransformCStyleCastExpr(CStyleCastExpr * E)11497 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11498   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11499   if (!Type)
11500     return ExprError();
11501 
11502   ExprResult SubExpr
11503     = getDerived().TransformExpr(E->getSubExprAsWritten());
11504   if (SubExpr.isInvalid())
11505     return ExprError();
11506 
11507   if (!getDerived().AlwaysRebuild() &&
11508       Type == E->getTypeInfoAsWritten() &&
11509       SubExpr.get() == E->getSubExpr())
11510     return E;
11511 
11512   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11513                                             Type,
11514                                             E->getRParenLoc(),
11515                                             SubExpr.get());
11516 }
11517 
11518 template<typename Derived>
11519 ExprResult
TransformCompoundLiteralExpr(CompoundLiteralExpr * E)11520 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11521   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11522   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11523   if (!NewT)
11524     return ExprError();
11525 
11526   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11527   if (Init.isInvalid())
11528     return ExprError();
11529 
11530   if (!getDerived().AlwaysRebuild() &&
11531       OldT == NewT &&
11532       Init.get() == E->getInitializer())
11533     return SemaRef.MaybeBindToTemporary(E);
11534 
11535   // Note: the expression type doesn't necessarily match the
11536   // type-as-written, but that's okay, because it should always be
11537   // derivable from the initializer.
11538 
11539   return getDerived().RebuildCompoundLiteralExpr(
11540       E->getLParenLoc(), NewT,
11541       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11542 }
11543 
11544 template<typename Derived>
11545 ExprResult
TransformExtVectorElementExpr(ExtVectorElementExpr * E)11546 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11547   ExprResult Base = getDerived().TransformExpr(E->getBase());
11548   if (Base.isInvalid())
11549     return ExprError();
11550 
11551   if (!getDerived().AlwaysRebuild() &&
11552       Base.get() == E->getBase())
11553     return E;
11554 
11555   // FIXME: Bad source location
11556   SourceLocation FakeOperatorLoc =
11557       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11558   return getDerived().RebuildExtVectorElementExpr(
11559       Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(),
11560       E->getAccessor());
11561 }
11562 
11563 template<typename Derived>
11564 ExprResult
TransformInitListExpr(InitListExpr * E)11565 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11566   if (InitListExpr *Syntactic = E->getSyntacticForm())
11567     E = Syntactic;
11568 
11569   bool InitChanged = false;
11570 
11571   EnterExpressionEvaluationContext Context(
11572       getSema(), EnterExpressionEvaluationContext::InitList);
11573 
11574   SmallVector<Expr*, 4> Inits;
11575   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11576                                   Inits, &InitChanged))
11577     return ExprError();
11578 
11579   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11580     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11581     // in some cases. We can't reuse it in general, because the syntactic and
11582     // semantic forms are linked, and we can't know that semantic form will
11583     // match even if the syntactic form does.
11584   }
11585 
11586   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11587                                       E->getRBraceLoc());
11588 }
11589 
11590 template<typename Derived>
11591 ExprResult
TransformDesignatedInitExpr(DesignatedInitExpr * E)11592 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11593   Designation Desig;
11594 
11595   // transform the initializer value
11596   ExprResult Init = getDerived().TransformExpr(E->getInit());
11597   if (Init.isInvalid())
11598     return ExprError();
11599 
11600   // transform the designators.
11601   SmallVector<Expr*, 4> ArrayExprs;
11602   bool ExprChanged = false;
11603   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11604     if (D.isFieldDesignator()) {
11605       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11606                                                D.getDotLoc(),
11607                                                D.getFieldLoc()));
11608       if (D.getField()) {
11609         FieldDecl *Field = cast_or_null<FieldDecl>(
11610             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11611         if (Field != D.getField())
11612           // Rebuild the expression when the transformed FieldDecl is
11613           // different to the already assigned FieldDecl.
11614           ExprChanged = true;
11615       } else {
11616         // Ensure that the designator expression is rebuilt when there isn't
11617         // a resolved FieldDecl in the designator as we don't want to assign
11618         // a FieldDecl to a pattern designator that will be instantiated again.
11619         ExprChanged = true;
11620       }
11621       continue;
11622     }
11623 
11624     if (D.isArrayDesignator()) {
11625       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11626       if (Index.isInvalid())
11627         return ExprError();
11628 
11629       Desig.AddDesignator(
11630           Designator::getArray(Index.get(), D.getLBracketLoc()));
11631 
11632       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11633       ArrayExprs.push_back(Index.get());
11634       continue;
11635     }
11636 
11637     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11638     ExprResult Start
11639       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11640     if (Start.isInvalid())
11641       return ExprError();
11642 
11643     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11644     if (End.isInvalid())
11645       return ExprError();
11646 
11647     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11648                                                   End.get(),
11649                                                   D.getLBracketLoc(),
11650                                                   D.getEllipsisLoc()));
11651 
11652     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11653                   End.get() != E->getArrayRangeEnd(D);
11654 
11655     ArrayExprs.push_back(Start.get());
11656     ArrayExprs.push_back(End.get());
11657   }
11658 
11659   if (!getDerived().AlwaysRebuild() &&
11660       Init.get() == E->getInit() &&
11661       !ExprChanged)
11662     return E;
11663 
11664   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11665                                                 E->getEqualOrColonLoc(),
11666                                                 E->usesGNUSyntax(), Init.get());
11667 }
11668 
11669 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11670 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11671 template<typename Derived>
11672 ExprResult
TransformDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)11673 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11674     DesignatedInitUpdateExpr *E) {
11675   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11676                    "initializer");
11677   return ExprError();
11678 }
11679 
11680 template<typename Derived>
11681 ExprResult
TransformNoInitExpr(NoInitExpr * E)11682 TreeTransform<Derived>::TransformNoInitExpr(
11683     NoInitExpr *E) {
11684   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11685   return ExprError();
11686 }
11687 
11688 template<typename Derived>
11689 ExprResult
TransformArrayInitLoopExpr(ArrayInitLoopExpr * E)11690 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11691   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11692   return ExprError();
11693 }
11694 
11695 template<typename Derived>
11696 ExprResult
TransformArrayInitIndexExpr(ArrayInitIndexExpr * E)11697 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11698   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11699   return ExprError();
11700 }
11701 
11702 template<typename Derived>
11703 ExprResult
TransformImplicitValueInitExpr(ImplicitValueInitExpr * E)11704 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11705                                                      ImplicitValueInitExpr *E) {
11706   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11707 
11708   // FIXME: Will we ever have proper type location here? Will we actually
11709   // need to transform the type?
11710   QualType T = getDerived().TransformType(E->getType());
11711   if (T.isNull())
11712     return ExprError();
11713 
11714   if (!getDerived().AlwaysRebuild() &&
11715       T == E->getType())
11716     return E;
11717 
11718   return getDerived().RebuildImplicitValueInitExpr(T);
11719 }
11720 
11721 template<typename Derived>
11722 ExprResult
TransformVAArgExpr(VAArgExpr * E)11723 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11724   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11725   if (!TInfo)
11726     return ExprError();
11727 
11728   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11729   if (SubExpr.isInvalid())
11730     return ExprError();
11731 
11732   if (!getDerived().AlwaysRebuild() &&
11733       TInfo == E->getWrittenTypeInfo() &&
11734       SubExpr.get() == E->getSubExpr())
11735     return E;
11736 
11737   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11738                                        TInfo, E->getRParenLoc());
11739 }
11740 
11741 template<typename Derived>
11742 ExprResult
TransformParenListExpr(ParenListExpr * E)11743 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11744   bool ArgumentChanged = false;
11745   SmallVector<Expr*, 4> Inits;
11746   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11747                      &ArgumentChanged))
11748     return ExprError();
11749 
11750   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11751                                            Inits,
11752                                            E->getRParenLoc());
11753 }
11754 
11755 /// Transform an address-of-label expression.
11756 ///
11757 /// By default, the transformation of an address-of-label expression always
11758 /// rebuilds the expression, so that the label identifier can be resolved to
11759 /// the corresponding label statement by semantic analysis.
11760 template<typename Derived>
11761 ExprResult
TransformAddrLabelExpr(AddrLabelExpr * E)11762 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11763   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11764                                         E->getLabel());
11765   if (!LD)
11766     return ExprError();
11767 
11768   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11769                                            cast<LabelDecl>(LD));
11770 }
11771 
11772 template<typename Derived>
11773 ExprResult
TransformStmtExpr(StmtExpr * E)11774 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11775   SemaRef.ActOnStartStmtExpr();
11776   StmtResult SubStmt
11777     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11778   if (SubStmt.isInvalid()) {
11779     SemaRef.ActOnStmtExprError();
11780     return ExprError();
11781   }
11782 
11783   unsigned OldDepth = E->getTemplateDepth();
11784   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11785 
11786   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11787       SubStmt.get() == E->getSubStmt()) {
11788     // Calling this an 'error' is unintuitive, but it does the right thing.
11789     SemaRef.ActOnStmtExprError();
11790     return SemaRef.MaybeBindToTemporary(E);
11791   }
11792 
11793   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11794                                       E->getRParenLoc(), NewDepth);
11795 }
11796 
11797 template<typename Derived>
11798 ExprResult
TransformChooseExpr(ChooseExpr * E)11799 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11800   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11801   if (Cond.isInvalid())
11802     return ExprError();
11803 
11804   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11805   if (LHS.isInvalid())
11806     return ExprError();
11807 
11808   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11809   if (RHS.isInvalid())
11810     return ExprError();
11811 
11812   if (!getDerived().AlwaysRebuild() &&
11813       Cond.get() == E->getCond() &&
11814       LHS.get() == E->getLHS() &&
11815       RHS.get() == E->getRHS())
11816     return E;
11817 
11818   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11819                                         Cond.get(), LHS.get(), RHS.get(),
11820                                         E->getRParenLoc());
11821 }
11822 
11823 template<typename Derived>
11824 ExprResult
TransformGNUNullExpr(GNUNullExpr * E)11825 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11826   return E;
11827 }
11828 
11829 template<typename Derived>
11830 ExprResult
TransformCXXOperatorCallExpr(CXXOperatorCallExpr * E)11831 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11832   switch (E->getOperator()) {
11833   case OO_New:
11834   case OO_Delete:
11835   case OO_Array_New:
11836   case OO_Array_Delete:
11837     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11838 
11839   case OO_Subscript:
11840   case OO_Call: {
11841     // This is a call to an object's operator().
11842     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11843 
11844     // Transform the object itself.
11845     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11846     if (Object.isInvalid())
11847       return ExprError();
11848 
11849     // FIXME: Poor location information
11850     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11851         static_cast<Expr *>(Object.get())->getEndLoc());
11852 
11853     // Transform the call arguments.
11854     SmallVector<Expr*, 8> Args;
11855     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11856                                     Args))
11857       return ExprError();
11858 
11859     if (E->getOperator() == OO_Subscript)
11860       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11861                                                   Args, E->getEndLoc());
11862 
11863     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11864                                         E->getEndLoc());
11865   }
11866 
11867 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11868   case OO_##Name:                                                              \
11869     break;
11870 
11871 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11872 #include "clang/Basic/OperatorKinds.def"
11873 
11874   case OO_Conditional:
11875     llvm_unreachable("conditional operator is not actually overloadable");
11876 
11877   case OO_None:
11878   case NUM_OVERLOADED_OPERATORS:
11879     llvm_unreachable("not an overloaded operator?");
11880   }
11881 
11882   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11883   if (Callee.isInvalid())
11884     return ExprError();
11885 
11886   ExprResult First;
11887   if (E->getOperator() == OO_Amp)
11888     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11889   else
11890     First = getDerived().TransformExpr(E->getArg(0));
11891   if (First.isInvalid())
11892     return ExprError();
11893 
11894   ExprResult Second;
11895   if (E->getNumArgs() == 2) {
11896     Second = getDerived().TransformExpr(E->getArg(1));
11897     if (Second.isInvalid())
11898       return ExprError();
11899   }
11900 
11901   if (!getDerived().AlwaysRebuild() &&
11902       Callee.get() == E->getCallee() &&
11903       First.get() == E->getArg(0) &&
11904       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11905     return SemaRef.MaybeBindToTemporary(E);
11906 
11907   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11908   FPOptionsOverride NewOverrides(E->getFPFeatures());
11909   getSema().CurFPFeatures =
11910       NewOverrides.applyOverrides(getSema().getLangOpts());
11911   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11912 
11913   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11914                                                  E->getOperatorLoc(),
11915                                                  Callee.get(),
11916                                                  First.get(),
11917                                                  Second.get());
11918 }
11919 
11920 template<typename Derived>
11921 ExprResult
TransformCXXMemberCallExpr(CXXMemberCallExpr * E)11922 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11923   return getDerived().TransformCallExpr(E);
11924 }
11925 
11926 template <typename Derived>
TransformSourceLocExpr(SourceLocExpr * E)11927 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11928   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11929                          getSema().CurContext != E->getParentContext();
11930 
11931   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11932     return E;
11933 
11934   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
11935                                            E->getBeginLoc(), E->getEndLoc(),
11936                                            getSema().CurContext);
11937 }
11938 
11939 template<typename Derived>
11940 ExprResult
TransformCUDAKernelCallExpr(CUDAKernelCallExpr * E)11941 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11942   // Transform the callee.
11943   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11944   if (Callee.isInvalid())
11945     return ExprError();
11946 
11947   // Transform exec config.
11948   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11949   if (EC.isInvalid())
11950     return ExprError();
11951 
11952   // Transform arguments.
11953   bool ArgChanged = false;
11954   SmallVector<Expr*, 8> Args;
11955   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11956                                   &ArgChanged))
11957     return ExprError();
11958 
11959   if (!getDerived().AlwaysRebuild() &&
11960       Callee.get() == E->getCallee() &&
11961       !ArgChanged)
11962     return SemaRef.MaybeBindToTemporary(E);
11963 
11964   // FIXME: Wrong source location information for the '('.
11965   SourceLocation FakeLParenLoc
11966     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11967   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11968                                       Args,
11969                                       E->getRParenLoc(), EC.get());
11970 }
11971 
11972 template<typename Derived>
11973 ExprResult
TransformCXXNamedCastExpr(CXXNamedCastExpr * E)11974 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11975   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11976   if (!Type)
11977     return ExprError();
11978 
11979   ExprResult SubExpr
11980     = getDerived().TransformExpr(E->getSubExprAsWritten());
11981   if (SubExpr.isInvalid())
11982     return ExprError();
11983 
11984   if (!getDerived().AlwaysRebuild() &&
11985       Type == E->getTypeInfoAsWritten() &&
11986       SubExpr.get() == E->getSubExpr())
11987     return E;
11988   return getDerived().RebuildCXXNamedCastExpr(
11989       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11990       Type, E->getAngleBrackets().getEnd(),
11991       // FIXME. this should be '(' location
11992       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11993 }
11994 
11995 template<typename Derived>
11996 ExprResult
TransformBuiltinBitCastExpr(BuiltinBitCastExpr * BCE)11997 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11998   TypeSourceInfo *TSI =
11999       getDerived().TransformType(BCE->getTypeInfoAsWritten());
12000   if (!TSI)
12001     return ExprError();
12002 
12003   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
12004   if (Sub.isInvalid())
12005     return ExprError();
12006 
12007   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
12008                                                 Sub.get(), BCE->getEndLoc());
12009 }
12010 
12011 template<typename Derived>
12012 ExprResult
TransformCXXStaticCastExpr(CXXStaticCastExpr * E)12013 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
12014   return getDerived().TransformCXXNamedCastExpr(E);
12015 }
12016 
12017 template<typename Derived>
12018 ExprResult
TransformCXXDynamicCastExpr(CXXDynamicCastExpr * E)12019 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
12020   return getDerived().TransformCXXNamedCastExpr(E);
12021 }
12022 
12023 template<typename Derived>
12024 ExprResult
TransformCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)12025 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
12026                                                       CXXReinterpretCastExpr *E) {
12027   return getDerived().TransformCXXNamedCastExpr(E);
12028 }
12029 
12030 template<typename Derived>
12031 ExprResult
TransformCXXConstCastExpr(CXXConstCastExpr * E)12032 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
12033   return getDerived().TransformCXXNamedCastExpr(E);
12034 }
12035 
12036 template<typename Derived>
12037 ExprResult
TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr * E)12038 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
12039   return getDerived().TransformCXXNamedCastExpr(E);
12040 }
12041 
12042 template<typename Derived>
12043 ExprResult
TransformCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)12044 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
12045                                                      CXXFunctionalCastExpr *E) {
12046   TypeSourceInfo *Type =
12047       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
12048   if (!Type)
12049     return ExprError();
12050 
12051   ExprResult SubExpr
12052     = getDerived().TransformExpr(E->getSubExprAsWritten());
12053   if (SubExpr.isInvalid())
12054     return ExprError();
12055 
12056   if (!getDerived().AlwaysRebuild() &&
12057       Type == E->getTypeInfoAsWritten() &&
12058       SubExpr.get() == E->getSubExpr())
12059     return E;
12060 
12061   return getDerived().RebuildCXXFunctionalCastExpr(Type,
12062                                                    E->getLParenLoc(),
12063                                                    SubExpr.get(),
12064                                                    E->getRParenLoc(),
12065                                                    E->isListInitialization());
12066 }
12067 
12068 template<typename Derived>
12069 ExprResult
TransformCXXTypeidExpr(CXXTypeidExpr * E)12070 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
12071   if (E->isTypeOperand()) {
12072     TypeSourceInfo *TInfo
12073       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12074     if (!TInfo)
12075       return ExprError();
12076 
12077     if (!getDerived().AlwaysRebuild() &&
12078         TInfo == E->getTypeOperandSourceInfo())
12079       return E;
12080 
12081     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12082                                              TInfo, E->getEndLoc());
12083   }
12084 
12085   // Typeid's operand is an unevaluated context, unless it's a polymorphic
12086   // type.  We must not unilaterally enter unevaluated context here, as then
12087   // semantic processing can re-transform an already transformed operand.
12088   Expr *Op = E->getExprOperand();
12089   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
12090   if (E->isGLValue())
12091     if (auto *RecordT = Op->getType()->getAs<RecordType>())
12092       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
12093         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
12094 
12095   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
12096                                                Sema::ReuseLambdaContextDecl);
12097 
12098   ExprResult SubExpr = getDerived().TransformExpr(Op);
12099   if (SubExpr.isInvalid())
12100     return ExprError();
12101 
12102   if (!getDerived().AlwaysRebuild() &&
12103       SubExpr.get() == E->getExprOperand())
12104     return E;
12105 
12106   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12107                                            SubExpr.get(), E->getEndLoc());
12108 }
12109 
12110 template<typename Derived>
12111 ExprResult
TransformCXXUuidofExpr(CXXUuidofExpr * E)12112 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
12113   if (E->isTypeOperand()) {
12114     TypeSourceInfo *TInfo
12115       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12116     if (!TInfo)
12117       return ExprError();
12118 
12119     if (!getDerived().AlwaysRebuild() &&
12120         TInfo == E->getTypeOperandSourceInfo())
12121       return E;
12122 
12123     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12124                                              TInfo, E->getEndLoc());
12125   }
12126 
12127   EnterExpressionEvaluationContext Unevaluated(
12128       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12129 
12130   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
12131   if (SubExpr.isInvalid())
12132     return ExprError();
12133 
12134   if (!getDerived().AlwaysRebuild() &&
12135       SubExpr.get() == E->getExprOperand())
12136     return E;
12137 
12138   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12139                                            SubExpr.get(), E->getEndLoc());
12140 }
12141 
12142 template<typename Derived>
12143 ExprResult
TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)12144 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
12145   return E;
12146 }
12147 
12148 template<typename Derived>
12149 ExprResult
TransformCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)12150 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
12151                                                      CXXNullPtrLiteralExpr *E) {
12152   return E;
12153 }
12154 
12155 template<typename Derived>
12156 ExprResult
TransformCXXThisExpr(CXXThisExpr * E)12157 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
12158   QualType T = getSema().getCurrentThisType();
12159 
12160   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
12161     // Mark it referenced in the new context regardless.
12162     // FIXME: this is a bit instantiation-specific.
12163     getSema().MarkThisReferenced(E);
12164     return E;
12165   }
12166 
12167   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
12168 }
12169 
12170 template<typename Derived>
12171 ExprResult
TransformCXXThrowExpr(CXXThrowExpr * E)12172 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
12173   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12174   if (SubExpr.isInvalid())
12175     return ExprError();
12176 
12177   if (!getDerived().AlwaysRebuild() &&
12178       SubExpr.get() == E->getSubExpr())
12179     return E;
12180 
12181   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
12182                                           E->isThrownVariableInScope());
12183 }
12184 
12185 template<typename Derived>
12186 ExprResult
TransformCXXDefaultArgExpr(CXXDefaultArgExpr * E)12187 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
12188   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
12189       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
12190   if (!Param)
12191     return ExprError();
12192 
12193   ExprResult InitRes;
12194   if (E->hasRewrittenInit()) {
12195     InitRes = getDerived().TransformExpr(E->getRewrittenExpr());
12196     if (InitRes.isInvalid())
12197       return ExprError();
12198   }
12199 
12200   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
12201       E->getUsedContext() == SemaRef.CurContext &&
12202       InitRes.get() == E->getRewrittenExpr())
12203     return E;
12204 
12205   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param,
12206                                                InitRes.get());
12207 }
12208 
12209 template<typename Derived>
12210 ExprResult
TransformCXXDefaultInitExpr(CXXDefaultInitExpr * E)12211 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
12212   FieldDecl *Field = cast_or_null<FieldDecl>(
12213       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
12214   if (!Field)
12215     return ExprError();
12216 
12217   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
12218       E->getUsedContext() == SemaRef.CurContext)
12219     return E;
12220 
12221   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
12222 }
12223 
12224 template<typename Derived>
12225 ExprResult
TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)12226 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
12227                                                     CXXScalarValueInitExpr *E) {
12228   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
12229   if (!T)
12230     return ExprError();
12231 
12232   if (!getDerived().AlwaysRebuild() &&
12233       T == E->getTypeSourceInfo())
12234     return E;
12235 
12236   return getDerived().RebuildCXXScalarValueInitExpr(T,
12237                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
12238                                                     E->getRParenLoc());
12239 }
12240 
12241 template<typename Derived>
12242 ExprResult
TransformCXXNewExpr(CXXNewExpr * E)12243 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
12244   // Transform the type that we're allocating
12245   TypeSourceInfo *AllocTypeInfo =
12246       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
12247   if (!AllocTypeInfo)
12248     return ExprError();
12249 
12250   // Transform the size of the array we're allocating (if any).
12251   std::optional<Expr *> ArraySize;
12252   if (E->isArray()) {
12253     ExprResult NewArraySize;
12254     if (std::optional<Expr *> OldArraySize = E->getArraySize()) {
12255       NewArraySize = getDerived().TransformExpr(*OldArraySize);
12256       if (NewArraySize.isInvalid())
12257         return ExprError();
12258     }
12259     ArraySize = NewArraySize.get();
12260   }
12261 
12262   // Transform the placement arguments (if any).
12263   bool ArgumentChanged = false;
12264   SmallVector<Expr*, 8> PlacementArgs;
12265   if (getDerived().TransformExprs(E->getPlacementArgs(),
12266                                   E->getNumPlacementArgs(), true,
12267                                   PlacementArgs, &ArgumentChanged))
12268     return ExprError();
12269 
12270   // Transform the initializer (if any).
12271   Expr *OldInit = E->getInitializer();
12272   ExprResult NewInit;
12273   if (OldInit)
12274     NewInit = getDerived().TransformInitializer(OldInit, true);
12275   if (NewInit.isInvalid())
12276     return ExprError();
12277 
12278   // Transform new operator and delete operator.
12279   FunctionDecl *OperatorNew = nullptr;
12280   if (E->getOperatorNew()) {
12281     OperatorNew = cast_or_null<FunctionDecl>(
12282         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
12283     if (!OperatorNew)
12284       return ExprError();
12285   }
12286 
12287   FunctionDecl *OperatorDelete = nullptr;
12288   if (E->getOperatorDelete()) {
12289     OperatorDelete = cast_or_null<FunctionDecl>(
12290         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12291     if (!OperatorDelete)
12292       return ExprError();
12293   }
12294 
12295   if (!getDerived().AlwaysRebuild() &&
12296       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
12297       ArraySize == E->getArraySize() &&
12298       NewInit.get() == OldInit &&
12299       OperatorNew == E->getOperatorNew() &&
12300       OperatorDelete == E->getOperatorDelete() &&
12301       !ArgumentChanged) {
12302     // Mark any declarations we need as referenced.
12303     // FIXME: instantiation-specific.
12304     if (OperatorNew)
12305       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
12306     if (OperatorDelete)
12307       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12308 
12309     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
12310       QualType ElementType
12311         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
12312       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
12313         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
12314         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
12315           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
12316         }
12317       }
12318     }
12319 
12320     return E;
12321   }
12322 
12323   QualType AllocType = AllocTypeInfo->getType();
12324   if (!ArraySize) {
12325     // If no array size was specified, but the new expression was
12326     // instantiated with an array type (e.g., "new T" where T is
12327     // instantiated with "int[4]"), extract the outer bound from the
12328     // array type as our array size. We do this with constant and
12329     // dependently-sized array types.
12330     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12331     if (!ArrayT) {
12332       // Do nothing
12333     } else if (const ConstantArrayType *ConsArrayT
12334                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12335       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12336                                          SemaRef.Context.getSizeType(),
12337                                          /*FIXME:*/ E->getBeginLoc());
12338       AllocType = ConsArrayT->getElementType();
12339     } else if (const DependentSizedArrayType *DepArrayT
12340                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12341       if (DepArrayT->getSizeExpr()) {
12342         ArraySize = DepArrayT->getSizeExpr();
12343         AllocType = DepArrayT->getElementType();
12344       }
12345     }
12346   }
12347 
12348   return getDerived().RebuildCXXNewExpr(
12349       E->getBeginLoc(), E->isGlobalNew(),
12350       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12351       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12352       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12353 }
12354 
12355 template<typename Derived>
12356 ExprResult
TransformCXXDeleteExpr(CXXDeleteExpr * E)12357 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12358   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12359   if (Operand.isInvalid())
12360     return ExprError();
12361 
12362   // Transform the delete operator, if known.
12363   FunctionDecl *OperatorDelete = nullptr;
12364   if (E->getOperatorDelete()) {
12365     OperatorDelete = cast_or_null<FunctionDecl>(
12366         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12367     if (!OperatorDelete)
12368       return ExprError();
12369   }
12370 
12371   if (!getDerived().AlwaysRebuild() &&
12372       Operand.get() == E->getArgument() &&
12373       OperatorDelete == E->getOperatorDelete()) {
12374     // Mark any declarations we need as referenced.
12375     // FIXME: instantiation-specific.
12376     if (OperatorDelete)
12377       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12378 
12379     if (!E->getArgument()->isTypeDependent()) {
12380       QualType Destroyed = SemaRef.Context.getBaseElementType(
12381                                                          E->getDestroyedType());
12382       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12383         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12384         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12385                                        SemaRef.LookupDestructor(Record));
12386       }
12387     }
12388 
12389     return E;
12390   }
12391 
12392   return getDerived().RebuildCXXDeleteExpr(
12393       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12394 }
12395 
12396 template<typename Derived>
12397 ExprResult
TransformCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)12398 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12399                                                      CXXPseudoDestructorExpr *E) {
12400   ExprResult Base = getDerived().TransformExpr(E->getBase());
12401   if (Base.isInvalid())
12402     return ExprError();
12403 
12404   ParsedType ObjectTypePtr;
12405   bool MayBePseudoDestructor = false;
12406   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12407                                               E->getOperatorLoc(),
12408                                         E->isArrow()? tok::arrow : tok::period,
12409                                               ObjectTypePtr,
12410                                               MayBePseudoDestructor);
12411   if (Base.isInvalid())
12412     return ExprError();
12413 
12414   QualType ObjectType = ObjectTypePtr.get();
12415   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12416   if (QualifierLoc) {
12417     QualifierLoc
12418       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12419     if (!QualifierLoc)
12420       return ExprError();
12421   }
12422   CXXScopeSpec SS;
12423   SS.Adopt(QualifierLoc);
12424 
12425   PseudoDestructorTypeStorage Destroyed;
12426   if (E->getDestroyedTypeInfo()) {
12427     TypeSourceInfo *DestroyedTypeInfo
12428       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12429                                                 ObjectType, nullptr, SS);
12430     if (!DestroyedTypeInfo)
12431       return ExprError();
12432     Destroyed = DestroyedTypeInfo;
12433   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12434     // We aren't likely to be able to resolve the identifier down to a type
12435     // now anyway, so just retain the identifier.
12436     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12437                                             E->getDestroyedTypeLoc());
12438   } else {
12439     // Look for a destructor known with the given name.
12440     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12441                                               *E->getDestroyedTypeIdentifier(),
12442                                                 E->getDestroyedTypeLoc(),
12443                                                 /*Scope=*/nullptr,
12444                                                 SS, ObjectTypePtr,
12445                                                 false);
12446     if (!T)
12447       return ExprError();
12448 
12449     Destroyed
12450       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12451                                                  E->getDestroyedTypeLoc());
12452   }
12453 
12454   TypeSourceInfo *ScopeTypeInfo = nullptr;
12455   if (E->getScopeTypeInfo()) {
12456     CXXScopeSpec EmptySS;
12457     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12458                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12459     if (!ScopeTypeInfo)
12460       return ExprError();
12461   }
12462 
12463   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12464                                                      E->getOperatorLoc(),
12465                                                      E->isArrow(),
12466                                                      SS,
12467                                                      ScopeTypeInfo,
12468                                                      E->getColonColonLoc(),
12469                                                      E->getTildeLoc(),
12470                                                      Destroyed);
12471 }
12472 
12473 template <typename Derived>
TransformOverloadExprDecls(OverloadExpr * Old,bool RequiresADL,LookupResult & R)12474 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12475                                                         bool RequiresADL,
12476                                                         LookupResult &R) {
12477   // Transform all the decls.
12478   bool AllEmptyPacks = true;
12479   for (auto *OldD : Old->decls()) {
12480     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12481     if (!InstD) {
12482       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12483       // This can happen because of dependent hiding.
12484       if (isa<UsingShadowDecl>(OldD))
12485         continue;
12486       else {
12487         R.clear();
12488         return true;
12489       }
12490     }
12491 
12492     // Expand using pack declarations.
12493     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12494     ArrayRef<NamedDecl*> Decls = SingleDecl;
12495     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12496       Decls = UPD->expansions();
12497 
12498     // Expand using declarations.
12499     for (auto *D : Decls) {
12500       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12501         for (auto *SD : UD->shadows())
12502           R.addDecl(SD);
12503       } else {
12504         R.addDecl(D);
12505       }
12506     }
12507 
12508     AllEmptyPacks &= Decls.empty();
12509   };
12510 
12511   // C++ [temp.res]/8.4.2:
12512   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12513   //   a name in the template definition found a using-declaration, but the
12514   //   lookup in the corresponding scope in the instantiation odoes not find
12515   //   any declarations because the using-declaration was a pack expansion and
12516   //   the corresponding pack is empty
12517   if (AllEmptyPacks && !RequiresADL) {
12518     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12519         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12520     return true;
12521   }
12522 
12523   // Resolve a kind, but don't do any further analysis.  If it's
12524   // ambiguous, the callee needs to deal with it.
12525   R.resolveKind();
12526   return false;
12527 }
12528 
12529 template<typename Derived>
12530 ExprResult
TransformUnresolvedLookupExpr(UnresolvedLookupExpr * Old)12531 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12532                                                   UnresolvedLookupExpr *Old) {
12533   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12534                  Sema::LookupOrdinaryName);
12535 
12536   // Transform the declaration set.
12537   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12538     return ExprError();
12539 
12540   // Rebuild the nested-name qualifier, if present.
12541   CXXScopeSpec SS;
12542   if (Old->getQualifierLoc()) {
12543     NestedNameSpecifierLoc QualifierLoc
12544       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12545     if (!QualifierLoc)
12546       return ExprError();
12547 
12548     SS.Adopt(QualifierLoc);
12549   }
12550 
12551   if (Old->getNamingClass()) {
12552     CXXRecordDecl *NamingClass
12553       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12554                                                             Old->getNameLoc(),
12555                                                         Old->getNamingClass()));
12556     if (!NamingClass) {
12557       R.clear();
12558       return ExprError();
12559     }
12560 
12561     R.setNamingClass(NamingClass);
12562   }
12563 
12564   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12565 
12566   // If we have neither explicit template arguments, nor the template keyword,
12567   // it's a normal declaration name or member reference.
12568   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12569     NamedDecl *D = R.getAsSingle<NamedDecl>();
12570     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12571     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12572     // give a good diagnostic.
12573     if (D && D->isCXXInstanceMember()) {
12574       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12575                                                      /*TemplateArgs=*/nullptr,
12576                                                      /*Scope=*/nullptr);
12577     }
12578 
12579     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12580   }
12581 
12582   // If we have template arguments, rebuild them, then rebuild the
12583   // templateid expression.
12584   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12585   if (Old->hasExplicitTemplateArgs() &&
12586       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12587                                               Old->getNumTemplateArgs(),
12588                                               TransArgs)) {
12589     R.clear();
12590     return ExprError();
12591   }
12592 
12593   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12594                                             Old->requiresADL(), &TransArgs);
12595 }
12596 
12597 template<typename Derived>
12598 ExprResult
TransformTypeTraitExpr(TypeTraitExpr * E)12599 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12600   bool ArgChanged = false;
12601   SmallVector<TypeSourceInfo *, 4> Args;
12602   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12603     TypeSourceInfo *From = E->getArg(I);
12604     TypeLoc FromTL = From->getTypeLoc();
12605     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12606       TypeLocBuilder TLB;
12607       TLB.reserve(FromTL.getFullDataSize());
12608       QualType To = getDerived().TransformType(TLB, FromTL);
12609       if (To.isNull())
12610         return ExprError();
12611 
12612       if (To == From->getType())
12613         Args.push_back(From);
12614       else {
12615         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12616         ArgChanged = true;
12617       }
12618       continue;
12619     }
12620 
12621     ArgChanged = true;
12622 
12623     // We have a pack expansion. Instantiate it.
12624     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12625     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12626     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12627     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12628 
12629     // Determine whether the set of unexpanded parameter packs can and should
12630     // be expanded.
12631     bool Expand = true;
12632     bool RetainExpansion = false;
12633     std::optional<unsigned> OrigNumExpansions =
12634         ExpansionTL.getTypePtr()->getNumExpansions();
12635     std::optional<unsigned> NumExpansions = OrigNumExpansions;
12636     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12637                                              PatternTL.getSourceRange(),
12638                                              Unexpanded,
12639                                              Expand, RetainExpansion,
12640                                              NumExpansions))
12641       return ExprError();
12642 
12643     if (!Expand) {
12644       // The transform has determined that we should perform a simple
12645       // transformation on the pack expansion, producing another pack
12646       // expansion.
12647       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12648 
12649       TypeLocBuilder TLB;
12650       TLB.reserve(From->getTypeLoc().getFullDataSize());
12651 
12652       QualType To = getDerived().TransformType(TLB, PatternTL);
12653       if (To.isNull())
12654         return ExprError();
12655 
12656       To = getDerived().RebuildPackExpansionType(To,
12657                                                  PatternTL.getSourceRange(),
12658                                                  ExpansionTL.getEllipsisLoc(),
12659                                                  NumExpansions);
12660       if (To.isNull())
12661         return ExprError();
12662 
12663       PackExpansionTypeLoc ToExpansionTL
12664         = TLB.push<PackExpansionTypeLoc>(To);
12665       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12666       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12667       continue;
12668     }
12669 
12670     // Expand the pack expansion by substituting for each argument in the
12671     // pack(s).
12672     for (unsigned I = 0; I != *NumExpansions; ++I) {
12673       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12674       TypeLocBuilder TLB;
12675       TLB.reserve(PatternTL.getFullDataSize());
12676       QualType To = getDerived().TransformType(TLB, PatternTL);
12677       if (To.isNull())
12678         return ExprError();
12679 
12680       if (To->containsUnexpandedParameterPack()) {
12681         To = getDerived().RebuildPackExpansionType(To,
12682                                                    PatternTL.getSourceRange(),
12683                                                    ExpansionTL.getEllipsisLoc(),
12684                                                    NumExpansions);
12685         if (To.isNull())
12686           return ExprError();
12687 
12688         PackExpansionTypeLoc ToExpansionTL
12689           = TLB.push<PackExpansionTypeLoc>(To);
12690         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12691       }
12692 
12693       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12694     }
12695 
12696     if (!RetainExpansion)
12697       continue;
12698 
12699     // If we're supposed to retain a pack expansion, do so by temporarily
12700     // forgetting the partially-substituted parameter pack.
12701     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12702 
12703     TypeLocBuilder TLB;
12704     TLB.reserve(From->getTypeLoc().getFullDataSize());
12705 
12706     QualType To = getDerived().TransformType(TLB, PatternTL);
12707     if (To.isNull())
12708       return ExprError();
12709 
12710     To = getDerived().RebuildPackExpansionType(To,
12711                                                PatternTL.getSourceRange(),
12712                                                ExpansionTL.getEllipsisLoc(),
12713                                                NumExpansions);
12714     if (To.isNull())
12715       return ExprError();
12716 
12717     PackExpansionTypeLoc ToExpansionTL
12718       = TLB.push<PackExpansionTypeLoc>(To);
12719     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12720     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12721   }
12722 
12723   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12724     return E;
12725 
12726   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12727                                        E->getEndLoc());
12728 }
12729 
12730 template<typename Derived>
12731 ExprResult
TransformConceptSpecializationExpr(ConceptSpecializationExpr * E)12732 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12733                                                  ConceptSpecializationExpr *E) {
12734   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12735   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12736   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12737                                               Old->NumTemplateArgs, TransArgs))
12738     return ExprError();
12739 
12740   return getDerived().RebuildConceptSpecializationExpr(
12741       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12742       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12743       &TransArgs);
12744 }
12745 
12746 template<typename Derived>
12747 ExprResult
TransformRequiresExpr(RequiresExpr * E)12748 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12749   SmallVector<ParmVarDecl*, 4> TransParams;
12750   SmallVector<QualType, 4> TransParamTypes;
12751   Sema::ExtParameterInfoBuilder ExtParamInfos;
12752 
12753   // C++2a [expr.prim.req]p2
12754   // Expressions appearing within a requirement-body are unevaluated operands.
12755   EnterExpressionEvaluationContext Ctx(
12756       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
12757       Sema::ReuseLambdaContextDecl);
12758 
12759   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12760       getSema().Context, getSema().CurContext,
12761       E->getBody()->getBeginLoc());
12762 
12763   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12764 
12765   ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams(
12766       E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body,
12767       E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos);
12768 
12769   for (ParmVarDecl *Param : TransParams)
12770     if (Param)
12771       Param->setDeclContext(Body);
12772 
12773   // On failure to transform, TransformRequiresTypeParams returns an expression
12774   // in the event that the transformation of the type params failed in some way.
12775   // It is expected that this will result in a 'not satisfied' Requires clause
12776   // when instantiating.
12777   if (!TypeParamResult.isUnset())
12778     return TypeParamResult;
12779 
12780   SmallVector<concepts::Requirement *, 4> TransReqs;
12781   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12782                                                      TransReqs))
12783     return ExprError();
12784 
12785   for (concepts::Requirement *Req : TransReqs) {
12786     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12787       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12788         ER->getReturnTypeRequirement()
12789                 .getTypeConstraintTemplateParameterList()->getParam(0)
12790                 ->setDeclContext(Body);
12791       }
12792     }
12793   }
12794 
12795   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12796                                           TransParams, TransReqs,
12797                                           E->getRBraceLoc());
12798 }
12799 
12800 template<typename Derived>
TransformRequiresExprRequirements(ArrayRef<concepts::Requirement * > Reqs,SmallVectorImpl<concepts::Requirement * > & Transformed)12801 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12802     ArrayRef<concepts::Requirement *> Reqs,
12803     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12804   for (concepts::Requirement *Req : Reqs) {
12805     concepts::Requirement *TransReq = nullptr;
12806     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12807       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12808     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12809       TransReq = getDerived().TransformExprRequirement(ExprReq);
12810     else
12811       TransReq = getDerived().TransformNestedRequirement(
12812                      cast<concepts::NestedRequirement>(Req));
12813     if (!TransReq)
12814       return true;
12815     Transformed.push_back(TransReq);
12816   }
12817   return false;
12818 }
12819 
12820 template<typename Derived>
12821 concepts::TypeRequirement *
TransformTypeRequirement(concepts::TypeRequirement * Req)12822 TreeTransform<Derived>::TransformTypeRequirement(
12823     concepts::TypeRequirement *Req) {
12824   if (Req->isSubstitutionFailure()) {
12825     if (getDerived().AlwaysRebuild())
12826       return getDerived().RebuildTypeRequirement(
12827               Req->getSubstitutionDiagnostic());
12828     return Req;
12829   }
12830   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12831   if (!TransType)
12832     return nullptr;
12833   return getDerived().RebuildTypeRequirement(TransType);
12834 }
12835 
12836 template<typename Derived>
12837 concepts::ExprRequirement *
TransformExprRequirement(concepts::ExprRequirement * Req)12838 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12839   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12840   if (Req->isExprSubstitutionFailure())
12841     TransExpr = Req->getExprSubstitutionDiagnostic();
12842   else {
12843     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12844     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12845       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12846     if (TransExprRes.isInvalid())
12847       return nullptr;
12848     TransExpr = TransExprRes.get();
12849   }
12850 
12851   std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12852   const auto &RetReq = Req->getReturnTypeRequirement();
12853   if (RetReq.isEmpty())
12854     TransRetReq.emplace();
12855   else if (RetReq.isSubstitutionFailure())
12856     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12857   else if (RetReq.isTypeConstraint()) {
12858     TemplateParameterList *OrigTPL =
12859         RetReq.getTypeConstraintTemplateParameterList();
12860     TemplateParameterList *TPL =
12861         getDerived().TransformTemplateParameterList(OrigTPL);
12862     if (!TPL)
12863       return nullptr;
12864     TransRetReq.emplace(TPL);
12865   }
12866   assert(TransRetReq && "All code paths leading here must set TransRetReq");
12867   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12868     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12869                                                Req->getNoexceptLoc(),
12870                                                std::move(*TransRetReq));
12871   return getDerived().RebuildExprRequirement(
12872       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12873       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12874 }
12875 
12876 template<typename Derived>
12877 concepts::NestedRequirement *
TransformNestedRequirement(concepts::NestedRequirement * Req)12878 TreeTransform<Derived>::TransformNestedRequirement(
12879     concepts::NestedRequirement *Req) {
12880   if (Req->hasInvalidConstraint()) {
12881     if (getDerived().AlwaysRebuild())
12882       return getDerived().RebuildNestedRequirement(
12883           Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction());
12884     return Req;
12885   }
12886   ExprResult TransConstraint =
12887       getDerived().TransformExpr(Req->getConstraintExpr());
12888   if (TransConstraint.isInvalid())
12889     return nullptr;
12890   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12891 }
12892 
12893 template<typename Derived>
12894 ExprResult
TransformArrayTypeTraitExpr(ArrayTypeTraitExpr * E)12895 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12896   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12897   if (!T)
12898     return ExprError();
12899 
12900   if (!getDerived().AlwaysRebuild() &&
12901       T == E->getQueriedTypeSourceInfo())
12902     return E;
12903 
12904   ExprResult SubExpr;
12905   {
12906     EnterExpressionEvaluationContext Unevaluated(
12907         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12908     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12909     if (SubExpr.isInvalid())
12910       return ExprError();
12911 
12912     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12913       return E;
12914   }
12915 
12916   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12917                                             SubExpr.get(), E->getEndLoc());
12918 }
12919 
12920 template<typename Derived>
12921 ExprResult
TransformExpressionTraitExpr(ExpressionTraitExpr * E)12922 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12923   ExprResult SubExpr;
12924   {
12925     EnterExpressionEvaluationContext Unevaluated(
12926         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12927     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12928     if (SubExpr.isInvalid())
12929       return ExprError();
12930 
12931     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12932       return E;
12933   }
12934 
12935   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12936                                              SubExpr.get(), E->getEndLoc());
12937 }
12938 
12939 template <typename Derived>
TransformParenDependentScopeDeclRefExpr(ParenExpr * PE,DependentScopeDeclRefExpr * DRE,bool AddrTaken,TypeSourceInfo ** RecoveryTSI)12940 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12941     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12942     TypeSourceInfo **RecoveryTSI) {
12943   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12944       DRE, AddrTaken, RecoveryTSI);
12945 
12946   // Propagate both errors and recovered types, which return ExprEmpty.
12947   if (!NewDRE.isUsable())
12948     return NewDRE;
12949 
12950   // We got an expr, wrap it up in parens.
12951   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12952     return PE;
12953   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12954                                        PE->getRParen());
12955 }
12956 
12957 template <typename Derived>
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)12958 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12959     DependentScopeDeclRefExpr *E) {
12960   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12961                                             nullptr);
12962 }
12963 
12964 template <typename Derived>
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)12965 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12966     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12967     TypeSourceInfo **RecoveryTSI) {
12968   assert(E->getQualifierLoc());
12969   NestedNameSpecifierLoc QualifierLoc =
12970       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12971   if (!QualifierLoc)
12972     return ExprError();
12973   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12974 
12975   // TODO: If this is a conversion-function-id, verify that the
12976   // destination type name (if present) resolves the same way after
12977   // instantiation as it did in the local scope.
12978 
12979   DeclarationNameInfo NameInfo =
12980       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12981   if (!NameInfo.getName())
12982     return ExprError();
12983 
12984   if (!E->hasExplicitTemplateArgs()) {
12985     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12986         // Note: it is sufficient to compare the Name component of NameInfo:
12987         // if name has not changed, DNLoc has not changed either.
12988         NameInfo.getName() == E->getDeclName())
12989       return E;
12990 
12991     return getDerived().RebuildDependentScopeDeclRefExpr(
12992         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12993         IsAddressOfOperand, RecoveryTSI);
12994   }
12995 
12996   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12997   if (getDerived().TransformTemplateArguments(
12998           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12999     return ExprError();
13000 
13001   return getDerived().RebuildDependentScopeDeclRefExpr(
13002       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
13003       RecoveryTSI);
13004 }
13005 
13006 template<typename Derived>
13007 ExprResult
TransformCXXConstructExpr(CXXConstructExpr * E)13008 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
13009   // CXXConstructExprs other than for list-initialization and
13010   // CXXTemporaryObjectExpr are always implicit, so when we have
13011   // a 1-argument construction we just transform that argument.
13012   if (getDerived().AllowSkippingCXXConstructExpr() &&
13013       ((E->getNumArgs() == 1 ||
13014         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
13015        (!getDerived().DropCallArgument(E->getArg(0))) &&
13016        !E->isListInitialization()))
13017     return getDerived().TransformInitializer(E->getArg(0),
13018                                              /*DirectInit*/ false);
13019 
13020   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
13021 
13022   QualType T = getDerived().TransformType(E->getType());
13023   if (T.isNull())
13024     return ExprError();
13025 
13026   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13027       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13028   if (!Constructor)
13029     return ExprError();
13030 
13031   bool ArgumentChanged = false;
13032   SmallVector<Expr*, 8> Args;
13033   {
13034     EnterExpressionEvaluationContext Context(
13035         getSema(), EnterExpressionEvaluationContext::InitList,
13036         E->isListInitialization());
13037     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13038                                     &ArgumentChanged))
13039       return ExprError();
13040   }
13041 
13042   if (!getDerived().AlwaysRebuild() &&
13043       T == E->getType() &&
13044       Constructor == E->getConstructor() &&
13045       !ArgumentChanged) {
13046     // Mark the constructor as referenced.
13047     // FIXME: Instantiation-specific
13048     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13049     return E;
13050   }
13051 
13052   return getDerived().RebuildCXXConstructExpr(
13053       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
13054       E->hadMultipleCandidates(), E->isListInitialization(),
13055       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
13056       E->getConstructionKind(), E->getParenOrBraceRange());
13057 }
13058 
13059 template<typename Derived>
TransformCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)13060 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
13061     CXXInheritedCtorInitExpr *E) {
13062   QualType T = getDerived().TransformType(E->getType());
13063   if (T.isNull())
13064     return ExprError();
13065 
13066   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13067       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13068   if (!Constructor)
13069     return ExprError();
13070 
13071   if (!getDerived().AlwaysRebuild() &&
13072       T == E->getType() &&
13073       Constructor == E->getConstructor()) {
13074     // Mark the constructor as referenced.
13075     // FIXME: Instantiation-specific
13076     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13077     return E;
13078   }
13079 
13080   return getDerived().RebuildCXXInheritedCtorInitExpr(
13081       T, E->getLocation(), Constructor,
13082       E->constructsVBase(), E->inheritedFromVBase());
13083 }
13084 
13085 /// Transform a C++ temporary-binding expression.
13086 ///
13087 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
13088 /// transform the subexpression and return that.
13089 template<typename Derived>
13090 ExprResult
TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)13091 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
13092   if (auto *Dtor = E->getTemporary()->getDestructor())
13093     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
13094                                    const_cast<CXXDestructorDecl *>(Dtor));
13095   return getDerived().TransformExpr(E->getSubExpr());
13096 }
13097 
13098 /// Transform a C++ expression that contains cleanups that should
13099 /// be run after the expression is evaluated.
13100 ///
13101 /// Since ExprWithCleanups nodes are implicitly generated, we
13102 /// just transform the subexpression and return that.
13103 template<typename Derived>
13104 ExprResult
TransformExprWithCleanups(ExprWithCleanups * E)13105 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
13106   return getDerived().TransformExpr(E->getSubExpr());
13107 }
13108 
13109 template<typename Derived>
13110 ExprResult
TransformCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)13111 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
13112                                                     CXXTemporaryObjectExpr *E) {
13113   TypeSourceInfo *T =
13114       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13115   if (!T)
13116     return ExprError();
13117 
13118   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13119       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13120   if (!Constructor)
13121     return ExprError();
13122 
13123   bool ArgumentChanged = false;
13124   SmallVector<Expr*, 8> Args;
13125   Args.reserve(E->getNumArgs());
13126   {
13127     EnterExpressionEvaluationContext Context(
13128         getSema(), EnterExpressionEvaluationContext::InitList,
13129         E->isListInitialization());
13130     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13131                        &ArgumentChanged))
13132       return ExprError();
13133   }
13134 
13135   if (!getDerived().AlwaysRebuild() &&
13136       T == E->getTypeSourceInfo() &&
13137       Constructor == E->getConstructor() &&
13138       !ArgumentChanged) {
13139     // FIXME: Instantiation-specific
13140     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13141     return SemaRef.MaybeBindToTemporary(E);
13142   }
13143 
13144   // FIXME: We should just pass E->isListInitialization(), but we're not
13145   // prepared to handle list-initialization without a child InitListExpr.
13146   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
13147   return getDerived().RebuildCXXTemporaryObjectExpr(
13148       T, LParenLoc, Args, E->getEndLoc(),
13149       /*ListInitialization=*/LParenLoc.isInvalid());
13150 }
13151 
13152 template<typename Derived>
13153 ExprResult
TransformLambdaExpr(LambdaExpr * E)13154 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
13155   // Transform any init-capture expressions before entering the scope of the
13156   // lambda body, because they are not semantically within that scope.
13157   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
13158   struct TransformedInitCapture {
13159     // The location of the ... if the result is retaining a pack expansion.
13160     SourceLocation EllipsisLoc;
13161     // Zero or more expansions of the init-capture.
13162     SmallVector<InitCaptureInfoTy, 4> Expansions;
13163   };
13164   SmallVector<TransformedInitCapture, 4> InitCaptures;
13165   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
13166   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13167                                     CEnd = E->capture_end();
13168        C != CEnd; ++C) {
13169     if (!E->isInitCapture(C))
13170       continue;
13171 
13172     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
13173     auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13174 
13175     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
13176                                 std::optional<unsigned> NumExpansions) {
13177       ExprResult NewExprInitResult = getDerived().TransformInitializer(
13178           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
13179 
13180       if (NewExprInitResult.isInvalid()) {
13181         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
13182         return;
13183       }
13184       Expr *NewExprInit = NewExprInitResult.get();
13185 
13186       QualType NewInitCaptureType =
13187           getSema().buildLambdaInitCaptureInitialization(
13188               C->getLocation(), C->getCaptureKind() == LCK_ByRef,
13189               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
13190               cast<VarDecl>(C->getCapturedVar())->getInitStyle() !=
13191                   VarDecl::CInit,
13192               NewExprInit);
13193       Result.Expansions.push_back(
13194           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
13195     };
13196 
13197     // If this is an init-capture pack, consider expanding the pack now.
13198     if (OldVD->isParameterPack()) {
13199       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
13200                                              ->getTypeLoc()
13201                                              .castAs<PackExpansionTypeLoc>();
13202       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13203       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
13204 
13205       // Determine whether the set of unexpanded parameter packs can and should
13206       // be expanded.
13207       bool Expand = true;
13208       bool RetainExpansion = false;
13209       std::optional<unsigned> OrigNumExpansions =
13210           ExpansionTL.getTypePtr()->getNumExpansions();
13211       std::optional<unsigned> NumExpansions = OrigNumExpansions;
13212       if (getDerived().TryExpandParameterPacks(
13213               ExpansionTL.getEllipsisLoc(),
13214               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
13215               RetainExpansion, NumExpansions))
13216         return ExprError();
13217       if (Expand) {
13218         for (unsigned I = 0; I != *NumExpansions; ++I) {
13219           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13220           SubstInitCapture(SourceLocation(), std::nullopt);
13221         }
13222       }
13223       if (!Expand || RetainExpansion) {
13224         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13225         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
13226         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
13227       }
13228     } else {
13229       SubstInitCapture(SourceLocation(), std::nullopt);
13230     }
13231   }
13232 
13233   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
13234   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
13235 
13236   // Transform the template parameters, and add them to the current
13237   // instantiation scope. The null case is handled correctly.
13238   auto TPL = getDerived().TransformTemplateParameterList(
13239       E->getTemplateParameterList());
13240   LSI->GLTemplateParameterList = TPL;
13241 
13242   // Transform the type of the original lambda's call operator.
13243   // The transformation MUST be done in the CurrentInstantiationScope since
13244   // it introduces a mapping of the original to the newly created
13245   // transformed parameters.
13246   TypeSourceInfo *NewCallOpTSI = nullptr;
13247   {
13248     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
13249     FunctionProtoTypeLoc OldCallOpFPTL =
13250         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
13251 
13252     TypeLocBuilder NewCallOpTLBuilder;
13253     SmallVector<QualType, 4> ExceptionStorage;
13254     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
13255     QualType NewCallOpType = TransformFunctionProtoType(
13256         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
13257         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
13258           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
13259                                               ExceptionStorage, Changed);
13260         });
13261     if (NewCallOpType.isNull())
13262       return ExprError();
13263     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
13264                                                         NewCallOpType);
13265   }
13266 
13267   // Create the local class that will describe the lambda.
13268 
13269   // FIXME: DependencyKind below is wrong when substituting inside a templated
13270   // context that isn't a DeclContext (such as a variable template), or when
13271   // substituting an unevaluated lambda inside of a function's parameter's type
13272   // - as parameter types are not instantiated from within a function's DC. We
13273   // use evaluation contexts to distinguish the function parameter case.
13274   CXXRecordDecl::LambdaDependencyKind DependencyKind =
13275       CXXRecordDecl::LDK_Unknown;
13276   if ((getSema().isUnevaluatedContext() ||
13277        getSema().isConstantEvaluatedContext()) &&
13278       (getSema().CurContext->isFileContext() ||
13279        !getSema().CurContext->getParent()->isDependentContext()))
13280     DependencyKind = CXXRecordDecl::LDK_NeverDependent;
13281 
13282   CXXRecordDecl *OldClass = E->getLambdaClass();
13283   CXXRecordDecl *Class =
13284       getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI,
13285                                         DependencyKind, E->getCaptureDefault());
13286 
13287   getDerived().transformedLocalDecl(OldClass, {Class});
13288 
13289   std::optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
13290   if (getDerived().ReplacingOriginal())
13291     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
13292                                OldClass->getLambdaManglingNumber(),
13293                                OldClass->getDeviceLambdaManglingNumber(),
13294                                OldClass->getLambdaContextDecl());
13295 
13296   // Build the call operator.
13297   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
13298       Class, E->getIntroducerRange(), NewCallOpTSI,
13299       E->getCallOperator()->getEndLoc(),
13300       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
13301       E->getCallOperator()->getConstexprKind(),
13302       E->getCallOperator()->getStorageClass(),
13303       E->getCallOperator()->getTrailingRequiresClause());
13304 
13305   LSI->CallOperator = NewCallOperator;
13306 
13307   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
13308   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
13309 
13310   // Number the lambda for linkage purposes if necessary.
13311   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
13312 
13313   // Introduce the context of the call operator.
13314   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
13315                                  /*NewThisContext*/false);
13316 
13317   // Enter the scope of the lambda.
13318   getSema().buildLambdaScope(LSI, NewCallOperator,
13319                              E->getIntroducerRange(),
13320                              E->getCaptureDefault(),
13321                              E->getCaptureDefaultLoc(),
13322                              E->hasExplicitParameters(),
13323                              E->hasExplicitResultType(),
13324                              E->isMutable());
13325 
13326   bool Invalid = false;
13327 
13328   // Transform captures.
13329   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13330                                  CEnd = E->capture_end();
13331        C != CEnd; ++C) {
13332     // When we hit the first implicit capture, tell Sema that we've finished
13333     // the list of explicit captures.
13334     if (C->isImplicit())
13335       break;
13336 
13337     // Capturing 'this' is trivial.
13338     if (C->capturesThis()) {
13339       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13340                                     /*BuildAndDiagnose*/ true, nullptr,
13341                                     C->getCaptureKind() == LCK_StarThis);
13342       continue;
13343     }
13344     // Captured expression will be recaptured during captured variables
13345     // rebuilding.
13346     if (C->capturesVLAType())
13347       continue;
13348 
13349     // Rebuild init-captures, including the implied field declaration.
13350     if (E->isInitCapture(C)) {
13351       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13352 
13353       auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13354       llvm::SmallVector<Decl*, 4> NewVDs;
13355 
13356       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13357         ExprResult Init = Info.first;
13358         QualType InitQualType = Info.second;
13359         if (Init.isInvalid() || InitQualType.isNull()) {
13360           Invalid = true;
13361           break;
13362         }
13363         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13364             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13365             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13366         if (!NewVD) {
13367           Invalid = true;
13368           break;
13369         }
13370         NewVDs.push_back(NewVD);
13371         getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef);
13372       }
13373 
13374       if (Invalid)
13375         break;
13376 
13377       getDerived().transformedLocalDecl(OldVD, NewVDs);
13378       continue;
13379     }
13380 
13381     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13382 
13383     // Determine the capture kind for Sema.
13384     Sema::TryCaptureKind Kind
13385       = C->isImplicit()? Sema::TryCapture_Implicit
13386                        : C->getCaptureKind() == LCK_ByCopy
13387                            ? Sema::TryCapture_ExplicitByVal
13388                            : Sema::TryCapture_ExplicitByRef;
13389     SourceLocation EllipsisLoc;
13390     if (C->isPackExpansion()) {
13391       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13392       bool ShouldExpand = false;
13393       bool RetainExpansion = false;
13394       std::optional<unsigned> NumExpansions;
13395       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13396                                                C->getLocation(),
13397                                                Unexpanded,
13398                                                ShouldExpand, RetainExpansion,
13399                                                NumExpansions)) {
13400         Invalid = true;
13401         continue;
13402       }
13403 
13404       if (ShouldExpand) {
13405         // The transform has determined that we should perform an expansion;
13406         // transform and capture each of the arguments.
13407         // expansion of the pattern. Do so.
13408         auto *Pack = cast<VarDecl>(C->getCapturedVar());
13409         for (unsigned I = 0; I != *NumExpansions; ++I) {
13410           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13411           VarDecl *CapturedVar
13412             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13413                                                                Pack));
13414           if (!CapturedVar) {
13415             Invalid = true;
13416             continue;
13417           }
13418 
13419           // Capture the transformed variable.
13420           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13421         }
13422 
13423         // FIXME: Retain a pack expansion if RetainExpansion is true.
13424 
13425         continue;
13426       }
13427 
13428       EllipsisLoc = C->getEllipsisLoc();
13429     }
13430 
13431     // Transform the captured variable.
13432     auto *CapturedVar = cast_or_null<ValueDecl>(
13433         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13434     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13435       Invalid = true;
13436       continue;
13437     }
13438 
13439     // Capture the transformed variable.
13440     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13441                                  EllipsisLoc);
13442   }
13443   getSema().finishLambdaExplicitCaptures(LSI);
13444 
13445   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13446   // evaluation context even if we're not transforming the function body.
13447   getSema().PushExpressionEvaluationContext(
13448       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13449 
13450   // Instantiate the body of the lambda expression.
13451   StmtResult Body =
13452       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13453 
13454   // ActOnLambda* will pop the function scope for us.
13455   FuncScopeCleanup.disable();
13456 
13457   if (Body.isInvalid()) {
13458     SavedContext.pop();
13459     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13460                                /*IsInstantiation=*/true);
13461     return ExprError();
13462   }
13463 
13464   // Copy the LSI before ActOnFinishFunctionBody removes it.
13465   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13466   // the call operator.
13467   auto LSICopy = *LSI;
13468   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13469                                     /*IsInstantiation*/ true);
13470   SavedContext.pop();
13471 
13472   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13473                                    &LSICopy);
13474 }
13475 
13476 template<typename Derived>
13477 StmtResult
TransformLambdaBody(LambdaExpr * E,Stmt * S)13478 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13479   return TransformStmt(S);
13480 }
13481 
13482 template<typename Derived>
13483 StmtResult
SkipLambdaBody(LambdaExpr * E,Stmt * S)13484 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13485   // Transform captures.
13486   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13487                                  CEnd = E->capture_end();
13488        C != CEnd; ++C) {
13489     // When we hit the first implicit capture, tell Sema that we've finished
13490     // the list of explicit captures.
13491     if (!C->isImplicit())
13492       continue;
13493 
13494     // Capturing 'this' is trivial.
13495     if (C->capturesThis()) {
13496       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13497                                     /*BuildAndDiagnose*/ true, nullptr,
13498                                     C->getCaptureKind() == LCK_StarThis);
13499       continue;
13500     }
13501     // Captured expression will be recaptured during captured variables
13502     // rebuilding.
13503     if (C->capturesVLAType())
13504       continue;
13505 
13506     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13507     assert(!E->isInitCapture(C) && "implicit init-capture?");
13508 
13509     // Transform the captured variable.
13510     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13511         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13512     if (!CapturedVar || CapturedVar->isInvalidDecl())
13513       return StmtError();
13514 
13515     // Capture the transformed variable.
13516     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13517   }
13518 
13519   return S;
13520 }
13521 
13522 template<typename Derived>
13523 ExprResult
TransformCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)13524 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13525                                                   CXXUnresolvedConstructExpr *E) {
13526   TypeSourceInfo *T =
13527       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13528   if (!T)
13529     return ExprError();
13530 
13531   bool ArgumentChanged = false;
13532   SmallVector<Expr*, 8> Args;
13533   Args.reserve(E->getNumArgs());
13534   {
13535     EnterExpressionEvaluationContext Context(
13536         getSema(), EnterExpressionEvaluationContext::InitList,
13537         E->isListInitialization());
13538     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13539                                     &ArgumentChanged))
13540       return ExprError();
13541   }
13542 
13543   if (!getDerived().AlwaysRebuild() &&
13544       T == E->getTypeSourceInfo() &&
13545       !ArgumentChanged)
13546     return E;
13547 
13548   // FIXME: we're faking the locations of the commas
13549   return getDerived().RebuildCXXUnresolvedConstructExpr(
13550       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13551 }
13552 
13553 template<typename Derived>
13554 ExprResult
TransformCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)13555 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13556                                              CXXDependentScopeMemberExpr *E) {
13557   // Transform the base of the expression.
13558   ExprResult Base((Expr*) nullptr);
13559   Expr *OldBase;
13560   QualType BaseType;
13561   QualType ObjectType;
13562   if (!E->isImplicitAccess()) {
13563     OldBase = E->getBase();
13564     Base = getDerived().TransformExpr(OldBase);
13565     if (Base.isInvalid())
13566       return ExprError();
13567 
13568     // Start the member reference and compute the object's type.
13569     ParsedType ObjectTy;
13570     bool MayBePseudoDestructor = false;
13571     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13572                                                 E->getOperatorLoc(),
13573                                       E->isArrow()? tok::arrow : tok::period,
13574                                                 ObjectTy,
13575                                                 MayBePseudoDestructor);
13576     if (Base.isInvalid())
13577       return ExprError();
13578 
13579     ObjectType = ObjectTy.get();
13580     BaseType = ((Expr*) Base.get())->getType();
13581   } else {
13582     OldBase = nullptr;
13583     BaseType = getDerived().TransformType(E->getBaseType());
13584     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13585   }
13586 
13587   // Transform the first part of the nested-name-specifier that qualifies
13588   // the member name.
13589   NamedDecl *FirstQualifierInScope
13590     = getDerived().TransformFirstQualifierInScope(
13591                                             E->getFirstQualifierFoundInScope(),
13592                                             E->getQualifierLoc().getBeginLoc());
13593 
13594   NestedNameSpecifierLoc QualifierLoc;
13595   if (E->getQualifier()) {
13596     QualifierLoc
13597       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13598                                                      ObjectType,
13599                                                      FirstQualifierInScope);
13600     if (!QualifierLoc)
13601       return ExprError();
13602   }
13603 
13604   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13605 
13606   // TODO: If this is a conversion-function-id, verify that the
13607   // destination type name (if present) resolves the same way after
13608   // instantiation as it did in the local scope.
13609 
13610   DeclarationNameInfo NameInfo
13611     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13612   if (!NameInfo.getName())
13613     return ExprError();
13614 
13615   if (!E->hasExplicitTemplateArgs()) {
13616     // This is a reference to a member without an explicitly-specified
13617     // template argument list. Optimize for this common case.
13618     if (!getDerived().AlwaysRebuild() &&
13619         Base.get() == OldBase &&
13620         BaseType == E->getBaseType() &&
13621         QualifierLoc == E->getQualifierLoc() &&
13622         NameInfo.getName() == E->getMember() &&
13623         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13624       return E;
13625 
13626     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13627                                                        BaseType,
13628                                                        E->isArrow(),
13629                                                        E->getOperatorLoc(),
13630                                                        QualifierLoc,
13631                                                        TemplateKWLoc,
13632                                                        FirstQualifierInScope,
13633                                                        NameInfo,
13634                                                        /*TemplateArgs*/nullptr);
13635   }
13636 
13637   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13638   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13639                                               E->getNumTemplateArgs(),
13640                                               TransArgs))
13641     return ExprError();
13642 
13643   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13644                                                      BaseType,
13645                                                      E->isArrow(),
13646                                                      E->getOperatorLoc(),
13647                                                      QualifierLoc,
13648                                                      TemplateKWLoc,
13649                                                      FirstQualifierInScope,
13650                                                      NameInfo,
13651                                                      &TransArgs);
13652 }
13653 
13654 template <typename Derived>
TransformUnresolvedMemberExpr(UnresolvedMemberExpr * Old)13655 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13656     UnresolvedMemberExpr *Old) {
13657   // Transform the base of the expression.
13658   ExprResult Base((Expr *)nullptr);
13659   QualType BaseType;
13660   if (!Old->isImplicitAccess()) {
13661     Base = getDerived().TransformExpr(Old->getBase());
13662     if (Base.isInvalid())
13663       return ExprError();
13664     Base =
13665         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13666     if (Base.isInvalid())
13667       return ExprError();
13668     BaseType = Base.get()->getType();
13669   } else {
13670     BaseType = getDerived().TransformType(Old->getBaseType());
13671   }
13672 
13673   NestedNameSpecifierLoc QualifierLoc;
13674   if (Old->getQualifierLoc()) {
13675     QualifierLoc =
13676         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13677     if (!QualifierLoc)
13678       return ExprError();
13679   }
13680 
13681   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13682 
13683   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13684 
13685   // Transform the declaration set.
13686   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13687     return ExprError();
13688 
13689   // Determine the naming class.
13690   if (Old->getNamingClass()) {
13691     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13692         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13693     if (!NamingClass)
13694       return ExprError();
13695 
13696     R.setNamingClass(NamingClass);
13697   }
13698 
13699   TemplateArgumentListInfo TransArgs;
13700   if (Old->hasExplicitTemplateArgs()) {
13701     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13702     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13703     if (getDerived().TransformTemplateArguments(
13704             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13705       return ExprError();
13706   }
13707 
13708   // FIXME: to do this check properly, we will need to preserve the
13709   // first-qualifier-in-scope here, just in case we had a dependent
13710   // base (and therefore couldn't do the check) and a
13711   // nested-name-qualifier (and therefore could do the lookup).
13712   NamedDecl *FirstQualifierInScope = nullptr;
13713 
13714   return getDerived().RebuildUnresolvedMemberExpr(
13715       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13716       TemplateKWLoc, FirstQualifierInScope, R,
13717       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13718 }
13719 
13720 template<typename Derived>
13721 ExprResult
TransformCXXNoexceptExpr(CXXNoexceptExpr * E)13722 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13723   EnterExpressionEvaluationContext Unevaluated(
13724       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13725   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13726   if (SubExpr.isInvalid())
13727     return ExprError();
13728 
13729   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13730     return E;
13731 
13732   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13733 }
13734 
13735 template<typename Derived>
13736 ExprResult
TransformPackExpansionExpr(PackExpansionExpr * E)13737 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13738   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13739   if (Pattern.isInvalid())
13740     return ExprError();
13741 
13742   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13743     return E;
13744 
13745   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13746                                            E->getNumExpansions());
13747 }
13748 
13749 template<typename Derived>
13750 ExprResult
TransformSizeOfPackExpr(SizeOfPackExpr * E)13751 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13752   // If E is not value-dependent, then nothing will change when we transform it.
13753   // Note: This is an instantiation-centric view.
13754   if (!E->isValueDependent())
13755     return E;
13756 
13757   EnterExpressionEvaluationContext Unevaluated(
13758       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13759 
13760   ArrayRef<TemplateArgument> PackArgs;
13761   TemplateArgument ArgStorage;
13762 
13763   // Find the argument list to transform.
13764   if (E->isPartiallySubstituted()) {
13765     PackArgs = E->getPartialArguments();
13766   } else if (E->isValueDependent()) {
13767     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13768     bool ShouldExpand = false;
13769     bool RetainExpansion = false;
13770     std::optional<unsigned> NumExpansions;
13771     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13772                                              Unexpanded,
13773                                              ShouldExpand, RetainExpansion,
13774                                              NumExpansions))
13775       return ExprError();
13776 
13777     // If we need to expand the pack, build a template argument from it and
13778     // expand that.
13779     if (ShouldExpand) {
13780       auto *Pack = E->getPack();
13781       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13782         ArgStorage = getSema().Context.getPackExpansionType(
13783             getSema().Context.getTypeDeclType(TTPD), std::nullopt);
13784       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13785         ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt);
13786       } else {
13787         auto *VD = cast<ValueDecl>(Pack);
13788         ExprResult DRE = getSema().BuildDeclRefExpr(
13789             VD, VD->getType().getNonLValueExprType(getSema().Context),
13790             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13791             E->getPackLoc());
13792         if (DRE.isInvalid())
13793           return ExprError();
13794         ArgStorage = new (getSema().Context)
13795             PackExpansionExpr(getSema().Context.DependentTy, DRE.get(),
13796                               E->getPackLoc(), std::nullopt);
13797       }
13798       PackArgs = ArgStorage;
13799     }
13800   }
13801 
13802   // If we're not expanding the pack, just transform the decl.
13803   if (!PackArgs.size()) {
13804     auto *Pack = cast_or_null<NamedDecl>(
13805         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13806     if (!Pack)
13807       return ExprError();
13808     return getDerived().RebuildSizeOfPackExpr(
13809         E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(),
13810         std::nullopt, std::nullopt);
13811   }
13812 
13813   // Try to compute the result without performing a partial substitution.
13814   std::optional<unsigned> Result = 0;
13815   for (const TemplateArgument &Arg : PackArgs) {
13816     if (!Arg.isPackExpansion()) {
13817       Result = *Result + 1;
13818       continue;
13819     }
13820 
13821     TemplateArgumentLoc ArgLoc;
13822     InventTemplateArgumentLoc(Arg, ArgLoc);
13823 
13824     // Find the pattern of the pack expansion.
13825     SourceLocation Ellipsis;
13826     std::optional<unsigned> OrigNumExpansions;
13827     TemplateArgumentLoc Pattern =
13828         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13829                                                           OrigNumExpansions);
13830 
13831     // Substitute under the pack expansion. Do not expand the pack (yet).
13832     TemplateArgumentLoc OutPattern;
13833     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13834     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13835                                                /*Uneval*/ true))
13836       return true;
13837 
13838     // See if we can determine the number of arguments from the result.
13839     std::optional<unsigned> NumExpansions =
13840         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13841     if (!NumExpansions) {
13842       // No: we must be in an alias template expansion, and we're going to need
13843       // to actually expand the packs.
13844       Result = std::nullopt;
13845       break;
13846     }
13847 
13848     Result = *Result + *NumExpansions;
13849   }
13850 
13851   // Common case: we could determine the number of expansions without
13852   // substituting.
13853   if (Result)
13854     return getDerived().RebuildSizeOfPackExpr(
13855         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
13856         *Result, std::nullopt);
13857 
13858   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13859                                                E->getPackLoc());
13860   {
13861     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13862     typedef TemplateArgumentLocInventIterator<
13863         Derived, const TemplateArgument*> PackLocIterator;
13864     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13865                                    PackLocIterator(*this, PackArgs.end()),
13866                                    TransformedPackArgs, /*Uneval*/true))
13867       return ExprError();
13868   }
13869 
13870   // Check whether we managed to fully-expand the pack.
13871   // FIXME: Is it possible for us to do so and not hit the early exit path?
13872   SmallVector<TemplateArgument, 8> Args;
13873   bool PartialSubstitution = false;
13874   for (auto &Loc : TransformedPackArgs.arguments()) {
13875     Args.push_back(Loc.getArgument());
13876     if (Loc.getArgument().isPackExpansion())
13877       PartialSubstitution = true;
13878   }
13879 
13880   if (PartialSubstitution)
13881     return getDerived().RebuildSizeOfPackExpr(
13882         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
13883         std::nullopt, Args);
13884 
13885   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13886                                             E->getPackLoc(), E->getRParenLoc(),
13887                                             Args.size(), std::nullopt);
13888 }
13889 
13890 template<typename Derived>
13891 ExprResult
TransformSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)13892 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13893                                           SubstNonTypeTemplateParmPackExpr *E) {
13894   // Default behavior is to do nothing with this transformation.
13895   return E;
13896 }
13897 
13898 template<typename Derived>
13899 ExprResult
TransformSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)13900 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13901                                           SubstNonTypeTemplateParmExpr *E) {
13902   // Default behavior is to do nothing with this transformation.
13903   return E;
13904 }
13905 
13906 template<typename Derived>
13907 ExprResult
TransformFunctionParmPackExpr(FunctionParmPackExpr * E)13908 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13909   // Default behavior is to do nothing with this transformation.
13910   return E;
13911 }
13912 
13913 template<typename Derived>
13914 ExprResult
TransformMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)13915 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13916                                                   MaterializeTemporaryExpr *E) {
13917   return getDerived().TransformExpr(E->getSubExpr());
13918 }
13919 
13920 template<typename Derived>
13921 ExprResult
TransformCXXFoldExpr(CXXFoldExpr * E)13922 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13923   UnresolvedLookupExpr *Callee = nullptr;
13924   if (Expr *OldCallee = E->getCallee()) {
13925     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13926     if (CalleeResult.isInvalid())
13927       return ExprError();
13928     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13929   }
13930 
13931   Expr *Pattern = E->getPattern();
13932 
13933   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13934   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13935   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13936 
13937   // Determine whether the set of unexpanded parameter packs can and should
13938   // be expanded.
13939   bool Expand = true;
13940   bool RetainExpansion = false;
13941   std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13942                           NumExpansions = OrigNumExpansions;
13943   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13944                                            Pattern->getSourceRange(),
13945                                            Unexpanded,
13946                                            Expand, RetainExpansion,
13947                                            NumExpansions))
13948     return true;
13949 
13950   if (!Expand) {
13951     // Do not expand any packs here, just transform and rebuild a fold
13952     // expression.
13953     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13954 
13955     ExprResult LHS =
13956         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13957     if (LHS.isInvalid())
13958       return true;
13959 
13960     ExprResult RHS =
13961         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13962     if (RHS.isInvalid())
13963       return true;
13964 
13965     if (!getDerived().AlwaysRebuild() &&
13966         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13967       return E;
13968 
13969     return getDerived().RebuildCXXFoldExpr(
13970         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13971         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13972   }
13973 
13974   // Formally a fold expression expands to nested parenthesized expressions.
13975   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13976   // them.
13977   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13978     SemaRef.Diag(E->getEllipsisLoc(),
13979                  clang::diag::err_fold_expression_limit_exceeded)
13980         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13981         << E->getSourceRange();
13982     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13983     return ExprError();
13984   }
13985 
13986   // The transform has determined that we should perform an elementwise
13987   // expansion of the pattern. Do so.
13988   ExprResult Result = getDerived().TransformExpr(E->getInit());
13989   if (Result.isInvalid())
13990     return true;
13991   bool LeftFold = E->isLeftFold();
13992 
13993   // If we're retaining an expansion for a right fold, it is the innermost
13994   // component and takes the init (if any).
13995   if (!LeftFold && RetainExpansion) {
13996     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13997 
13998     ExprResult Out = getDerived().TransformExpr(Pattern);
13999     if (Out.isInvalid())
14000       return true;
14001 
14002     Result = getDerived().RebuildCXXFoldExpr(
14003         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
14004         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
14005     if (Result.isInvalid())
14006       return true;
14007   }
14008 
14009   for (unsigned I = 0; I != *NumExpansions; ++I) {
14010     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
14011         getSema(), LeftFold ? I : *NumExpansions - I - 1);
14012     ExprResult Out = getDerived().TransformExpr(Pattern);
14013     if (Out.isInvalid())
14014       return true;
14015 
14016     if (Out.get()->containsUnexpandedParameterPack()) {
14017       // We still have a pack; retain a pack expansion for this slice.
14018       Result = getDerived().RebuildCXXFoldExpr(
14019           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
14020           E->getOperator(), E->getEllipsisLoc(),
14021           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
14022           OrigNumExpansions);
14023     } else if (Result.isUsable()) {
14024       // We've got down to a single element; build a binary operator.
14025       Expr *LHS = LeftFold ? Result.get() : Out.get();
14026       Expr *RHS = LeftFold ? Out.get() : Result.get();
14027       if (Callee)
14028         Result = getDerived().RebuildCXXOperatorCallExpr(
14029             BinaryOperator::getOverloadedOperator(E->getOperator()),
14030             E->getEllipsisLoc(), Callee, LHS, RHS);
14031       else
14032         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
14033                                                     E->getOperator(), LHS, RHS);
14034     } else
14035       Result = Out;
14036 
14037     if (Result.isInvalid())
14038       return true;
14039   }
14040 
14041   // If we're retaining an expansion for a left fold, it is the outermost
14042   // component and takes the complete expansion so far as its init (if any).
14043   if (LeftFold && RetainExpansion) {
14044     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14045 
14046     ExprResult Out = getDerived().TransformExpr(Pattern);
14047     if (Out.isInvalid())
14048       return true;
14049 
14050     Result = getDerived().RebuildCXXFoldExpr(
14051         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
14052         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
14053     if (Result.isInvalid())
14054       return true;
14055   }
14056 
14057   // If we had no init and an empty pack, and we're not retaining an expansion,
14058   // then produce a fallback value or error.
14059   if (Result.isUnset())
14060     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
14061                                                 E->getOperator());
14062 
14063   return Result;
14064 }
14065 
14066 template <typename Derived>
14067 ExprResult
TransformCXXParenListInitExpr(CXXParenListInitExpr * E)14068 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) {
14069   SmallVector<Expr *, 4> TransformedInits;
14070   ArrayRef<Expr *> InitExprs = E->getInitExprs();
14071   if (TransformExprs(InitExprs.data(), InitExprs.size(), true,
14072                      TransformedInits))
14073     return ExprError();
14074 
14075   return getDerived().RebuildParenListExpr(E->getBeginLoc(), TransformedInits,
14076                                            E->getEndLoc());
14077 }
14078 
14079 template<typename Derived>
14080 ExprResult
TransformCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)14081 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
14082     CXXStdInitializerListExpr *E) {
14083   return getDerived().TransformExpr(E->getSubExpr());
14084 }
14085 
14086 template<typename Derived>
14087 ExprResult
TransformObjCStringLiteral(ObjCStringLiteral * E)14088 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
14089   return SemaRef.MaybeBindToTemporary(E);
14090 }
14091 
14092 template<typename Derived>
14093 ExprResult
TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)14094 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
14095   return E;
14096 }
14097 
14098 template<typename Derived>
14099 ExprResult
TransformObjCBoxedExpr(ObjCBoxedExpr * E)14100 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
14101   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
14102   if (SubExpr.isInvalid())
14103     return ExprError();
14104 
14105   if (!getDerived().AlwaysRebuild() &&
14106       SubExpr.get() == E->getSubExpr())
14107     return E;
14108 
14109   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
14110 }
14111 
14112 template<typename Derived>
14113 ExprResult
TransformObjCArrayLiteral(ObjCArrayLiteral * E)14114 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
14115   // Transform each of the elements.
14116   SmallVector<Expr *, 8> Elements;
14117   bool ArgChanged = false;
14118   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
14119                                   /*IsCall=*/false, Elements, &ArgChanged))
14120     return ExprError();
14121 
14122   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14123     return SemaRef.MaybeBindToTemporary(E);
14124 
14125   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
14126                                               Elements.data(),
14127                                               Elements.size());
14128 }
14129 
14130 template<typename Derived>
14131 ExprResult
TransformObjCDictionaryLiteral(ObjCDictionaryLiteral * E)14132 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
14133                                                     ObjCDictionaryLiteral *E) {
14134   // Transform each of the elements.
14135   SmallVector<ObjCDictionaryElement, 8> Elements;
14136   bool ArgChanged = false;
14137   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
14138     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
14139 
14140     if (OrigElement.isPackExpansion()) {
14141       // This key/value element is a pack expansion.
14142       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
14143       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
14144       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
14145       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
14146 
14147       // Determine whether the set of unexpanded parameter packs can
14148       // and should be expanded.
14149       bool Expand = true;
14150       bool RetainExpansion = false;
14151       std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
14152       std::optional<unsigned> NumExpansions = OrigNumExpansions;
14153       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
14154                                OrigElement.Value->getEndLoc());
14155       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
14156                                                PatternRange, Unexpanded, Expand,
14157                                                RetainExpansion, NumExpansions))
14158         return ExprError();
14159 
14160       if (!Expand) {
14161         // The transform has determined that we should perform a simple
14162         // transformation on the pack expansion, producing another pack
14163         // expansion.
14164         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14165         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14166         if (Key.isInvalid())
14167           return ExprError();
14168 
14169         if (Key.get() != OrigElement.Key)
14170           ArgChanged = true;
14171 
14172         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14173         if (Value.isInvalid())
14174           return ExprError();
14175 
14176         if (Value.get() != OrigElement.Value)
14177           ArgChanged = true;
14178 
14179         ObjCDictionaryElement Expansion = {
14180           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
14181         };
14182         Elements.push_back(Expansion);
14183         continue;
14184       }
14185 
14186       // Record right away that the argument was changed.  This needs
14187       // to happen even if the array expands to nothing.
14188       ArgChanged = true;
14189 
14190       // The transform has determined that we should perform an elementwise
14191       // expansion of the pattern. Do so.
14192       for (unsigned I = 0; I != *NumExpansions; ++I) {
14193         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
14194         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14195         if (Key.isInvalid())
14196           return ExprError();
14197 
14198         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14199         if (Value.isInvalid())
14200           return ExprError();
14201 
14202         ObjCDictionaryElement Element = {
14203           Key.get(), Value.get(), SourceLocation(), NumExpansions
14204         };
14205 
14206         // If any unexpanded parameter packs remain, we still have a
14207         // pack expansion.
14208         // FIXME: Can this really happen?
14209         if (Key.get()->containsUnexpandedParameterPack() ||
14210             Value.get()->containsUnexpandedParameterPack())
14211           Element.EllipsisLoc = OrigElement.EllipsisLoc;
14212 
14213         Elements.push_back(Element);
14214       }
14215 
14216       // FIXME: Retain a pack expansion if RetainExpansion is true.
14217 
14218       // We've finished with this pack expansion.
14219       continue;
14220     }
14221 
14222     // Transform and check key.
14223     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14224     if (Key.isInvalid())
14225       return ExprError();
14226 
14227     if (Key.get() != OrigElement.Key)
14228       ArgChanged = true;
14229 
14230     // Transform and check value.
14231     ExprResult Value
14232       = getDerived().TransformExpr(OrigElement.Value);
14233     if (Value.isInvalid())
14234       return ExprError();
14235 
14236     if (Value.get() != OrigElement.Value)
14237       ArgChanged = true;
14238 
14239     ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(),
14240                                      std::nullopt};
14241     Elements.push_back(Element);
14242   }
14243 
14244   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14245     return SemaRef.MaybeBindToTemporary(E);
14246 
14247   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
14248                                                    Elements);
14249 }
14250 
14251 template<typename Derived>
14252 ExprResult
TransformObjCEncodeExpr(ObjCEncodeExpr * E)14253 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
14254   TypeSourceInfo *EncodedTypeInfo
14255     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
14256   if (!EncodedTypeInfo)
14257     return ExprError();
14258 
14259   if (!getDerived().AlwaysRebuild() &&
14260       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
14261     return E;
14262 
14263   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
14264                                             EncodedTypeInfo,
14265                                             E->getRParenLoc());
14266 }
14267 
14268 template<typename Derived>
14269 ExprResult TreeTransform<Derived>::
TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)14270 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
14271   // This is a kind of implicit conversion, and it needs to get dropped
14272   // and recomputed for the same general reasons that ImplicitCastExprs
14273   // do, as well a more specific one: this expression is only valid when
14274   // it appears *immediately* as an argument expression.
14275   return getDerived().TransformExpr(E->getSubExpr());
14276 }
14277 
14278 template<typename Derived>
14279 ExprResult TreeTransform<Derived>::
TransformObjCBridgedCastExpr(ObjCBridgedCastExpr * E)14280 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
14281   TypeSourceInfo *TSInfo
14282     = getDerived().TransformType(E->getTypeInfoAsWritten());
14283   if (!TSInfo)
14284     return ExprError();
14285 
14286   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
14287   if (Result.isInvalid())
14288     return ExprError();
14289 
14290   if (!getDerived().AlwaysRebuild() &&
14291       TSInfo == E->getTypeInfoAsWritten() &&
14292       Result.get() == E->getSubExpr())
14293     return E;
14294 
14295   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
14296                                       E->getBridgeKeywordLoc(), TSInfo,
14297                                       Result.get());
14298 }
14299 
14300 template <typename Derived>
TransformObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr * E)14301 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
14302     ObjCAvailabilityCheckExpr *E) {
14303   return E;
14304 }
14305 
14306 template<typename Derived>
14307 ExprResult
TransformObjCMessageExpr(ObjCMessageExpr * E)14308 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
14309   // Transform arguments.
14310   bool ArgChanged = false;
14311   SmallVector<Expr*, 8> Args;
14312   Args.reserve(E->getNumArgs());
14313   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
14314                                   &ArgChanged))
14315     return ExprError();
14316 
14317   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
14318     // Class message: transform the receiver type.
14319     TypeSourceInfo *ReceiverTypeInfo
14320       = getDerived().TransformType(E->getClassReceiverTypeInfo());
14321     if (!ReceiverTypeInfo)
14322       return ExprError();
14323 
14324     // If nothing changed, just retain the existing message send.
14325     if (!getDerived().AlwaysRebuild() &&
14326         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
14327       return SemaRef.MaybeBindToTemporary(E);
14328 
14329     // Build a new class message send.
14330     SmallVector<SourceLocation, 16> SelLocs;
14331     E->getSelectorLocs(SelLocs);
14332     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
14333                                                E->getSelector(),
14334                                                SelLocs,
14335                                                E->getMethodDecl(),
14336                                                E->getLeftLoc(),
14337                                                Args,
14338                                                E->getRightLoc());
14339   }
14340   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
14341            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
14342     if (!E->getMethodDecl())
14343       return ExprError();
14344 
14345     // Build a new class message send to 'super'.
14346     SmallVector<SourceLocation, 16> SelLocs;
14347     E->getSelectorLocs(SelLocs);
14348     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
14349                                                E->getSelector(),
14350                                                SelLocs,
14351                                                E->getReceiverType(),
14352                                                E->getMethodDecl(),
14353                                                E->getLeftLoc(),
14354                                                Args,
14355                                                E->getRightLoc());
14356   }
14357 
14358   // Instance message: transform the receiver
14359   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14360          "Only class and instance messages may be instantiated");
14361   ExprResult Receiver
14362     = getDerived().TransformExpr(E->getInstanceReceiver());
14363   if (Receiver.isInvalid())
14364     return ExprError();
14365 
14366   // If nothing changed, just retain the existing message send.
14367   if (!getDerived().AlwaysRebuild() &&
14368       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14369     return SemaRef.MaybeBindToTemporary(E);
14370 
14371   // Build a new instance message send.
14372   SmallVector<SourceLocation, 16> SelLocs;
14373   E->getSelectorLocs(SelLocs);
14374   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14375                                              E->getSelector(),
14376                                              SelLocs,
14377                                              E->getMethodDecl(),
14378                                              E->getLeftLoc(),
14379                                              Args,
14380                                              E->getRightLoc());
14381 }
14382 
14383 template<typename Derived>
14384 ExprResult
TransformObjCSelectorExpr(ObjCSelectorExpr * E)14385 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14386   return E;
14387 }
14388 
14389 template<typename Derived>
14390 ExprResult
TransformObjCProtocolExpr(ObjCProtocolExpr * E)14391 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14392   return E;
14393 }
14394 
14395 template<typename Derived>
14396 ExprResult
TransformObjCIvarRefExpr(ObjCIvarRefExpr * E)14397 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14398   // Transform the base expression.
14399   ExprResult Base = getDerived().TransformExpr(E->getBase());
14400   if (Base.isInvalid())
14401     return ExprError();
14402 
14403   // We don't need to transform the ivar; it will never change.
14404 
14405   // If nothing changed, just retain the existing expression.
14406   if (!getDerived().AlwaysRebuild() &&
14407       Base.get() == E->getBase())
14408     return E;
14409 
14410   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14411                                              E->getLocation(),
14412                                              E->isArrow(), E->isFreeIvar());
14413 }
14414 
14415 template<typename Derived>
14416 ExprResult
TransformObjCPropertyRefExpr(ObjCPropertyRefExpr * E)14417 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14418   // 'super' and types never change. Property never changes. Just
14419   // retain the existing expression.
14420   if (!E->isObjectReceiver())
14421     return E;
14422 
14423   // Transform the base expression.
14424   ExprResult Base = getDerived().TransformExpr(E->getBase());
14425   if (Base.isInvalid())
14426     return ExprError();
14427 
14428   // We don't need to transform the property; it will never change.
14429 
14430   // If nothing changed, just retain the existing expression.
14431   if (!getDerived().AlwaysRebuild() &&
14432       Base.get() == E->getBase())
14433     return E;
14434 
14435   if (E->isExplicitProperty())
14436     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14437                                                    E->getExplicitProperty(),
14438                                                    E->getLocation());
14439 
14440   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14441                                                  SemaRef.Context.PseudoObjectTy,
14442                                                  E->getImplicitPropertyGetter(),
14443                                                  E->getImplicitPropertySetter(),
14444                                                  E->getLocation());
14445 }
14446 
14447 template<typename Derived>
14448 ExprResult
TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)14449 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14450   // Transform the base expression.
14451   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14452   if (Base.isInvalid())
14453     return ExprError();
14454 
14455   // Transform the key expression.
14456   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14457   if (Key.isInvalid())
14458     return ExprError();
14459 
14460   // If nothing changed, just retain the existing expression.
14461   if (!getDerived().AlwaysRebuild() &&
14462       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14463     return E;
14464 
14465   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14466                                                   Base.get(), Key.get(),
14467                                                   E->getAtIndexMethodDecl(),
14468                                                   E->setAtIndexMethodDecl());
14469 }
14470 
14471 template<typename Derived>
14472 ExprResult
TransformObjCIsaExpr(ObjCIsaExpr * E)14473 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14474   // Transform the base expression.
14475   ExprResult Base = getDerived().TransformExpr(E->getBase());
14476   if (Base.isInvalid())
14477     return ExprError();
14478 
14479   // If nothing changed, just retain the existing expression.
14480   if (!getDerived().AlwaysRebuild() &&
14481       Base.get() == E->getBase())
14482     return E;
14483 
14484   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14485                                          E->getOpLoc(),
14486                                          E->isArrow());
14487 }
14488 
14489 template<typename Derived>
14490 ExprResult
TransformShuffleVectorExpr(ShuffleVectorExpr * E)14491 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14492   bool ArgumentChanged = false;
14493   SmallVector<Expr*, 8> SubExprs;
14494   SubExprs.reserve(E->getNumSubExprs());
14495   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14496                                   SubExprs, &ArgumentChanged))
14497     return ExprError();
14498 
14499   if (!getDerived().AlwaysRebuild() &&
14500       !ArgumentChanged)
14501     return E;
14502 
14503   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14504                                                SubExprs,
14505                                                E->getRParenLoc());
14506 }
14507 
14508 template<typename Derived>
14509 ExprResult
TransformConvertVectorExpr(ConvertVectorExpr * E)14510 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14511   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14512   if (SrcExpr.isInvalid())
14513     return ExprError();
14514 
14515   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14516   if (!Type)
14517     return ExprError();
14518 
14519   if (!getDerived().AlwaysRebuild() &&
14520       Type == E->getTypeSourceInfo() &&
14521       SrcExpr.get() == E->getSrcExpr())
14522     return E;
14523 
14524   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14525                                                SrcExpr.get(), Type,
14526                                                E->getRParenLoc());
14527 }
14528 
14529 template<typename Derived>
14530 ExprResult
TransformBlockExpr(BlockExpr * E)14531 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14532   BlockDecl *oldBlock = E->getBlockDecl();
14533 
14534   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14535   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14536 
14537   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14538   blockScope->TheDecl->setBlockMissingReturnType(
14539                          oldBlock->blockMissingReturnType());
14540 
14541   SmallVector<ParmVarDecl*, 4> params;
14542   SmallVector<QualType, 4> paramTypes;
14543 
14544   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14545 
14546   // Parameter substitution.
14547   Sema::ExtParameterInfoBuilder extParamInfos;
14548   if (getDerived().TransformFunctionTypeParams(
14549           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14550           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14551           extParamInfos)) {
14552     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14553     return ExprError();
14554   }
14555 
14556   QualType exprResultType =
14557       getDerived().TransformType(exprFunctionType->getReturnType());
14558 
14559   auto epi = exprFunctionType->getExtProtoInfo();
14560   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14561 
14562   QualType functionType =
14563     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14564   blockScope->FunctionType = functionType;
14565 
14566   // Set the parameters on the block decl.
14567   if (!params.empty())
14568     blockScope->TheDecl->setParams(params);
14569 
14570   if (!oldBlock->blockMissingReturnType()) {
14571     blockScope->HasImplicitReturnType = false;
14572     blockScope->ReturnType = exprResultType;
14573   }
14574 
14575   // Transform the body
14576   StmtResult body = getDerived().TransformStmt(E->getBody());
14577   if (body.isInvalid()) {
14578     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14579     return ExprError();
14580   }
14581 
14582 #ifndef NDEBUG
14583   // In builds with assertions, make sure that we captured everything we
14584   // captured before.
14585   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14586     for (const auto &I : oldBlock->captures()) {
14587       VarDecl *oldCapture = I.getVariable();
14588 
14589       // Ignore parameter packs.
14590       if (oldCapture->isParameterPack())
14591         continue;
14592 
14593       VarDecl *newCapture =
14594         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14595                                                  oldCapture));
14596       assert(blockScope->CaptureMap.count(newCapture));
14597     }
14598     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14599   }
14600 #endif
14601 
14602   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14603                                     /*Scope=*/nullptr);
14604 }
14605 
14606 template<typename Derived>
14607 ExprResult
TransformAsTypeExpr(AsTypeExpr * E)14608 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14609   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14610   if (SrcExpr.isInvalid())
14611     return ExprError();
14612 
14613   QualType Type = getDerived().TransformType(E->getType());
14614 
14615   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14616                                  E->getRParenLoc());
14617 }
14618 
14619 template<typename Derived>
14620 ExprResult
TransformAtomicExpr(AtomicExpr * E)14621 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14622   bool ArgumentChanged = false;
14623   SmallVector<Expr*, 8> SubExprs;
14624   SubExprs.reserve(E->getNumSubExprs());
14625   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14626                                   SubExprs, &ArgumentChanged))
14627     return ExprError();
14628 
14629   if (!getDerived().AlwaysRebuild() &&
14630       !ArgumentChanged)
14631     return E;
14632 
14633   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14634                                         E->getOp(), E->getRParenLoc());
14635 }
14636 
14637 //===----------------------------------------------------------------------===//
14638 // Type reconstruction
14639 //===----------------------------------------------------------------------===//
14640 
14641 template<typename Derived>
RebuildPointerType(QualType PointeeType,SourceLocation Star)14642 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14643                                                     SourceLocation Star) {
14644   return SemaRef.BuildPointerType(PointeeType, Star,
14645                                   getDerived().getBaseEntity());
14646 }
14647 
14648 template<typename Derived>
RebuildBlockPointerType(QualType PointeeType,SourceLocation Star)14649 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14650                                                          SourceLocation Star) {
14651   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14652                                        getDerived().getBaseEntity());
14653 }
14654 
14655 template<typename Derived>
14656 QualType
RebuildReferenceType(QualType ReferentType,bool WrittenAsLValue,SourceLocation Sigil)14657 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14658                                              bool WrittenAsLValue,
14659                                              SourceLocation Sigil) {
14660   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14661                                     Sigil, getDerived().getBaseEntity());
14662 }
14663 
14664 template<typename Derived>
14665 QualType
RebuildMemberPointerType(QualType PointeeType,QualType ClassType,SourceLocation Sigil)14666 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14667                                                  QualType ClassType,
14668                                                  SourceLocation Sigil) {
14669   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14670                                         getDerived().getBaseEntity());
14671 }
14672 
14673 template<typename Derived>
RebuildObjCTypeParamType(const ObjCTypeParamDecl * Decl,SourceLocation ProtocolLAngleLoc,ArrayRef<ObjCProtocolDecl * > Protocols,ArrayRef<SourceLocation> ProtocolLocs,SourceLocation ProtocolRAngleLoc)14674 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14675            const ObjCTypeParamDecl *Decl,
14676            SourceLocation ProtocolLAngleLoc,
14677            ArrayRef<ObjCProtocolDecl *> Protocols,
14678            ArrayRef<SourceLocation> ProtocolLocs,
14679            SourceLocation ProtocolRAngleLoc) {
14680   return SemaRef.BuildObjCTypeParamType(Decl,
14681                                         ProtocolLAngleLoc, Protocols,
14682                                         ProtocolLocs, ProtocolRAngleLoc,
14683                                         /*FailOnError=*/true);
14684 }
14685 
14686 template<typename Derived>
RebuildObjCObjectType(QualType BaseType,SourceLocation Loc,SourceLocation TypeArgsLAngleLoc,ArrayRef<TypeSourceInfo * > TypeArgs,SourceLocation TypeArgsRAngleLoc,SourceLocation ProtocolLAngleLoc,ArrayRef<ObjCProtocolDecl * > Protocols,ArrayRef<SourceLocation> ProtocolLocs,SourceLocation ProtocolRAngleLoc)14687 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14688            QualType BaseType,
14689            SourceLocation Loc,
14690            SourceLocation TypeArgsLAngleLoc,
14691            ArrayRef<TypeSourceInfo *> TypeArgs,
14692            SourceLocation TypeArgsRAngleLoc,
14693            SourceLocation ProtocolLAngleLoc,
14694            ArrayRef<ObjCProtocolDecl *> Protocols,
14695            ArrayRef<SourceLocation> ProtocolLocs,
14696            SourceLocation ProtocolRAngleLoc) {
14697   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs,
14698                                      TypeArgsRAngleLoc, ProtocolLAngleLoc,
14699                                      Protocols, ProtocolLocs, ProtocolRAngleLoc,
14700                                      /*FailOnError=*/true,
14701                                      /*Rebuilding=*/true);
14702 }
14703 
14704 template<typename Derived>
RebuildObjCObjectPointerType(QualType PointeeType,SourceLocation Star)14705 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14706            QualType PointeeType,
14707            SourceLocation Star) {
14708   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14709 }
14710 
14711 template<typename Derived>
14712 QualType
RebuildArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt * Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14713 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14714                                          ArrayType::ArraySizeModifier SizeMod,
14715                                          const llvm::APInt *Size,
14716                                          Expr *SizeExpr,
14717                                          unsigned IndexTypeQuals,
14718                                          SourceRange BracketsRange) {
14719   if (SizeExpr || !Size)
14720     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14721                                   IndexTypeQuals, BracketsRange,
14722                                   getDerived().getBaseEntity());
14723 
14724   QualType Types[] = {
14725     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14726     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14727     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14728   };
14729   QualType SizeType;
14730   for (const auto &T : Types)
14731     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) {
14732       SizeType = T;
14733       break;
14734     }
14735 
14736   // Note that we can return a VariableArrayType here in the case where
14737   // the element type was a dependent VariableArrayType.
14738   IntegerLiteral *ArraySize
14739       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14740                                /*FIXME*/BracketsRange.getBegin());
14741   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14742                                 IndexTypeQuals, BracketsRange,
14743                                 getDerived().getBaseEntity());
14744 }
14745 
14746 template<typename Derived>
14747 QualType
RebuildConstantArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt & Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14748 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14749                                                  ArrayType::ArraySizeModifier SizeMod,
14750                                                  const llvm::APInt &Size,
14751                                                  Expr *SizeExpr,
14752                                                  unsigned IndexTypeQuals,
14753                                                  SourceRange BracketsRange) {
14754   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14755                                         IndexTypeQuals, BracketsRange);
14756 }
14757 
14758 template<typename Derived>
14759 QualType
RebuildIncompleteArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,unsigned IndexTypeQuals,SourceRange BracketsRange)14760 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14761                                           ArrayType::ArraySizeModifier SizeMod,
14762                                                  unsigned IndexTypeQuals,
14763                                                    SourceRange BracketsRange) {
14764   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14765                                        IndexTypeQuals, BracketsRange);
14766 }
14767 
14768 template<typename Derived>
14769 QualType
RebuildVariableArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14770 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14771                                           ArrayType::ArraySizeModifier SizeMod,
14772                                                  Expr *SizeExpr,
14773                                                  unsigned IndexTypeQuals,
14774                                                  SourceRange BracketsRange) {
14775   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14776                                        SizeExpr,
14777                                        IndexTypeQuals, BracketsRange);
14778 }
14779 
14780 template<typename Derived>
14781 QualType
RebuildDependentSizedArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14782 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14783                                           ArrayType::ArraySizeModifier SizeMod,
14784                                                        Expr *SizeExpr,
14785                                                        unsigned IndexTypeQuals,
14786                                                    SourceRange BracketsRange) {
14787   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14788                                        SizeExpr,
14789                                        IndexTypeQuals, BracketsRange);
14790 }
14791 
14792 template <typename Derived>
RebuildDependentAddressSpaceType(QualType PointeeType,Expr * AddrSpaceExpr,SourceLocation AttributeLoc)14793 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14794     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14795   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14796                                           AttributeLoc);
14797 }
14798 
14799 template <typename Derived>
14800 QualType
RebuildVectorType(QualType ElementType,unsigned NumElements,VectorType::VectorKind VecKind)14801 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14802                                           unsigned NumElements,
14803                                           VectorType::VectorKind VecKind) {
14804   // FIXME: semantic checking!
14805   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14806 }
14807 
14808 template <typename Derived>
RebuildDependentVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc,VectorType::VectorKind VecKind)14809 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14810     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14811     VectorType::VectorKind VecKind) {
14812   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14813 }
14814 
14815 template<typename Derived>
RebuildExtVectorType(QualType ElementType,unsigned NumElements,SourceLocation AttributeLoc)14816 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14817                                                       unsigned NumElements,
14818                                                  SourceLocation AttributeLoc) {
14819   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14820                           NumElements, true);
14821   IntegerLiteral *VectorSize
14822     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14823                              AttributeLoc);
14824   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14825 }
14826 
14827 template<typename Derived>
14828 QualType
RebuildDependentSizedExtVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc)14829 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14830                                                            Expr *SizeExpr,
14831                                                   SourceLocation AttributeLoc) {
14832   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14833 }
14834 
14835 template <typename Derived>
RebuildConstantMatrixType(QualType ElementType,unsigned NumRows,unsigned NumColumns)14836 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14837     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14838   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14839                                                NumColumns);
14840 }
14841 
14842 template <typename Derived>
RebuildDependentSizedMatrixType(QualType ElementType,Expr * RowExpr,Expr * ColumnExpr,SourceLocation AttributeLoc)14843 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14844     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14845     SourceLocation AttributeLoc) {
14846   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14847                                  AttributeLoc);
14848 }
14849 
14850 template<typename Derived>
RebuildFunctionProtoType(QualType T,MutableArrayRef<QualType> ParamTypes,const FunctionProtoType::ExtProtoInfo & EPI)14851 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14852     QualType T,
14853     MutableArrayRef<QualType> ParamTypes,
14854     const FunctionProtoType::ExtProtoInfo &EPI) {
14855   return SemaRef.BuildFunctionType(T, ParamTypes,
14856                                    getDerived().getBaseLocation(),
14857                                    getDerived().getBaseEntity(),
14858                                    EPI);
14859 }
14860 
14861 template<typename Derived>
RebuildFunctionNoProtoType(QualType T)14862 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14863   return SemaRef.Context.getFunctionNoProtoType(T);
14864 }
14865 
14866 template<typename Derived>
RebuildUnresolvedUsingType(SourceLocation Loc,Decl * D)14867 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14868                                                             Decl *D) {
14869   assert(D && "no decl found");
14870   if (D->isInvalidDecl()) return QualType();
14871 
14872   // FIXME: Doesn't account for ObjCInterfaceDecl!
14873   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14874     // A valid resolved using typename pack expansion decl can have multiple
14875     // UsingDecls, but they must each have exactly one type, and it must be
14876     // the same type in every case. But we must have at least one expansion!
14877     if (UPD->expansions().empty()) {
14878       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14879           << UPD->isCXXClassMember() << UPD;
14880       return QualType();
14881     }
14882 
14883     // We might still have some unresolved types. Try to pick a resolved type
14884     // if we can. The final instantiation will check that the remaining
14885     // unresolved types instantiate to the type we pick.
14886     QualType FallbackT;
14887     QualType T;
14888     for (auto *E : UPD->expansions()) {
14889       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14890       if (ThisT.isNull())
14891         continue;
14892       else if (ThisT->getAs<UnresolvedUsingType>())
14893         FallbackT = ThisT;
14894       else if (T.isNull())
14895         T = ThisT;
14896       else
14897         assert(getSema().Context.hasSameType(ThisT, T) &&
14898                "mismatched resolved types in using pack expansion");
14899     }
14900     return T.isNull() ? FallbackT : T;
14901   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14902     assert(Using->hasTypename() &&
14903            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14904 
14905     // A valid resolved using typename decl points to exactly one type decl.
14906     assert(++Using->shadow_begin() == Using->shadow_end());
14907 
14908     UsingShadowDecl *Shadow = *Using->shadow_begin();
14909     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14910       return QualType();
14911     return SemaRef.Context.getUsingType(
14912         Shadow, SemaRef.Context.getTypeDeclType(
14913                     cast<TypeDecl>(Shadow->getTargetDecl())));
14914   } else {
14915     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14916            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14917     return SemaRef.Context.getTypeDeclType(
14918         cast<UnresolvedUsingTypenameDecl>(D));
14919   }
14920 }
14921 
14922 template <typename Derived>
RebuildTypeOfExprType(Expr * E,SourceLocation,TypeOfKind Kind)14923 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation,
14924                                                        TypeOfKind Kind) {
14925   return SemaRef.BuildTypeofExprType(E, Kind);
14926 }
14927 
14928 template<typename Derived>
RebuildTypeOfType(QualType Underlying,TypeOfKind Kind)14929 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying,
14930                                                    TypeOfKind Kind) {
14931   return SemaRef.Context.getTypeOfType(Underlying, Kind);
14932 }
14933 
14934 template <typename Derived>
RebuildDecltypeType(Expr * E,SourceLocation)14935 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14936   return SemaRef.BuildDecltypeType(E);
14937 }
14938 
14939 template<typename Derived>
RebuildUnaryTransformType(QualType BaseType,UnaryTransformType::UTTKind UKind,SourceLocation Loc)14940 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14941                                             UnaryTransformType::UTTKind UKind,
14942                                             SourceLocation Loc) {
14943   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14944 }
14945 
14946 template<typename Derived>
RebuildTemplateSpecializationType(TemplateName Template,SourceLocation TemplateNameLoc,TemplateArgumentListInfo & TemplateArgs)14947 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14948                                                       TemplateName Template,
14949                                              SourceLocation TemplateNameLoc,
14950                                      TemplateArgumentListInfo &TemplateArgs) {
14951   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14952 }
14953 
14954 template<typename Derived>
RebuildAtomicType(QualType ValueType,SourceLocation KWLoc)14955 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14956                                                    SourceLocation KWLoc) {
14957   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14958 }
14959 
14960 template<typename Derived>
RebuildPipeType(QualType ValueType,SourceLocation KWLoc,bool isReadPipe)14961 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14962                                                  SourceLocation KWLoc,
14963                                                  bool isReadPipe) {
14964   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14965                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14966 }
14967 
14968 template <typename Derived>
RebuildBitIntType(bool IsUnsigned,unsigned NumBits,SourceLocation Loc)14969 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14970                                                    unsigned NumBits,
14971                                                    SourceLocation Loc) {
14972   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14973                         NumBits, true);
14974   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14975                                                 SemaRef.Context.IntTy, Loc);
14976   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14977 }
14978 
14979 template <typename Derived>
RebuildDependentBitIntType(bool IsUnsigned,Expr * NumBitsExpr,SourceLocation Loc)14980 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14981     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14982   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14983 }
14984 
14985 template<typename Derived>
14986 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,bool TemplateKW,TemplateDecl * Template)14987 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14988                                             bool TemplateKW,
14989                                             TemplateDecl *Template) {
14990   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14991                                                   TemplateName(Template));
14992 }
14993 
14994 template<typename Derived>
14995 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,SourceLocation TemplateKWLoc,const IdentifierInfo & Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope,bool AllowInjectedClassName)14996 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14997                                             SourceLocation TemplateKWLoc,
14998                                             const IdentifierInfo &Name,
14999                                             SourceLocation NameLoc,
15000                                             QualType ObjectType,
15001                                             NamedDecl *FirstQualifierInScope,
15002                                             bool AllowInjectedClassName) {
15003   UnqualifiedId TemplateName;
15004   TemplateName.setIdentifier(&Name, NameLoc);
15005   Sema::TemplateTy Template;
15006   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
15007                               TemplateName, ParsedType::make(ObjectType),
15008                               /*EnteringContext=*/false, Template,
15009                               AllowInjectedClassName);
15010   return Template.get();
15011 }
15012 
15013 template<typename Derived>
15014 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,SourceLocation TemplateKWLoc,OverloadedOperatorKind Operator,SourceLocation NameLoc,QualType ObjectType,bool AllowInjectedClassName)15015 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15016                                             SourceLocation TemplateKWLoc,
15017                                             OverloadedOperatorKind Operator,
15018                                             SourceLocation NameLoc,
15019                                             QualType ObjectType,
15020                                             bool AllowInjectedClassName) {
15021   UnqualifiedId Name;
15022   // FIXME: Bogus location information.
15023   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
15024   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
15025   Sema::TemplateTy Template;
15026   getSema().ActOnTemplateName(
15027       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
15028       /*EnteringContext=*/false, Template, AllowInjectedClassName);
15029   return Template.get();
15030 }
15031 
15032 template<typename Derived>
15033 ExprResult
RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,SourceLocation OpLoc,Expr * OrigCallee,Expr * First,Expr * Second)15034 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
15035                                                    SourceLocation OpLoc,
15036                                                    Expr *OrigCallee,
15037                                                    Expr *First,
15038                                                    Expr *Second) {
15039   Expr *Callee = OrigCallee->IgnoreParenCasts();
15040   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
15041 
15042   if (First->getObjectKind() == OK_ObjCProperty) {
15043     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15044     if (BinaryOperator::isAssignmentOp(Opc))
15045       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
15046                                                  First, Second);
15047     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
15048     if (Result.isInvalid())
15049       return ExprError();
15050     First = Result.get();
15051   }
15052 
15053   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
15054     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
15055     if (Result.isInvalid())
15056       return ExprError();
15057     Second = Result.get();
15058   }
15059 
15060   // Determine whether this should be a builtin operation.
15061   if (Op == OO_Subscript) {
15062     if (!First->getType()->isOverloadableType() &&
15063         !Second->getType()->isOverloadableType())
15064       return getSema().CreateBuiltinArraySubscriptExpr(
15065           First, Callee->getBeginLoc(), Second, OpLoc);
15066   } else if (Op == OO_Arrow) {
15067     // It is possible that the type refers to a RecoveryExpr created earlier
15068     // in the tree transformation.
15069     if (First->getType()->isDependentType())
15070       return ExprError();
15071     // -> is never a builtin operation.
15072     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
15073   } else if (Second == nullptr || isPostIncDec) {
15074     if (!First->getType()->isOverloadableType() ||
15075         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
15076       // The argument is not of overloadable type, or this is an expression
15077       // of the form &Class::member, so try to create a built-in unary
15078       // operation.
15079       UnaryOperatorKind Opc
15080         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15081 
15082       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
15083     }
15084   } else {
15085     if (!First->getType()->isOverloadableType() &&
15086         !Second->getType()->isOverloadableType()) {
15087       // Neither of the arguments is an overloadable type, so try to
15088       // create a built-in binary operation.
15089       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15090       ExprResult Result
15091         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
15092       if (Result.isInvalid())
15093         return ExprError();
15094 
15095       return Result;
15096     }
15097   }
15098 
15099   // Compute the transformed set of functions (and function templates) to be
15100   // used during overload resolution.
15101   UnresolvedSet<16> Functions;
15102   bool RequiresADL;
15103 
15104   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
15105     Functions.append(ULE->decls_begin(), ULE->decls_end());
15106     // If the overload could not be resolved in the template definition
15107     // (because we had a dependent argument), ADL is performed as part of
15108     // template instantiation.
15109     RequiresADL = ULE->requiresADL();
15110   } else {
15111     // If we've resolved this to a particular non-member function, just call
15112     // that function. If we resolved it to a member function,
15113     // CreateOverloaded* will find that function for us.
15114     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
15115     if (!isa<CXXMethodDecl>(ND))
15116       Functions.addDecl(ND);
15117     RequiresADL = false;
15118   }
15119 
15120   // Add any functions found via argument-dependent lookup.
15121   Expr *Args[2] = { First, Second };
15122   unsigned NumArgs = 1 + (Second != nullptr);
15123 
15124   // Create the overloaded operator invocation for unary operators.
15125   if (NumArgs == 1 || isPostIncDec) {
15126     UnaryOperatorKind Opc
15127       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15128     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
15129                                            RequiresADL);
15130   }
15131 
15132   if (Op == OO_Subscript) {
15133     SourceLocation LBrace;
15134     SourceLocation RBrace;
15135 
15136     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
15137       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
15138       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
15139       RBrace = NameLoc.getCXXOperatorNameEndLoc();
15140     } else {
15141       LBrace = Callee->getBeginLoc();
15142       RBrace = OpLoc;
15143     }
15144 
15145     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
15146                                                       First, Second);
15147   }
15148 
15149   // Create the overloaded operator invocation for binary operators.
15150   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15151   ExprResult Result = SemaRef.CreateOverloadedBinOp(
15152       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
15153   if (Result.isInvalid())
15154     return ExprError();
15155 
15156   return Result;
15157 }
15158 
15159 template<typename Derived>
15160 ExprResult
RebuildCXXPseudoDestructorExpr(Expr * Base,SourceLocation OperatorLoc,bool isArrow,CXXScopeSpec & SS,TypeSourceInfo * ScopeType,SourceLocation CCLoc,SourceLocation TildeLoc,PseudoDestructorTypeStorage Destroyed)15161 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
15162                                                      SourceLocation OperatorLoc,
15163                                                        bool isArrow,
15164                                                        CXXScopeSpec &SS,
15165                                                      TypeSourceInfo *ScopeType,
15166                                                        SourceLocation CCLoc,
15167                                                        SourceLocation TildeLoc,
15168                                         PseudoDestructorTypeStorage Destroyed) {
15169   QualType BaseType = Base->getType();
15170   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
15171       (!isArrow && !BaseType->getAs<RecordType>()) ||
15172       (isArrow && BaseType->getAs<PointerType>() &&
15173        !BaseType->castAs<PointerType>()->getPointeeType()
15174                                               ->template getAs<RecordType>())){
15175     // This pseudo-destructor expression is still a pseudo-destructor.
15176     return SemaRef.BuildPseudoDestructorExpr(
15177         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
15178         CCLoc, TildeLoc, Destroyed);
15179   }
15180 
15181   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
15182   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
15183                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
15184   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
15185   NameInfo.setNamedTypeInfo(DestroyedType);
15186 
15187   // The scope type is now known to be a valid nested name specifier
15188   // component. Tack it on to the end of the nested name specifier.
15189   if (ScopeType) {
15190     if (!ScopeType->getType()->getAs<TagType>()) {
15191       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
15192                      diag::err_expected_class_or_namespace)
15193           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
15194       return ExprError();
15195     }
15196     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
15197               CCLoc);
15198   }
15199 
15200   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
15201   return getSema().BuildMemberReferenceExpr(Base, BaseType,
15202                                             OperatorLoc, isArrow,
15203                                             SS, TemplateKWLoc,
15204                                             /*FIXME: FirstQualifier*/ nullptr,
15205                                             NameInfo,
15206                                             /*TemplateArgs*/ nullptr,
15207                                             /*S*/nullptr);
15208 }
15209 
15210 template<typename Derived>
15211 StmtResult
TransformCapturedStmt(CapturedStmt * S)15212 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
15213   SourceLocation Loc = S->getBeginLoc();
15214   CapturedDecl *CD = S->getCapturedDecl();
15215   unsigned NumParams = CD->getNumParams();
15216   unsigned ContextParamPos = CD->getContextParamPosition();
15217   SmallVector<Sema::CapturedParamNameType, 4> Params;
15218   for (unsigned I = 0; I < NumParams; ++I) {
15219     if (I != ContextParamPos) {
15220       Params.push_back(
15221              std::make_pair(
15222                   CD->getParam(I)->getName(),
15223                   getDerived().TransformType(CD->getParam(I)->getType())));
15224     } else {
15225       Params.push_back(std::make_pair(StringRef(), QualType()));
15226     }
15227   }
15228   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
15229                                      S->getCapturedRegionKind(), Params);
15230   StmtResult Body;
15231   {
15232     Sema::CompoundScopeRAII CompoundScope(getSema());
15233     Body = getDerived().TransformStmt(S->getCapturedStmt());
15234   }
15235 
15236   if (Body.isInvalid()) {
15237     getSema().ActOnCapturedRegionError();
15238     return StmtError();
15239   }
15240 
15241   return getSema().ActOnCapturedRegionEnd(Body.get());
15242 }
15243 
15244 } // end namespace clang
15245 
15246 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15247