xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Sema/TreeTransform.h (revision e038c9c4676b0f19b1b7dd08a940c6ed64a6d5ae)
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
ForgetPartiallySubstitutedPackRAII(Derived & Self)110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
~ForgetPartiallySubstitutedPackRAII()114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
TreeTransform(Sema & SemaRef)129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
getDerived()132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
getDerived()135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
Owned(Expr * E)139   static inline ExprResult Owned(Expr *E) { return E; }
Owned(Stmt * S)140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
getSema()144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
AlwaysRebuild()155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
ReplacingOriginal()160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is usefull when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
AllowSkippingCXXConstructExpr()167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
getBaseLocation()175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
getBaseEntity()182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
setBase(SourceLocation Loc,DeclarationName Entity)189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
TemporaryBase(TreeTransform & Self,SourceLocation Location,DeclarationName Entity)199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
~TemporaryBase()208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
AlreadyTransformed(QualType T)220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
TransformTemplateDepth(unsigned Depth)228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
DropCallArgument(Expr * E)238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
TryExpandParameterPacks(SourceLocation EllipsisLoc,SourceRange PatternRange,ArrayRef<UnexpandedParameterPack> Unexpanded,bool & ShouldExpand,bool & RetainExpansion,Optional<unsigned> & NumExpansions)279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
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. Sublcasses 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   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
TransformTemplateParameterList(TemplateParameterList * TPL)703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new typedef type.
RebuildTypedefType(TypedefNameDecl * Typedef)937   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
938     return SemaRef.Context.getTypeDeclType(Typedef);
939   }
940 
941   /// Build a new MacroDefined type.
RebuildMacroQualifiedType(QualType T,const IdentifierInfo * MacroII)942   QualType RebuildMacroQualifiedType(QualType T,
943                                      const IdentifierInfo *MacroII) {
944     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
945   }
946 
947   /// Build a new class/struct/union type.
RebuildRecordType(RecordDecl * Record)948   QualType RebuildRecordType(RecordDecl *Record) {
949     return SemaRef.Context.getTypeDeclType(Record);
950   }
951 
952   /// Build a new Enum type.
RebuildEnumType(EnumDecl * Enum)953   QualType RebuildEnumType(EnumDecl *Enum) {
954     return SemaRef.Context.getTypeDeclType(Enum);
955   }
956 
957   /// Build a new typeof(expr) type.
958   ///
959   /// By default, performs semantic analysis when building the typeof type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
962 
963   /// Build a new typeof(type) type.
964   ///
965   /// By default, builds a new TypeOfType with the given underlying type.
966   QualType RebuildTypeOfType(QualType Underlying);
967 
968   /// Build a new unary transform type.
969   QualType RebuildUnaryTransformType(QualType BaseType,
970                                      UnaryTransformType::UTTKind UKind,
971                                      SourceLocation Loc);
972 
973   /// Build a new C++11 decltype type.
974   ///
975   /// By default, performs semantic analysis when building the decltype type.
976   /// Subclasses may override this routine to provide different behavior.
977   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
978 
979   /// Build a new C++11 auto type.
980   ///
981   /// By default, builds a new AutoType with the given deduced type.
RebuildAutoType(QualType Deduced,AutoTypeKeyword Keyword,ConceptDecl * TypeConstraintConcept,ArrayRef<TemplateArgument> TypeConstraintArgs)982   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
983                            ConceptDecl *TypeConstraintConcept,
984                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
985     // Note, IsDependent is always false here: we implicitly convert an 'auto'
986     // which has been deduced to a dependent type into an undeduced 'auto', so
987     // that we'll retry deduction after the transformation.
988     return SemaRef.Context.getAutoType(Deduced, Keyword,
989                                        /*IsDependent*/ false, /*IsPack=*/false,
990                                        TypeConstraintConcept,
991                                        TypeConstraintArgs);
992   }
993 
994   /// By default, builds a new DeducedTemplateSpecializationType with the given
995   /// deduced type.
RebuildDeducedTemplateSpecializationType(TemplateName Template,QualType Deduced)996   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
997       QualType Deduced) {
998     return SemaRef.Context.getDeducedTemplateSpecializationType(
999         Template, Deduced, /*IsDependent*/ false);
1000   }
1001 
1002   /// Build a new template specialization type.
1003   ///
1004   /// By default, performs semantic analysis when building the template
1005   /// specialization type. Subclasses may override this routine to provide
1006   /// different behavior.
1007   QualType RebuildTemplateSpecializationType(TemplateName Template,
1008                                              SourceLocation TemplateLoc,
1009                                              TemplateArgumentListInfo &Args);
1010 
1011   /// Build a new parenthesized type.
1012   ///
1013   /// By default, builds a new ParenType type from the inner type.
1014   /// Subclasses may override this routine to provide different behavior.
RebuildParenType(QualType InnerType)1015   QualType RebuildParenType(QualType InnerType) {
1016     return SemaRef.BuildParenType(InnerType);
1017   }
1018 
1019   /// Build a new qualified name type.
1020   ///
1021   /// By default, builds a new ElaboratedType type from the keyword,
1022   /// the nested-name-specifier and the named type.
1023   /// Subclasses may override this routine to provide different behavior.
RebuildElaboratedType(SourceLocation KeywordLoc,ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,QualType Named)1024   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1025                                  ElaboratedTypeKeyword Keyword,
1026                                  NestedNameSpecifierLoc QualifierLoc,
1027                                  QualType Named) {
1028     return SemaRef.Context.getElaboratedType(Keyword,
1029                                          QualifierLoc.getNestedNameSpecifier(),
1030                                              Named);
1031   }
1032 
1033   /// Build a new typename type that refers to a template-id.
1034   ///
1035   /// By default, builds a new DependentNameType type from the
1036   /// nested-name-specifier and the given type. Subclasses may override
1037   /// this routine to provide different behavior.
RebuildDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const IdentifierInfo * Name,SourceLocation NameLoc,TemplateArgumentListInfo & Args,bool AllowInjectedClassName)1038   QualType RebuildDependentTemplateSpecializationType(
1039                                           ElaboratedTypeKeyword Keyword,
1040                                           NestedNameSpecifierLoc QualifierLoc,
1041                                           SourceLocation TemplateKWLoc,
1042                                           const IdentifierInfo *Name,
1043                                           SourceLocation NameLoc,
1044                                           TemplateArgumentListInfo &Args,
1045                                           bool AllowInjectedClassName) {
1046     // Rebuild the template name.
1047     // TODO: avoid TemplateName abstraction
1048     CXXScopeSpec SS;
1049     SS.Adopt(QualifierLoc);
1050     TemplateName InstName = getDerived().RebuildTemplateName(
1051         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1052         AllowInjectedClassName);
1053 
1054     if (InstName.isNull())
1055       return QualType();
1056 
1057     // If it's still dependent, make a dependent specialization.
1058     if (InstName.getAsDependentTemplateName())
1059       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1060                                           QualifierLoc.getNestedNameSpecifier(),
1061                                                                     Name,
1062                                                                     Args);
1063 
1064     // Otherwise, make an elaborated type wrapping a non-dependent
1065     // specialization.
1066     QualType T =
1067     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1068     if (T.isNull()) return QualType();
1069 
1070     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1071       return T;
1072 
1073     return SemaRef.Context.getElaboratedType(Keyword,
1074                                        QualifierLoc.getNestedNameSpecifier(),
1075                                              T);
1076   }
1077 
1078   /// Build a new typename type that refers to an identifier.
1079   ///
1080   /// By default, performs semantic analysis when building the typename type
1081   /// (or elaborated type). Subclasses may override this routine to provide
1082   /// different behavior.
RebuildDependentNameType(ElaboratedTypeKeyword Keyword,SourceLocation KeywordLoc,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Id,SourceLocation IdLoc,bool DeducedTSTContext)1083   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1084                                     SourceLocation KeywordLoc,
1085                                     NestedNameSpecifierLoc QualifierLoc,
1086                                     const IdentifierInfo *Id,
1087                                     SourceLocation IdLoc,
1088                                     bool DeducedTSTContext) {
1089     CXXScopeSpec SS;
1090     SS.Adopt(QualifierLoc);
1091 
1092     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1093       // If the name is still dependent, just build a new dependent name type.
1094       if (!SemaRef.computeDeclContext(SS))
1095         return SemaRef.Context.getDependentNameType(Keyword,
1096                                           QualifierLoc.getNestedNameSpecifier(),
1097                                                     Id);
1098     }
1099 
1100     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1101       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1102                                        *Id, IdLoc, DeducedTSTContext);
1103     }
1104 
1105     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1106 
1107     // We had a dependent elaborated-type-specifier that has been transformed
1108     // into a non-dependent elaborated-type-specifier. Find the tag we're
1109     // referring to.
1110     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1112     if (!DC)
1113       return QualType();
1114 
1115     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1116       return QualType();
1117 
1118     TagDecl *Tag = nullptr;
1119     SemaRef.LookupQualifiedName(Result, DC);
1120     switch (Result.getResultKind()) {
1121       case LookupResult::NotFound:
1122       case LookupResult::NotFoundInCurrentInstantiation:
1123         break;
1124 
1125       case LookupResult::Found:
1126         Tag = Result.getAsSingle<TagDecl>();
1127         break;
1128 
1129       case LookupResult::FoundOverloaded:
1130       case LookupResult::FoundUnresolvedValue:
1131         llvm_unreachable("Tag lookup cannot find non-tags");
1132 
1133       case LookupResult::Ambiguous:
1134         // Let the LookupResult structure handle ambiguities.
1135         return QualType();
1136     }
1137 
1138     if (!Tag) {
1139       // Check where the name exists but isn't a tag type and use that to emit
1140       // better diagnostics.
1141       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1142       SemaRef.LookupQualifiedName(Result, DC);
1143       switch (Result.getResultKind()) {
1144         case LookupResult::Found:
1145         case LookupResult::FoundOverloaded:
1146         case LookupResult::FoundUnresolvedValue: {
1147           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1148           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1149           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1150                                                                << NTK << Kind;
1151           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1152           break;
1153         }
1154         default:
1155           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1156               << Kind << Id << DC << QualifierLoc.getSourceRange();
1157           break;
1158       }
1159       return QualType();
1160     }
1161 
1162     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1163                                               IdLoc, Id)) {
1164       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1165       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1166       return QualType();
1167     }
1168 
1169     // Build the elaborated-type-specifier type.
1170     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1171     return SemaRef.Context.getElaboratedType(Keyword,
1172                                          QualifierLoc.getNestedNameSpecifier(),
1173                                              T);
1174   }
1175 
1176   /// Build a new pack expansion type.
1177   ///
1178   /// By default, builds a new PackExpansionType type from the given pattern.
1179   /// Subclasses may override this routine to provide different behavior.
RebuildPackExpansionType(QualType Pattern,SourceRange PatternRange,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)1180   QualType RebuildPackExpansionType(QualType Pattern,
1181                                     SourceRange PatternRange,
1182                                     SourceLocation EllipsisLoc,
1183                                     Optional<unsigned> NumExpansions) {
1184     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1185                                         NumExpansions);
1186   }
1187 
1188   /// Build a new atomic type given its value type.
1189   ///
1190   /// By default, performs semantic analysis when building the atomic type.
1191   /// Subclasses may override this routine to provide different behavior.
1192   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1193 
1194   /// Build a new pipe type given its value type.
1195   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1196                            bool isReadPipe);
1197 
1198    /// Build an extended int given its value type.
1199   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1200                              SourceLocation Loc);
1201 
1202   /// Build a dependent extended int given its value type.
1203   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1204                                       SourceLocation Loc);
1205 
1206   /// Build a new template name given a nested name specifier, a flag
1207   /// indicating whether the "template" keyword was provided, and the template
1208   /// that the template name refers to.
1209   ///
1210   /// By default, builds the new template name directly. Subclasses may override
1211   /// this routine to provide different behavior.
1212   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1213                                    bool TemplateKW,
1214                                    TemplateDecl *Template);
1215 
1216   /// Build a new template name given a nested name specifier and the
1217   /// name that is referred to as a template.
1218   ///
1219   /// By default, performs semantic analysis to determine whether the name can
1220   /// be resolved to a specific template, then builds the appropriate kind of
1221   /// template name. Subclasses may override this routine to provide different
1222   /// behavior.
1223   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1224                                    SourceLocation TemplateKWLoc,
1225                                    const IdentifierInfo &Name,
1226                                    SourceLocation NameLoc, QualType ObjectType,
1227                                    NamedDecl *FirstQualifierInScope,
1228                                    bool AllowInjectedClassName);
1229 
1230   /// Build a new template name given a nested name specifier and the
1231   /// overloaded operator name that is referred to as a template.
1232   ///
1233   /// By default, performs semantic analysis to determine whether the name can
1234   /// be resolved to a specific template, then builds the appropriate kind of
1235   /// template name. Subclasses may override this routine to provide different
1236   /// behavior.
1237   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1238                                    SourceLocation TemplateKWLoc,
1239                                    OverloadedOperatorKind Operator,
1240                                    SourceLocation NameLoc, QualType ObjectType,
1241                                    bool AllowInjectedClassName);
1242 
1243   /// Build a new template name given a template template parameter pack
1244   /// and the
1245   ///
1246   /// By default, performs semantic analysis to determine whether the name can
1247   /// be resolved to a specific template, then builds the appropriate kind of
1248   /// template name. Subclasses may override this routine to provide different
1249   /// behavior.
RebuildTemplateName(TemplateTemplateParmDecl * Param,const TemplateArgument & ArgPack)1250   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1251                                    const TemplateArgument &ArgPack) {
1252     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1253   }
1254 
1255   /// Build a new compound statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundStmt(SourceLocation LBraceLoc,MultiStmtArg Statements,SourceLocation RBraceLoc,bool IsStmtExpr)1259   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1260                                        MultiStmtArg Statements,
1261                                        SourceLocation RBraceLoc,
1262                                        bool IsStmtExpr) {
1263     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1264                                        IsStmtExpr);
1265   }
1266 
1267   /// Build a new case statement.
1268   ///
1269   /// By default, performs semantic analysis to build the new statement.
1270   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmt(SourceLocation CaseLoc,Expr * LHS,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation ColonLoc)1271   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1272                                    Expr *LHS,
1273                                    SourceLocation EllipsisLoc,
1274                                    Expr *RHS,
1275                                    SourceLocation ColonLoc) {
1276     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1277                                    ColonLoc);
1278   }
1279 
1280   /// Attach the body to a new case statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmtBody(Stmt * S,Stmt * Body)1284   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1285     getSema().ActOnCaseStmtBody(S, Body);
1286     return S;
1287   }
1288 
1289   /// Build a new default statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
RebuildDefaultStmt(SourceLocation DefaultLoc,SourceLocation ColonLoc,Stmt * SubStmt)1293   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1294                                       SourceLocation ColonLoc,
1295                                       Stmt *SubStmt) {
1296     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1297                                       /*CurScope=*/nullptr);
1298   }
1299 
1300   /// Build a new label statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
RebuildLabelStmt(SourceLocation IdentLoc,LabelDecl * L,SourceLocation ColonLoc,Stmt * SubStmt)1304   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1305                               SourceLocation ColonLoc, Stmt *SubStmt) {
1306     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1307   }
1308 
1309   /// Build a new attributed statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
RebuildAttributedStmt(SourceLocation AttrLoc,ArrayRef<const Attr * > Attrs,Stmt * SubStmt)1313   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1314                                    ArrayRef<const Attr *> Attrs,
1315                                    Stmt *SubStmt) {
1316     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1317   }
1318 
1319   /// Build a new "if" statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
RebuildIfStmt(SourceLocation IfLoc,bool IsConstexpr,SourceLocation LParenLoc,Sema::ConditionResult Cond,SourceLocation RParenLoc,Stmt * Init,Stmt * Then,SourceLocation ElseLoc,Stmt * Else)1323   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1324                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1325                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1326                            SourceLocation ElseLoc, Stmt *Else) {
1327     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1328                                  RParenLoc, Then, ElseLoc, Else);
1329   }
1330 
1331   /// Start building a new switch statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtStart(SourceLocation SwitchLoc,SourceLocation LParenLoc,Stmt * Init,Sema::ConditionResult Cond,SourceLocation RParenLoc)1335   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1336                                     SourceLocation LParenLoc, Stmt *Init,
1337                                     Sema::ConditionResult Cond,
1338                                     SourceLocation RParenLoc) {
1339     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1340                                             RParenLoc);
1341   }
1342 
1343   /// Attach the body to the switch statement.
1344   ///
1345   /// By default, performs semantic analysis to build the new statement.
1346   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtBody(SourceLocation SwitchLoc,Stmt * Switch,Stmt * Body)1347   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1348                                    Stmt *Switch, Stmt *Body) {
1349     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1350   }
1351 
1352   /// Build a new while statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
RebuildWhileStmt(SourceLocation WhileLoc,SourceLocation LParenLoc,Sema::ConditionResult Cond,SourceLocation RParenLoc,Stmt * Body)1356   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1357                               Sema::ConditionResult Cond,
1358                               SourceLocation RParenLoc, Stmt *Body) {
1359     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1360   }
1361 
1362   /// Build a new do-while statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
RebuildDoStmt(SourceLocation DoLoc,Stmt * Body,SourceLocation WhileLoc,SourceLocation LParenLoc,Expr * Cond,SourceLocation RParenLoc)1366   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1367                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1368                            Expr *Cond, SourceLocation RParenLoc) {
1369     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1370                                  Cond, RParenLoc);
1371   }
1372 
1373   /// Build a new for statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
RebuildForStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * Init,Sema::ConditionResult Cond,Sema::FullExprArg Inc,SourceLocation RParenLoc,Stmt * Body)1377   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1378                             Stmt *Init, Sema::ConditionResult Cond,
1379                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1380                             Stmt *Body) {
1381     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1382                                   Inc, RParenLoc, Body);
1383   }
1384 
1385   /// Build a new goto statement.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
RebuildGotoStmt(SourceLocation GotoLoc,SourceLocation LabelLoc,LabelDecl * Label)1389   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1390                              LabelDecl *Label) {
1391     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1392   }
1393 
1394   /// Build a new indirect goto statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
RebuildIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,Expr * Target)1398   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1399                                      SourceLocation StarLoc,
1400                                      Expr *Target) {
1401     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1402   }
1403 
1404   /// Build a new return statement.
1405   ///
1406   /// By default, performs semantic analysis to build the new statement.
1407   /// Subclasses may override this routine to provide different behavior.
RebuildReturnStmt(SourceLocation ReturnLoc,Expr * Result)1408   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1409     return getSema().BuildReturnStmt(ReturnLoc, Result);
1410   }
1411 
1412   /// Build a new declaration statement.
1413   ///
1414   /// By default, performs semantic analysis to build the new statement.
1415   /// Subclasses may override this routine to provide different behavior.
RebuildDeclStmt(MutableArrayRef<Decl * > Decls,SourceLocation StartLoc,SourceLocation EndLoc)1416   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1417                              SourceLocation StartLoc, SourceLocation EndLoc) {
1418     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1419     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1420   }
1421 
1422   /// Build a new inline asm statement.
1423   ///
1424   /// By default, performs semantic analysis to build the new statement.
1425   /// Subclasses may override this routine to provide different behavior.
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)1426   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1427                                bool IsVolatile, unsigned NumOutputs,
1428                                unsigned NumInputs, IdentifierInfo **Names,
1429                                MultiExprArg Constraints, MultiExprArg Exprs,
1430                                Expr *AsmString, MultiExprArg Clobbers,
1431                                unsigned NumLabels,
1432                                SourceLocation RParenLoc) {
1433     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1434                                      NumInputs, Names, Constraints, Exprs,
1435                                      AsmString, Clobbers, NumLabels, RParenLoc);
1436   }
1437 
1438   /// Build a new MS style inline asm statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
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)1442   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1443                               ArrayRef<Token> AsmToks,
1444                               StringRef AsmString,
1445                               unsigned NumOutputs, unsigned NumInputs,
1446                               ArrayRef<StringRef> Constraints,
1447                               ArrayRef<StringRef> Clobbers,
1448                               ArrayRef<Expr*> Exprs,
1449                               SourceLocation EndLoc) {
1450     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1451                                     NumOutputs, NumInputs,
1452                                     Constraints, Clobbers, Exprs, EndLoc);
1453   }
1454 
1455   /// Build a new co_return statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
RebuildCoreturnStmt(SourceLocation CoreturnLoc,Expr * Result,bool IsImplicit)1459   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1460                                  bool IsImplicit) {
1461     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1462   }
1463 
1464   /// Build a new co_await expression.
1465   ///
1466   /// By default, performs semantic analysis to build the new expression.
1467   /// Subclasses may override this routine to provide different behavior.
RebuildCoawaitExpr(SourceLocation CoawaitLoc,Expr * Result,bool IsImplicit)1468   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1469                                 bool IsImplicit) {
1470     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1471   }
1472 
1473   /// Build a new co_await expression.
1474   ///
1475   /// By default, performs semantic analysis to build the new expression.
1476   /// Subclasses may override this routine to provide different behavior.
RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,Expr * Result,UnresolvedLookupExpr * Lookup)1477   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1478                                          Expr *Result,
1479                                          UnresolvedLookupExpr *Lookup) {
1480     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1481   }
1482 
1483   /// Build a new co_yield expression.
1484   ///
1485   /// By default, performs semantic analysis to build the new expression.
1486   /// Subclasses may override this routine to provide different behavior.
RebuildCoyieldExpr(SourceLocation CoyieldLoc,Expr * Result)1487   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1488     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1489   }
1490 
RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args)1491   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1492     return getSema().BuildCoroutineBodyStmt(Args);
1493   }
1494 
1495   /// Build a new Objective-C \@try statement.
1496   ///
1497   /// By default, performs semantic analysis to build the new statement.
1498   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtTryStmt(SourceLocation AtLoc,Stmt * TryBody,MultiStmtArg CatchStmts,Stmt * Finally)1499   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1500                                         Stmt *TryBody,
1501                                         MultiStmtArg CatchStmts,
1502                                         Stmt *Finally) {
1503     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1504                                         Finally);
1505   }
1506 
1507   /// Rebuild an Objective-C exception declaration.
1508   ///
1509   /// By default, performs semantic analysis to build the new declaration.
1510   /// Subclasses may override this routine to provide different behavior.
RebuildObjCExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * TInfo,QualType T)1511   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1512                                     TypeSourceInfo *TInfo, QualType T) {
1513     return getSema().BuildObjCExceptionDecl(TInfo, T,
1514                                             ExceptionDecl->getInnerLocStart(),
1515                                             ExceptionDecl->getLocation(),
1516                                             ExceptionDecl->getIdentifier());
1517   }
1518 
1519   /// Build a new Objective-C \@catch statement.
1520   ///
1521   /// By default, performs semantic analysis to build the new statement.
1522   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtCatchStmt(SourceLocation AtLoc,SourceLocation RParenLoc,VarDecl * Var,Stmt * Body)1523   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1524                                           SourceLocation RParenLoc,
1525                                           VarDecl *Var,
1526                                           Stmt *Body) {
1527     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1528                                           Var, Body);
1529   }
1530 
1531   /// Build a new Objective-C \@finally statement.
1532   ///
1533   /// By default, performs semantic analysis to build the new statement.
1534   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtFinallyStmt(SourceLocation AtLoc,Stmt * Body)1535   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1536                                             Stmt *Body) {
1537     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1538   }
1539 
1540   /// Build a new Objective-C \@throw statement.
1541   ///
1542   /// By default, performs semantic analysis to build the new statement.
1543   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtThrowStmt(SourceLocation AtLoc,Expr * Operand)1544   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1545                                           Expr *Operand) {
1546     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1547   }
1548 
1549   /// Build a new OpenMP Canonical loop.
1550   ///
1551   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1552   /// OMPCanonicalLoop.
RebuildOMPCanonicalLoop(Stmt * LoopStmt)1553   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1554     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1555   }
1556 
1557   /// Build a new OpenMP executable directive.
1558   ///
1559   /// By default, performs semantic analysis to build the new statement.
1560   /// Subclasses may override this routine to provide different behavior.
RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,DeclarationNameInfo DirName,OpenMPDirectiveKind CancelRegion,ArrayRef<OMPClause * > Clauses,Stmt * AStmt,SourceLocation StartLoc,SourceLocation EndLoc)1561   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1562                                            DeclarationNameInfo DirName,
1563                                            OpenMPDirectiveKind CancelRegion,
1564                                            ArrayRef<OMPClause *> Clauses,
1565                                            Stmt *AStmt, SourceLocation StartLoc,
1566                                            SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPExecutableDirective(
1568         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'if' clause.
1572   ///
1573   /// By default, performs semantic analysis to build the new OpenMP clause.
1574   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation NameModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1575   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1576                                 Expr *Condition, SourceLocation StartLoc,
1577                                 SourceLocation LParenLoc,
1578                                 SourceLocation NameModifierLoc,
1579                                 SourceLocation ColonLoc,
1580                                 SourceLocation EndLoc) {
1581     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1582                                          LParenLoc, NameModifierLoc, ColonLoc,
1583                                          EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'final' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFinalClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1590   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1591                                    SourceLocation LParenLoc,
1592                                    SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1594                                             EndLoc);
1595   }
1596 
1597   /// Build a new OpenMP 'num_threads' clause.
1598   ///
1599   /// By default, performs semantic analysis to build the new OpenMP clause.
1600   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumThreadsClause(Expr * NumThreads,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1601   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1602                                         SourceLocation StartLoc,
1603                                         SourceLocation LParenLoc,
1604                                         SourceLocation EndLoc) {
1605     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1606                                                  LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'safelen' clause.
1610   ///
1611   /// By default, performs semantic analysis to build the new OpenMP clause.
1612   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSafelenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1613   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'simdlen' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSimdlenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1623   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
RebuildOMPSizesClause(ArrayRef<Expr * > Sizes,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1629   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1630                                    SourceLocation StartLoc,
1631                                    SourceLocation LParenLoc,
1632                                    SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'allocator' clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAllocatorClause(Expr * A,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1640   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1641                                        SourceLocation LParenLoc,
1642                                        SourceLocation EndLoc) {
1643     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1644   }
1645 
1646   /// Build a new OpenMP 'collapse' clause.
1647   ///
1648   /// By default, performs semantic analysis to build the new OpenMP clause.
1649   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCollapseClause(Expr * Num,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1650   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1651                                       SourceLocation LParenLoc,
1652                                       SourceLocation EndLoc) {
1653     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1654                                                EndLoc);
1655   }
1656 
1657   /// Build a new OpenMP 'default' clause.
1658   ///
1659   /// By default, performs semantic analysis to build the new OpenMP clause.
1660   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDefaultClause(DefaultKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1661   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1662                                      SourceLocation StartLoc,
1663                                      SourceLocation LParenLoc,
1664                                      SourceLocation EndLoc) {
1665     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1666                                               StartLoc, LParenLoc, EndLoc);
1667   }
1668 
1669   /// Build a new OpenMP 'proc_bind' clause.
1670   ///
1671   /// By default, performs semantic analysis to build the new OpenMP clause.
1672   /// Subclasses may override this routine to provide different behavior.
RebuildOMPProcBindClause(ProcBindKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1673   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1674                                       SourceLocation KindKwLoc,
1675                                       SourceLocation StartLoc,
1676                                       SourceLocation LParenLoc,
1677                                       SourceLocation EndLoc) {
1678     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1679                                                StartLoc, LParenLoc, EndLoc);
1680   }
1681 
1682   /// Build a new OpenMP 'schedule' clause.
1683   ///
1684   /// By default, performs semantic analysis to build the new OpenMP clause.
1685   /// 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)1686   OMPClause *RebuildOMPScheduleClause(
1687       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1688       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1689       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1690       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPScheduleClause(
1692         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1693         CommaLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'ordered' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
RebuildOMPOrderedClause(SourceLocation StartLoc,SourceLocation EndLoc,SourceLocation LParenLoc,Expr * Num)1700   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1701                                      SourceLocation EndLoc,
1702                                      SourceLocation LParenLoc, Expr *Num) {
1703     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1704   }
1705 
1706   /// Build a new OpenMP 'private' clause.
1707   ///
1708   /// By default, performs semantic analysis to build the new OpenMP clause.
1709   /// Subclasses may override this routine to provide different behavior.
RebuildOMPPrivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1710   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1711                                      SourceLocation StartLoc,
1712                                      SourceLocation LParenLoc,
1713                                      SourceLocation EndLoc) {
1714     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1715                                               EndLoc);
1716   }
1717 
1718   /// Build a new OpenMP 'firstprivate' clause.
1719   ///
1720   /// By default, performs semantic analysis to build the new OpenMP clause.
1721   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFirstprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1722   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1723                                           SourceLocation StartLoc,
1724                                           SourceLocation LParenLoc,
1725                                           SourceLocation EndLoc) {
1726     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1727                                                    EndLoc);
1728   }
1729 
1730   /// Build a new OpenMP 'lastprivate' clause.
1731   ///
1732   /// By default, performs semantic analysis to build the new OpenMP clause.
1733   /// 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)1734   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1735                                          OpenMPLastprivateModifier LPKind,
1736                                          SourceLocation LPKindLoc,
1737                                          SourceLocation ColonLoc,
1738                                          SourceLocation StartLoc,
1739                                          SourceLocation LParenLoc,
1740                                          SourceLocation EndLoc) {
1741     return getSema().ActOnOpenMPLastprivateClause(
1742         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1743   }
1744 
1745   /// Build a new OpenMP 'shared' clause.
1746   ///
1747   /// By default, performs semantic analysis to build the new OpenMP clause.
1748   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSharedClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1749   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1750                                     SourceLocation StartLoc,
1751                                     SourceLocation LParenLoc,
1752                                     SourceLocation EndLoc) {
1753     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1754                                              EndLoc);
1755   }
1756 
1757   /// Build a new OpenMP 'reduction' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new statement.
1760   /// 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)1761   OMPClause *RebuildOMPReductionClause(
1762       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1763       SourceLocation StartLoc, SourceLocation LParenLoc,
1764       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1765       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1766       const DeclarationNameInfo &ReductionId,
1767       ArrayRef<Expr *> UnresolvedReductions) {
1768     return getSema().ActOnOpenMPReductionClause(
1769         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1770         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1771   }
1772 
1773   /// Build a new OpenMP 'task_reduction' clause.
1774   ///
1775   /// By default, performs semantic analysis to build the new statement.
1776   /// 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)1777   OMPClause *RebuildOMPTaskReductionClause(
1778       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1779       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1780       CXXScopeSpec &ReductionIdScopeSpec,
1781       const DeclarationNameInfo &ReductionId,
1782       ArrayRef<Expr *> UnresolvedReductions) {
1783     return getSema().ActOnOpenMPTaskReductionClause(
1784         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1785         ReductionId, UnresolvedReductions);
1786   }
1787 
1788   /// Build a new OpenMP 'in_reduction' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new statement.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *
RebuildOMPInReductionClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,CXXScopeSpec & ReductionIdScopeSpec,const DeclarationNameInfo & ReductionId,ArrayRef<Expr * > UnresolvedReductions)1793   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1794                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1795                               SourceLocation EndLoc,
1796                               CXXScopeSpec &ReductionIdScopeSpec,
1797                               const DeclarationNameInfo &ReductionId,
1798                               ArrayRef<Expr *> UnresolvedReductions) {
1799     return getSema().ActOnOpenMPInReductionClause(
1800         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1801         ReductionId, UnresolvedReductions);
1802   }
1803 
1804   /// Build a new OpenMP 'linear' clause.
1805   ///
1806   /// By default, performs semantic analysis to build the new OpenMP clause.
1807   /// 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)1808   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1809                                     SourceLocation StartLoc,
1810                                     SourceLocation LParenLoc,
1811                                     OpenMPLinearClauseKind Modifier,
1812                                     SourceLocation ModifierLoc,
1813                                     SourceLocation ColonLoc,
1814                                     SourceLocation EndLoc) {
1815     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1816                                              Modifier, ModifierLoc, ColonLoc,
1817                                              EndLoc);
1818   }
1819 
1820   /// Build a new OpenMP 'aligned' clause.
1821   ///
1822   /// By default, performs semantic analysis to build the new OpenMP clause.
1823   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAlignedClause(ArrayRef<Expr * > VarList,Expr * Alignment,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1824   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1825                                      SourceLocation StartLoc,
1826                                      SourceLocation LParenLoc,
1827                                      SourceLocation ColonLoc,
1828                                      SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1830                                               LParenLoc, ColonLoc, EndLoc);
1831   }
1832 
1833   /// Build a new OpenMP 'copyin' clause.
1834   ///
1835   /// By default, performs semantic analysis to build the new OpenMP clause.
1836   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyinClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1837   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1838                                     SourceLocation StartLoc,
1839                                     SourceLocation LParenLoc,
1840                                     SourceLocation EndLoc) {
1841     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1842                                              EndLoc);
1843   }
1844 
1845   /// Build a new OpenMP 'copyprivate' clause.
1846   ///
1847   /// By default, performs semantic analysis to build the new OpenMP clause.
1848   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1849   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1850                                          SourceLocation StartLoc,
1851                                          SourceLocation LParenLoc,
1852                                          SourceLocation EndLoc) {
1853     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1854                                                   EndLoc);
1855   }
1856 
1857   /// Build a new OpenMP 'flush' pseudo clause.
1858   ///
1859   /// By default, performs semantic analysis to build the new OpenMP clause.
1860   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFlushClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1861   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1862                                    SourceLocation StartLoc,
1863                                    SourceLocation LParenLoc,
1864                                    SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1866                                             EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'depobj' pseudo clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new OpenMP clause.
1872   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDepobjClause(Expr * Depobj,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1873   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1874                                     SourceLocation LParenLoc,
1875                                     SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1877                                              EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'depend' pseudo clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new OpenMP clause.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *
RebuildOMPDependClause(Expr * DepModifier,OpenMPDependClauseKind DepKind,SourceLocation DepLoc,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1885   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1886                          SourceLocation DepLoc, SourceLocation ColonLoc,
1887                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1888                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1889     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1890                                              ColonLoc, VarList, StartLoc,
1891                                              LParenLoc, EndLoc);
1892   }
1893 
1894   /// Build a new OpenMP 'device' clause.
1895   ///
1896   /// By default, performs semantic analysis to build the new statement.
1897   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,Expr * Device,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ModifierLoc,SourceLocation EndLoc)1898   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1899                                     Expr *Device, SourceLocation StartLoc,
1900                                     SourceLocation LParenLoc,
1901                                     SourceLocation ModifierLoc,
1902                                     SourceLocation EndLoc) {
1903     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1904                                              LParenLoc, ModifierLoc, EndLoc);
1905   }
1906 
1907   /// Build a new OpenMP 'map' clause.
1908   ///
1909   /// By default, performs semantic analysis to build the new OpenMP clause.
1910   /// Subclasses may override this routine to provide different behavior.
RebuildOMPMapClause(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)1911   OMPClause *RebuildOMPMapClause(
1912       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1913       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1914       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1915       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1916       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1917       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1918     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1919                                           MapperIdScopeSpec, MapperId, MapType,
1920                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1921                                           VarList, Locs, UnresolvedMappers);
1922   }
1923 
1924   /// Build a new OpenMP 'allocate' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new OpenMP clause.
1927   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAllocateClause(Expr * Allocate,ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1928   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1929                                       SourceLocation StartLoc,
1930                                       SourceLocation LParenLoc,
1931                                       SourceLocation ColonLoc,
1932                                       SourceLocation EndLoc) {
1933     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1934                                                LParenLoc, ColonLoc, EndLoc);
1935   }
1936 
1937   /// Build a new OpenMP 'num_teams' clause.
1938   ///
1939   /// By default, performs semantic analysis to build the new statement.
1940   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumTeamsClause(Expr * NumTeams,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1941   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1942                                       SourceLocation LParenLoc,
1943                                       SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1945                                                EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'thread_limit' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
RebuildOMPThreadLimitClause(Expr * ThreadLimit,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1952   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1953                                          SourceLocation StartLoc,
1954                                          SourceLocation LParenLoc,
1955                                          SourceLocation EndLoc) {
1956     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1957                                                   LParenLoc, EndLoc);
1958   }
1959 
1960   /// Build a new OpenMP 'priority' clause.
1961   ///
1962   /// By default, performs semantic analysis to build the new statement.
1963   /// Subclasses may override this routine to provide different behavior.
RebuildOMPPriorityClause(Expr * Priority,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1964   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1965                                       SourceLocation LParenLoc,
1966                                       SourceLocation EndLoc) {
1967     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1968                                                EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'grainsize' clause.
1972   ///
1973   /// By default, performs semantic analysis to build the new statement.
1974   /// Subclasses may override this routine to provide different behavior.
RebuildOMPGrainsizeClause(Expr * Grainsize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1975   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1976                                        SourceLocation LParenLoc,
1977                                        SourceLocation EndLoc) {
1978     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1979                                                 EndLoc);
1980   }
1981 
1982   /// Build a new OpenMP 'num_tasks' clause.
1983   ///
1984   /// By default, performs semantic analysis to build the new statement.
1985   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumTasksClause(Expr * NumTasks,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1986   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1987                                       SourceLocation LParenLoc,
1988                                       SourceLocation EndLoc) {
1989     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1990                                                EndLoc);
1991   }
1992 
1993   /// Build a new OpenMP 'hint' clause.
1994   ///
1995   /// By default, performs semantic analysis to build the new statement.
1996   /// Subclasses may override this routine to provide different behavior.
RebuildOMPHintClause(Expr * Hint,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1997   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1998                                   SourceLocation LParenLoc,
1999                                   SourceLocation EndLoc) {
2000     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2001   }
2002 
2003   /// Build a new OpenMP 'detach' clause.
2004   ///
2005   /// By default, performs semantic analysis to build the new statement.
2006   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDetachClause(Expr * Evt,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2007   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2008                                     SourceLocation LParenLoc,
2009                                     SourceLocation EndLoc) {
2010     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2011   }
2012 
2013   /// Build a new OpenMP 'dist_schedule' clause.
2014   ///
2015   /// By default, performs semantic analysis to build the new OpenMP clause.
2016   /// Subclasses may override this routine to provide different behavior.
2017   OMPClause *
RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,Expr * ChunkSize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation KindLoc,SourceLocation CommaLoc,SourceLocation EndLoc)2018   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2019                                Expr *ChunkSize, SourceLocation StartLoc,
2020                                SourceLocation LParenLoc, SourceLocation KindLoc,
2021                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2022     return getSema().ActOnOpenMPDistScheduleClause(
2023         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2024   }
2025 
2026   /// Build a new OpenMP 'to' clause.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   OMPClause *
RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,ArrayRef<SourceLocation> MotionModifiersLoc,CXXScopeSpec & MapperIdScopeSpec,DeclarationNameInfo & MapperId,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs,ArrayRef<Expr * > UnresolvedMappers)2031   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2032                      ArrayRef<SourceLocation> MotionModifiersLoc,
2033                      CXXScopeSpec &MapperIdScopeSpec,
2034                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2035                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2036                      ArrayRef<Expr *> UnresolvedMappers) {
2037     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2038                                          MapperIdScopeSpec, MapperId, ColonLoc,
2039                                          VarList, Locs, UnresolvedMappers);
2040   }
2041 
2042   /// Build a new OpenMP 'from' clause.
2043   ///
2044   /// By default, performs semantic analysis to build the new statement.
2045   /// Subclasses may override this routine to provide different behavior.
2046   OMPClause *
RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,ArrayRef<SourceLocation> MotionModifiersLoc,CXXScopeSpec & MapperIdScopeSpec,DeclarationNameInfo & MapperId,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs,ArrayRef<Expr * > UnresolvedMappers)2047   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2048                        ArrayRef<SourceLocation> MotionModifiersLoc,
2049                        CXXScopeSpec &MapperIdScopeSpec,
2050                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2051                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2052                        ArrayRef<Expr *> UnresolvedMappers) {
2053     return getSema().ActOnOpenMPFromClause(
2054         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2055         ColonLoc, VarList, Locs, UnresolvedMappers);
2056   }
2057 
2058   /// Build a new OpenMP 'use_device_ptr' clause.
2059   ///
2060   /// By default, performs semantic analysis to build the new OpenMP clause.
2061   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUseDevicePtrClause(ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs)2062   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2063                                           const OMPVarListLocTy &Locs) {
2064     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2065   }
2066 
2067   /// Build a new OpenMP 'use_device_addr' clause.
2068   ///
2069   /// By default, performs semantic analysis to build the new OpenMP clause.
2070   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUseDeviceAddrClause(ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs)2071   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2072                                            const OMPVarListLocTy &Locs) {
2073     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2074   }
2075 
2076   /// Build a new OpenMP 'is_device_ptr' clause.
2077   ///
2078   /// By default, performs semantic analysis to build the new OpenMP clause.
2079   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIsDevicePtrClause(ArrayRef<Expr * > VarList,const OMPVarListLocTy & Locs)2080   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2081                                          const OMPVarListLocTy &Locs) {
2082     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2083   }
2084 
2085   /// Build a new OpenMP 'defaultmap' clause.
2086   ///
2087   /// By default, performs semantic analysis to build the new OpenMP clause.
2088   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,OpenMPDefaultmapClauseKind Kind,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation MLoc,SourceLocation KindLoc,SourceLocation EndLoc)2089   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2090                                         OpenMPDefaultmapClauseKind Kind,
2091                                         SourceLocation StartLoc,
2092                                         SourceLocation LParenLoc,
2093                                         SourceLocation MLoc,
2094                                         SourceLocation KindLoc,
2095                                         SourceLocation EndLoc) {
2096     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2097                                                  MLoc, KindLoc, EndLoc);
2098   }
2099 
2100   /// Build a new OpenMP 'nontemporal' clause.
2101   ///
2102   /// By default, performs semantic analysis to build the new OpenMP clause.
2103   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNontemporalClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2104   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2105                                          SourceLocation StartLoc,
2106                                          SourceLocation LParenLoc,
2107                                          SourceLocation EndLoc) {
2108     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2109                                                   EndLoc);
2110   }
2111 
2112   /// Build a new OpenMP 'inclusive' clause.
2113   ///
2114   /// By default, performs semantic analysis to build the new OpenMP clause.
2115   /// Subclasses may override this routine to provide different behavior.
RebuildOMPInclusiveClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2116   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2117                                        SourceLocation StartLoc,
2118                                        SourceLocation LParenLoc,
2119                                        SourceLocation EndLoc) {
2120     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2121                                                 EndLoc);
2122   }
2123 
2124   /// Build a new OpenMP 'exclusive' clause.
2125   ///
2126   /// By default, performs semantic analysis to build the new OpenMP clause.
2127   /// Subclasses may override this routine to provide different behavior.
RebuildOMPExclusiveClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2128   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2129                                        SourceLocation StartLoc,
2130                                        SourceLocation LParenLoc,
2131                                        SourceLocation EndLoc) {
2132     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2133                                                 EndLoc);
2134   }
2135 
2136   /// Build a new OpenMP 'uses_allocators' clause.
2137   ///
2138   /// By default, performs semantic analysis to build the new OpenMP clause.
2139   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUsesAllocatorsClause(ArrayRef<Sema::UsesAllocatorsData> Data,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2140   OMPClause *RebuildOMPUsesAllocatorsClause(
2141       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2142       SourceLocation LParenLoc, SourceLocation EndLoc) {
2143     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2144                                                     Data);
2145   }
2146 
2147   /// Build a new OpenMP 'affinity' clause.
2148   ///
2149   /// By default, performs semantic analysis to build the new OpenMP clause.
2150   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAffinityClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,Expr * Modifier,ArrayRef<Expr * > Locators)2151   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2152                                       SourceLocation LParenLoc,
2153                                       SourceLocation ColonLoc,
2154                                       SourceLocation EndLoc, Expr *Modifier,
2155                                       ArrayRef<Expr *> Locators) {
2156     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2157                                                EndLoc, Modifier, Locators);
2158   }
2159 
2160   /// Build a new OpenMP 'order' clause.
2161   ///
2162   /// By default, performs semantic analysis to build the new OpenMP clause.
2163   /// Subclasses may override this routine to provide different behavior.
RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2164   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2165                                    SourceLocation KindKwLoc,
2166                                    SourceLocation StartLoc,
2167                                    SourceLocation LParenLoc,
2168                                    SourceLocation EndLoc) {
2169     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2170                                             LParenLoc, EndLoc);
2171   }
2172 
2173   /// Build a new OpenMP 'init' clause.
2174   ///
2175   /// By default, performs semantic analysis to build the new OpenMP clause.
2176   /// Subclasses may override this routine to provide different behavior.
RebuildOMPInitClause(Expr * InteropVar,ArrayRef<Expr * > PrefExprs,bool IsTarget,bool IsTargetSync,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation VarLoc,SourceLocation EndLoc)2177   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2178                                   bool IsTarget, bool IsTargetSync,
2179                                   SourceLocation StartLoc,
2180                                   SourceLocation LParenLoc,
2181                                   SourceLocation VarLoc,
2182                                   SourceLocation EndLoc) {
2183     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2184                                            IsTargetSync, StartLoc, LParenLoc,
2185                                            VarLoc, EndLoc);
2186   }
2187 
2188   /// Build a new OpenMP 'use' clause.
2189   ///
2190   /// By default, performs semantic analysis to build the new OpenMP clause.
2191   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUseClause(Expr * InteropVar,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation VarLoc,SourceLocation EndLoc)2192   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2193                                  SourceLocation LParenLoc,
2194                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2195     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2196                                           VarLoc, EndLoc);
2197   }
2198 
2199   /// Build a new OpenMP 'destroy' clause.
2200   ///
2201   /// By default, performs semantic analysis to build the new OpenMP clause.
2202   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDestroyClause(Expr * InteropVar,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation VarLoc,SourceLocation EndLoc)2203   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2204                                      SourceLocation LParenLoc,
2205                                      SourceLocation VarLoc,
2206                                      SourceLocation EndLoc) {
2207     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2208                                               VarLoc, EndLoc);
2209   }
2210 
2211   /// Build a new OpenMP 'novariants' clause.
2212   ///
2213   /// By default, performs semantic analysis to build the new OpenMP clause.
2214   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNovariantsClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2215   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2216                                         SourceLocation StartLoc,
2217                                         SourceLocation LParenLoc,
2218                                         SourceLocation EndLoc) {
2219     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2220                                                  EndLoc);
2221   }
2222 
2223   /// Build a new OpenMP 'nocontext' clause.
2224   ///
2225   /// By default, performs semantic analysis to build the new OpenMP clause.
2226   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNocontextClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2227   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2228                                        SourceLocation LParenLoc,
2229                                        SourceLocation EndLoc) {
2230     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2231                                                 EndLoc);
2232   }
2233 
2234   /// Build a new OpenMP 'filter' clause.
2235   ///
2236   /// By default, performs semantic analysis to build the new OpenMP clause.
2237   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFilterClause(Expr * ThreadID,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2238   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2239                                     SourceLocation LParenLoc,
2240                                     SourceLocation EndLoc) {
2241     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2242                                              EndLoc);
2243   }
2244 
2245   /// Rebuild the operand to an Objective-C \@synchronized statement.
2246   ///
2247   /// By default, performs semantic analysis to build the new statement.
2248   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,Expr * object)2249   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2250                                               Expr *object) {
2251     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2252   }
2253 
2254   /// Build a new Objective-C \@synchronized statement.
2255   ///
2256   /// By default, performs semantic analysis to build the new statement.
2257   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,Expr * Object,Stmt * Body)2258   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2259                                            Expr *Object, Stmt *Body) {
2260     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2261   }
2262 
2263   /// Build a new Objective-C \@autoreleasepool statement.
2264   ///
2265   /// By default, performs semantic analysis to build the new statement.
2266   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,Stmt * Body)2267   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2268                                             Stmt *Body) {
2269     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2270   }
2271 
2272   /// Build a new Objective-C fast enumeration statement.
2273   ///
2274   /// By default, performs semantic analysis to build the new statement.
2275   /// Subclasses may override this routine to provide different behavior.
RebuildObjCForCollectionStmt(SourceLocation ForLoc,Stmt * Element,Expr * Collection,SourceLocation RParenLoc,Stmt * Body)2276   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2277                                           Stmt *Element,
2278                                           Expr *Collection,
2279                                           SourceLocation RParenLoc,
2280                                           Stmt *Body) {
2281     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2282                                                 Element,
2283                                                 Collection,
2284                                                 RParenLoc);
2285     if (ForEachStmt.isInvalid())
2286       return StmtError();
2287 
2288     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2289   }
2290 
2291   /// Build a new C++ exception declaration.
2292   ///
2293   /// By default, performs semantic analysis to build the new decaration.
2294   /// Subclasses may override this routine to provide different behavior.
RebuildExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * Declarator,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id)2295   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2296                                 TypeSourceInfo *Declarator,
2297                                 SourceLocation StartLoc,
2298                                 SourceLocation IdLoc,
2299                                 IdentifierInfo *Id) {
2300     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2301                                                        StartLoc, IdLoc, Id);
2302     if (Var)
2303       getSema().CurContext->addDecl(Var);
2304     return Var;
2305   }
2306 
2307   /// Build a new C++ catch statement.
2308   ///
2309   /// By default, performs semantic analysis to build the new statement.
2310   /// Subclasses may override this routine to provide different behavior.
RebuildCXXCatchStmt(SourceLocation CatchLoc,VarDecl * ExceptionDecl,Stmt * Handler)2311   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2312                                  VarDecl *ExceptionDecl,
2313                                  Stmt *Handler) {
2314     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2315                                                       Handler));
2316   }
2317 
2318   /// Build a new C++ try statement.
2319   ///
2320   /// By default, performs semantic analysis to build the new statement.
2321   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTryStmt(SourceLocation TryLoc,Stmt * TryBlock,ArrayRef<Stmt * > Handlers)2322   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2323                                ArrayRef<Stmt *> Handlers) {
2324     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2325   }
2326 
2327   /// Build a new C++0x range-based for statement.
2328   ///
2329   /// By default, performs semantic analysis to build the new statement.
2330   /// 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)2331   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2332                                     SourceLocation CoawaitLoc, Stmt *Init,
2333                                     SourceLocation ColonLoc, Stmt *Range,
2334                                     Stmt *Begin, Stmt *End, Expr *Cond,
2335                                     Expr *Inc, Stmt *LoopVar,
2336                                     SourceLocation RParenLoc) {
2337     // If we've just learned that the range is actually an Objective-C
2338     // collection, treat this as an Objective-C fast enumeration loop.
2339     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2340       if (RangeStmt->isSingleDecl()) {
2341         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2342           if (RangeVar->isInvalidDecl())
2343             return StmtError();
2344 
2345           Expr *RangeExpr = RangeVar->getInit();
2346           if (!RangeExpr->isTypeDependent() &&
2347               RangeExpr->getType()->isObjCObjectPointerType()) {
2348             // FIXME: Support init-statements in Objective-C++20 ranged for
2349             // statement.
2350             if (Init) {
2351               return SemaRef.Diag(Init->getBeginLoc(),
2352                                   diag::err_objc_for_range_init_stmt)
2353                          << Init->getSourceRange();
2354             }
2355             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2356                                                         RangeExpr, RParenLoc);
2357           }
2358         }
2359       }
2360     }
2361 
2362     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2363                                           Range, Begin, End, Cond, Inc, LoopVar,
2364                                           RParenLoc, Sema::BFRK_Rebuild);
2365   }
2366 
2367   /// Build a new C++0x range-based for statement.
2368   ///
2369   /// By default, performs semantic analysis to build the new statement.
2370   /// Subclasses may override this routine to provide different behavior.
RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,bool IsIfExists,NestedNameSpecifierLoc QualifierLoc,DeclarationNameInfo NameInfo,Stmt * Nested)2371   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2372                                           bool IsIfExists,
2373                                           NestedNameSpecifierLoc QualifierLoc,
2374                                           DeclarationNameInfo NameInfo,
2375                                           Stmt *Nested) {
2376     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2377                                                 QualifierLoc, NameInfo, Nested);
2378   }
2379 
2380   /// Attach body to a C++0x range-based for statement.
2381   ///
2382   /// By default, performs semantic analysis to finish the new statement.
2383   /// Subclasses may override this routine to provide different behavior.
FinishCXXForRangeStmt(Stmt * ForRange,Stmt * Body)2384   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2385     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2386   }
2387 
RebuildSEHTryStmt(bool IsCXXTry,SourceLocation TryLoc,Stmt * TryBlock,Stmt * Handler)2388   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2389                                Stmt *TryBlock, Stmt *Handler) {
2390     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2391   }
2392 
RebuildSEHExceptStmt(SourceLocation Loc,Expr * FilterExpr,Stmt * Block)2393   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2394                                   Stmt *Block) {
2395     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2396   }
2397 
RebuildSEHFinallyStmt(SourceLocation Loc,Stmt * Block)2398   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2399     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2400   }
2401 
2402   /// Build a new predefined expression.
2403   ///
2404   /// By default, performs semantic analysis to build the new expression.
2405   /// Subclasses may override this routine to provide different behavior.
RebuildPredefinedExpr(SourceLocation Loc,PredefinedExpr::IdentKind IK)2406   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2407                                    PredefinedExpr::IdentKind IK) {
2408     return getSema().BuildPredefinedExpr(Loc, IK);
2409   }
2410 
2411   /// Build a new expression that references a declaration.
2412   ///
2413   /// By default, performs semantic analysis to build the new expression.
2414   /// Subclasses may override this routine to provide different behavior.
RebuildDeclarationNameExpr(const CXXScopeSpec & SS,LookupResult & R,bool RequiresADL)2415   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2416                                         LookupResult &R,
2417                                         bool RequiresADL) {
2418     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2419   }
2420 
2421 
2422   /// Build a new expression that references a declaration.
2423   ///
2424   /// By default, performs semantic analysis to build the new expression.
2425   /// Subclasses may override this routine to provide different behavior.
RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,ValueDecl * VD,const DeclarationNameInfo & NameInfo,NamedDecl * Found,TemplateArgumentListInfo * TemplateArgs)2426   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2427                                 ValueDecl *VD,
2428                                 const DeclarationNameInfo &NameInfo,
2429                                 NamedDecl *Found,
2430                                 TemplateArgumentListInfo *TemplateArgs) {
2431     CXXScopeSpec SS;
2432     SS.Adopt(QualifierLoc);
2433     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2434                                               TemplateArgs);
2435   }
2436 
2437   /// Build a new expression in parentheses.
2438   ///
2439   /// By default, performs semantic analysis to build the new expression.
2440   /// Subclasses may override this routine to provide different behavior.
RebuildParenExpr(Expr * SubExpr,SourceLocation LParen,SourceLocation RParen)2441   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2442                                     SourceLocation RParen) {
2443     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2444   }
2445 
2446   /// Build a new pseudo-destructor expression.
2447   ///
2448   /// By default, performs semantic analysis to build the new expression.
2449   /// Subclasses may override this routine to provide different behavior.
2450   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2451                                             SourceLocation OperatorLoc,
2452                                             bool isArrow,
2453                                             CXXScopeSpec &SS,
2454                                             TypeSourceInfo *ScopeType,
2455                                             SourceLocation CCLoc,
2456                                             SourceLocation TildeLoc,
2457                                         PseudoDestructorTypeStorage Destroyed);
2458 
2459   /// Build a new unary operator expression.
2460   ///
2461   /// By default, performs semantic analysis to build the new expression.
2462   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryOperator(SourceLocation OpLoc,UnaryOperatorKind Opc,Expr * SubExpr)2463   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2464                                         UnaryOperatorKind Opc,
2465                                         Expr *SubExpr) {
2466     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2467   }
2468 
2469   /// Build a new builtin offsetof expression.
2470   ///
2471   /// By default, performs semantic analysis to build the new expression.
2472   /// Subclasses may override this routine to provide different behavior.
RebuildOffsetOfExpr(SourceLocation OperatorLoc,TypeSourceInfo * Type,ArrayRef<Sema::OffsetOfComponent> Components,SourceLocation RParenLoc)2473   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2474                                  TypeSourceInfo *Type,
2475                                  ArrayRef<Sema::OffsetOfComponent> Components,
2476                                  SourceLocation RParenLoc) {
2477     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2478                                           RParenLoc);
2479   }
2480 
2481   /// Build a new sizeof, alignof or vec_step expression with a
2482   /// type argument.
2483   ///
2484   /// By default, performs semantic analysis to build the new expression.
2485   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(TypeSourceInfo * TInfo,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)2486   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2487                                          SourceLocation OpLoc,
2488                                          UnaryExprOrTypeTrait ExprKind,
2489                                          SourceRange R) {
2490     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2491   }
2492 
2493   /// Build a new sizeof, alignof or vec step expression with an
2494   /// expression argument.
2495   ///
2496   /// By default, performs semantic analysis to build the new expression.
2497   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(Expr * SubExpr,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)2498   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2499                                          UnaryExprOrTypeTrait ExprKind,
2500                                          SourceRange R) {
2501     ExprResult Result
2502       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2503     if (Result.isInvalid())
2504       return ExprError();
2505 
2506     return Result;
2507   }
2508 
2509   /// Build a new array subscript expression.
2510   ///
2511   /// By default, performs semantic analysis to build the new expression.
2512   /// Subclasses may override this routine to provide different behavior.
RebuildArraySubscriptExpr(Expr * LHS,SourceLocation LBracketLoc,Expr * RHS,SourceLocation RBracketLoc)2513   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2514                                              SourceLocation LBracketLoc,
2515                                              Expr *RHS,
2516                                              SourceLocation RBracketLoc) {
2517     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2518                                              LBracketLoc, RHS,
2519                                              RBracketLoc);
2520   }
2521 
2522   /// Build a new matrix subscript expression.
2523   ///
2524   /// By default, performs semantic analysis to build the new expression.
2525   /// Subclasses may override this routine to provide different behavior.
RebuildMatrixSubscriptExpr(Expr * Base,Expr * RowIdx,Expr * ColumnIdx,SourceLocation RBracketLoc)2526   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2527                                         Expr *ColumnIdx,
2528                                         SourceLocation RBracketLoc) {
2529     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2530                                                       RBracketLoc);
2531   }
2532 
2533   /// Build a new array section expression.
2534   ///
2535   /// By default, performs semantic analysis to build the new expression.
2536   /// 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)2537   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2538                                         Expr *LowerBound,
2539                                         SourceLocation ColonLocFirst,
2540                                         SourceLocation ColonLocSecond,
2541                                         Expr *Length, Expr *Stride,
2542                                         SourceLocation RBracketLoc) {
2543     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2544                                               ColonLocFirst, ColonLocSecond,
2545                                               Length, Stride, RBracketLoc);
2546   }
2547 
2548   /// Build a new array shaping expression.
2549   ///
2550   /// By default, performs semantic analysis to build the new expression.
2551   /// Subclasses may override this routine to provide different behavior.
RebuildOMPArrayShapingExpr(Expr * Base,SourceLocation LParenLoc,SourceLocation RParenLoc,ArrayRef<Expr * > Dims,ArrayRef<SourceRange> BracketsRanges)2552   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2553                                         SourceLocation RParenLoc,
2554                                         ArrayRef<Expr *> Dims,
2555                                         ArrayRef<SourceRange> BracketsRanges) {
2556     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2557                                               BracketsRanges);
2558   }
2559 
2560   /// Build a new iterator expression.
2561   ///
2562   /// By default, performs semantic analysis to build the new expression.
2563   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIteratorExpr(SourceLocation IteratorKwLoc,SourceLocation LLoc,SourceLocation RLoc,ArrayRef<Sema::OMPIteratorData> Data)2564   ExprResult RebuildOMPIteratorExpr(
2565       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2566       ArrayRef<Sema::OMPIteratorData> Data) {
2567     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2568                                           LLoc, RLoc, Data);
2569   }
2570 
2571   /// Build a new call expression.
2572   ///
2573   /// By default, performs semantic analysis to build the new expression.
2574   /// Subclasses may override this routine to provide different behavior.
2575   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2576                                    MultiExprArg Args,
2577                                    SourceLocation RParenLoc,
2578                                    Expr *ExecConfig = nullptr) {
2579     return getSema().ActOnCallExpr(
2580         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2581   }
2582 
2583   /// Build a new member access expression.
2584   ///
2585   /// By default, performs semantic analysis to build the new expression.
2586   /// 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)2587   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2588                                bool isArrow,
2589                                NestedNameSpecifierLoc QualifierLoc,
2590                                SourceLocation TemplateKWLoc,
2591                                const DeclarationNameInfo &MemberNameInfo,
2592                                ValueDecl *Member,
2593                                NamedDecl *FoundDecl,
2594                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2595                                NamedDecl *FirstQualifierInScope) {
2596     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2597                                                                       isArrow);
2598     if (!Member->getDeclName()) {
2599       // We have a reference to an unnamed field.  This is always the
2600       // base of an anonymous struct/union member access, i.e. the
2601       // field is always of record type.
2602       assert(Member->getType()->isRecordType() &&
2603              "unnamed member not of record type?");
2604 
2605       BaseResult =
2606         getSema().PerformObjectMemberConversion(BaseResult.get(),
2607                                                 QualifierLoc.getNestedNameSpecifier(),
2608                                                 FoundDecl, Member);
2609       if (BaseResult.isInvalid())
2610         return ExprError();
2611       Base = BaseResult.get();
2612 
2613       CXXScopeSpec EmptySS;
2614       return getSema().BuildFieldReferenceExpr(
2615           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2616           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2617     }
2618 
2619     CXXScopeSpec SS;
2620     SS.Adopt(QualifierLoc);
2621 
2622     Base = BaseResult.get();
2623     QualType BaseType = Base->getType();
2624 
2625     if (isArrow && !BaseType->isPointerType())
2626       return ExprError();
2627 
2628     // FIXME: this involves duplicating earlier analysis in a lot of
2629     // cases; we should avoid this when possible.
2630     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2631     R.addDecl(FoundDecl);
2632     R.resolveKind();
2633 
2634     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2635                                               SS, TemplateKWLoc,
2636                                               FirstQualifierInScope,
2637                                               R, ExplicitTemplateArgs,
2638                                               /*S*/nullptr);
2639   }
2640 
2641   /// Build a new binary operator expression.
2642   ///
2643   /// By default, performs semantic analysis to build the new expression.
2644   /// Subclasses may override this routine to provide different behavior.
RebuildBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opc,Expr * LHS,Expr * RHS)2645   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2646                                          BinaryOperatorKind Opc,
2647                                          Expr *LHS, Expr *RHS) {
2648     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2649   }
2650 
2651   /// Build a new rewritten operator expression.
2652   ///
2653   /// By default, performs semantic analysis to build the new expression.
2654   /// Subclasses may override this routine to provide different behavior.
RebuildCXXRewrittenBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opcode,const UnresolvedSetImpl & UnqualLookups,Expr * LHS,Expr * RHS)2655   ExprResult RebuildCXXRewrittenBinaryOperator(
2656       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2657       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2658     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2659                                            RHS, /*RequiresADL*/false);
2660   }
2661 
2662   /// Build a new conditional operator expression.
2663   ///
2664   /// By default, performs semantic analysis to build the new expression.
2665   /// Subclasses may override this routine to provide different behavior.
RebuildConditionalOperator(Expr * Cond,SourceLocation QuestionLoc,Expr * LHS,SourceLocation ColonLoc,Expr * RHS)2666   ExprResult RebuildConditionalOperator(Expr *Cond,
2667                                         SourceLocation QuestionLoc,
2668                                         Expr *LHS,
2669                                         SourceLocation ColonLoc,
2670                                         Expr *RHS) {
2671     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2672                                         LHS, RHS);
2673   }
2674 
2675   /// Build a new C-style cast expression.
2676   ///
2677   /// By default, performs semantic analysis to build the new expression.
2678   /// Subclasses may override this routine to provide different behavior.
RebuildCStyleCastExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * SubExpr)2679   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2680                                          TypeSourceInfo *TInfo,
2681                                          SourceLocation RParenLoc,
2682                                          Expr *SubExpr) {
2683     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2684                                          SubExpr);
2685   }
2686 
2687   /// Build a new compound literal expression.
2688   ///
2689   /// By default, performs semantic analysis to build the new expression.
2690   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundLiteralExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * Init)2691   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2692                                               TypeSourceInfo *TInfo,
2693                                               SourceLocation RParenLoc,
2694                                               Expr *Init) {
2695     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2696                                               Init);
2697   }
2698 
2699   /// Build a new extended vector element access expression.
2700   ///
2701   /// By default, performs semantic analysis to build the new expression.
2702   /// Subclasses may override this routine to provide different behavior.
RebuildExtVectorElementExpr(Expr * Base,SourceLocation OpLoc,SourceLocation AccessorLoc,IdentifierInfo & Accessor)2703   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2704                                                SourceLocation OpLoc,
2705                                                SourceLocation AccessorLoc,
2706                                                IdentifierInfo &Accessor) {
2707 
2708     CXXScopeSpec SS;
2709     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2710     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2711                                               OpLoc, /*IsArrow*/ false,
2712                                               SS, SourceLocation(),
2713                                               /*FirstQualifierInScope*/ nullptr,
2714                                               NameInfo,
2715                                               /* TemplateArgs */ nullptr,
2716                                               /*S*/ nullptr);
2717   }
2718 
2719   /// Build a new initializer list expression.
2720   ///
2721   /// By default, performs semantic analysis to build the new expression.
2722   /// Subclasses may override this routine to provide different behavior.
RebuildInitList(SourceLocation LBraceLoc,MultiExprArg Inits,SourceLocation RBraceLoc)2723   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2724                              MultiExprArg Inits,
2725                              SourceLocation RBraceLoc) {
2726     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2727   }
2728 
2729   /// Build a new designated initializer expression.
2730   ///
2731   /// By default, performs semantic analysis to build the new expression.
2732   /// Subclasses may override this routine to provide different behavior.
RebuildDesignatedInitExpr(Designation & Desig,MultiExprArg ArrayExprs,SourceLocation EqualOrColonLoc,bool GNUSyntax,Expr * Init)2733   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2734                                              MultiExprArg ArrayExprs,
2735                                              SourceLocation EqualOrColonLoc,
2736                                              bool GNUSyntax,
2737                                              Expr *Init) {
2738     ExprResult Result
2739       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2740                                            Init);
2741     if (Result.isInvalid())
2742       return ExprError();
2743 
2744     return Result;
2745   }
2746 
2747   /// Build a new value-initialized expression.
2748   ///
2749   /// By default, builds the implicit value initialization without performing
2750   /// any semantic analysis. Subclasses may override this routine to provide
2751   /// different behavior.
RebuildImplicitValueInitExpr(QualType T)2752   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2753     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2754   }
2755 
2756   /// Build a new \c va_arg expression.
2757   ///
2758   /// By default, performs semantic analysis to build the new expression.
2759   /// Subclasses may override this routine to provide different behavior.
RebuildVAArgExpr(SourceLocation BuiltinLoc,Expr * SubExpr,TypeSourceInfo * TInfo,SourceLocation RParenLoc)2760   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2761                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2762                                     SourceLocation RParenLoc) {
2763     return getSema().BuildVAArgExpr(BuiltinLoc,
2764                                     SubExpr, TInfo,
2765                                     RParenLoc);
2766   }
2767 
2768   /// Build a new expression list in parentheses.
2769   ///
2770   /// By default, performs semantic analysis to build the new expression.
2771   /// Subclasses may override this routine to provide different behavior.
RebuildParenListExpr(SourceLocation LParenLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2772   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2773                                   MultiExprArg SubExprs,
2774                                   SourceLocation RParenLoc) {
2775     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2776   }
2777 
2778   /// Build a new address-of-label expression.
2779   ///
2780   /// By default, performs semantic analysis, using the name of the label
2781   /// rather than attempting to map the label statement itself.
2782   /// Subclasses may override this routine to provide different behavior.
RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,SourceLocation LabelLoc,LabelDecl * Label)2783   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2784                                   SourceLocation LabelLoc, LabelDecl *Label) {
2785     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2786   }
2787 
2788   /// Build a new GNU statement expression.
2789   ///
2790   /// By default, performs semantic analysis to build the new expression.
2791   /// Subclasses may override this routine to provide different behavior.
RebuildStmtExpr(SourceLocation LParenLoc,Stmt * SubStmt,SourceLocation RParenLoc,unsigned TemplateDepth)2792   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2793                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2794     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2795                                    TemplateDepth);
2796   }
2797 
2798   /// Build a new __builtin_choose_expr expression.
2799   ///
2800   /// By default, performs semantic analysis to build the new expression.
2801   /// Subclasses may override this routine to provide different behavior.
RebuildChooseExpr(SourceLocation BuiltinLoc,Expr * Cond,Expr * LHS,Expr * RHS,SourceLocation RParenLoc)2802   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2803                                      Expr *Cond, Expr *LHS, Expr *RHS,
2804                                      SourceLocation RParenLoc) {
2805     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2806                                    Cond, LHS, RHS,
2807                                    RParenLoc);
2808   }
2809 
2810   /// Build a new generic selection expression.
2811   ///
2812   /// By default, performs semantic analysis to build the new expression.
2813   /// Subclasses may override this routine to provide different behavior.
RebuildGenericSelectionExpr(SourceLocation KeyLoc,SourceLocation DefaultLoc,SourceLocation RParenLoc,Expr * ControllingExpr,ArrayRef<TypeSourceInfo * > Types,ArrayRef<Expr * > Exprs)2814   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2815                                          SourceLocation DefaultLoc,
2816                                          SourceLocation RParenLoc,
2817                                          Expr *ControllingExpr,
2818                                          ArrayRef<TypeSourceInfo *> Types,
2819                                          ArrayRef<Expr *> Exprs) {
2820     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2821                                                 ControllingExpr, Types, Exprs);
2822   }
2823 
2824   /// Build a new overloaded operator call expression.
2825   ///
2826   /// By default, performs semantic analysis to build the new expression.
2827   /// The semantic analysis provides the behavior of template instantiation,
2828   /// copying with transformations that turn what looks like an overloaded
2829   /// operator call into a use of a builtin operator, performing
2830   /// argument-dependent lookup, etc. Subclasses may override this routine to
2831   /// provide different behavior.
2832   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2833                                               SourceLocation OpLoc,
2834                                               Expr *Callee,
2835                                               Expr *First,
2836                                               Expr *Second);
2837 
2838   /// Build a new C++ "named" cast expression, such as static_cast or
2839   /// reinterpret_cast.
2840   ///
2841   /// By default, this routine dispatches to one of the more-specific routines
2842   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2843   /// 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)2844   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2845                                            Stmt::StmtClass Class,
2846                                            SourceLocation LAngleLoc,
2847                                            TypeSourceInfo *TInfo,
2848                                            SourceLocation RAngleLoc,
2849                                            SourceLocation LParenLoc,
2850                                            Expr *SubExpr,
2851                                            SourceLocation RParenLoc) {
2852     switch (Class) {
2853     case Stmt::CXXStaticCastExprClass:
2854       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2855                                                    RAngleLoc, LParenLoc,
2856                                                    SubExpr, RParenLoc);
2857 
2858     case Stmt::CXXDynamicCastExprClass:
2859       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2860                                                     RAngleLoc, LParenLoc,
2861                                                     SubExpr, RParenLoc);
2862 
2863     case Stmt::CXXReinterpretCastExprClass:
2864       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2865                                                         RAngleLoc, LParenLoc,
2866                                                         SubExpr,
2867                                                         RParenLoc);
2868 
2869     case Stmt::CXXConstCastExprClass:
2870       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2871                                                    RAngleLoc, LParenLoc,
2872                                                    SubExpr, RParenLoc);
2873 
2874     case Stmt::CXXAddrspaceCastExprClass:
2875       return getDerived().RebuildCXXAddrspaceCastExpr(
2876           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2877 
2878     default:
2879       llvm_unreachable("Invalid C++ named cast");
2880     }
2881   }
2882 
2883   /// Build a new C++ static_cast expression.
2884   ///
2885   /// By default, performs semantic analysis to build the new expression.
2886   /// Subclasses may override this routine to provide different behavior.
RebuildCXXStaticCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2887   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2888                                             SourceLocation LAngleLoc,
2889                                             TypeSourceInfo *TInfo,
2890                                             SourceLocation RAngleLoc,
2891                                             SourceLocation LParenLoc,
2892                                             Expr *SubExpr,
2893                                             SourceLocation RParenLoc) {
2894     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2895                                        TInfo, SubExpr,
2896                                        SourceRange(LAngleLoc, RAngleLoc),
2897                                        SourceRange(LParenLoc, RParenLoc));
2898   }
2899 
2900   /// Build a new C++ dynamic_cast expression.
2901   ///
2902   /// By default, performs semantic analysis to build the new expression.
2903   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDynamicCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2904   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2905                                              SourceLocation LAngleLoc,
2906                                              TypeSourceInfo *TInfo,
2907                                              SourceLocation RAngleLoc,
2908                                              SourceLocation LParenLoc,
2909                                              Expr *SubExpr,
2910                                              SourceLocation RParenLoc) {
2911     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2912                                        TInfo, SubExpr,
2913                                        SourceRange(LAngleLoc, RAngleLoc),
2914                                        SourceRange(LParenLoc, RParenLoc));
2915   }
2916 
2917   /// Build a new C++ reinterpret_cast expression.
2918   ///
2919   /// By default, performs semantic analysis to build the new expression.
2920   /// Subclasses may override this routine to provide different behavior.
RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2921   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2922                                                  SourceLocation LAngleLoc,
2923                                                  TypeSourceInfo *TInfo,
2924                                                  SourceLocation RAngleLoc,
2925                                                  SourceLocation LParenLoc,
2926                                                  Expr *SubExpr,
2927                                                  SourceLocation RParenLoc) {
2928     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2929                                        TInfo, SubExpr,
2930                                        SourceRange(LAngleLoc, RAngleLoc),
2931                                        SourceRange(LParenLoc, RParenLoc));
2932   }
2933 
2934   /// Build a new C++ const_cast expression.
2935   ///
2936   /// By default, performs semantic analysis to build the new expression.
2937   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2938   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2939                                            SourceLocation LAngleLoc,
2940                                            TypeSourceInfo *TInfo,
2941                                            SourceLocation RAngleLoc,
2942                                            SourceLocation LParenLoc,
2943                                            Expr *SubExpr,
2944                                            SourceLocation RParenLoc) {
2945     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2946                                        TInfo, SubExpr,
2947                                        SourceRange(LAngleLoc, RAngleLoc),
2948                                        SourceRange(LParenLoc, RParenLoc));
2949   }
2950 
2951   ExprResult
RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2952   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2953                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2954                               SourceLocation LParenLoc, Expr *SubExpr,
2955                               SourceLocation RParenLoc) {
2956     return getSema().BuildCXXNamedCast(
2957         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2958         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2959   }
2960 
2961   /// Build a new C++ functional-style cast expression.
2962   ///
2963   /// By default, performs semantic analysis to build the new expression.
2964   /// Subclasses may override this routine to provide different behavior.
RebuildCXXFunctionalCastExpr(TypeSourceInfo * TInfo,SourceLocation LParenLoc,Expr * Sub,SourceLocation RParenLoc,bool ListInitialization)2965   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2966                                           SourceLocation LParenLoc,
2967                                           Expr *Sub,
2968                                           SourceLocation RParenLoc,
2969                                           bool ListInitialization) {
2970     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2971                                                MultiExprArg(&Sub, 1), RParenLoc,
2972                                                ListInitialization);
2973   }
2974 
2975   /// Build a new C++ __builtin_bit_cast expression.
2976   ///
2977   /// By default, performs semantic analysis to build the new expression.
2978   /// Subclasses may override this routine to provide different behavior.
RebuildBuiltinBitCastExpr(SourceLocation KWLoc,TypeSourceInfo * TSI,Expr * Sub,SourceLocation RParenLoc)2979   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2980                                        TypeSourceInfo *TSI, Expr *Sub,
2981                                        SourceLocation RParenLoc) {
2982     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2983   }
2984 
2985   /// Build a new C++ typeid(type) expression.
2986   ///
2987   /// By default, performs semantic analysis to build the new expression.
2988   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)2989   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2990                                         SourceLocation TypeidLoc,
2991                                         TypeSourceInfo *Operand,
2992                                         SourceLocation RParenLoc) {
2993     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2994                                     RParenLoc);
2995   }
2996 
2997 
2998   /// Build a new C++ typeid(expr) expression.
2999   ///
3000   /// By default, performs semantic analysis to build the new expression.
3001   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)3002   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3003                                         SourceLocation TypeidLoc,
3004                                         Expr *Operand,
3005                                         SourceLocation RParenLoc) {
3006     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3007                                     RParenLoc);
3008   }
3009 
3010   /// Build a new C++ __uuidof(type) expression.
3011   ///
3012   /// By default, performs semantic analysis to build the new expression.
3013   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType Type,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)3014   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3015                                   TypeSourceInfo *Operand,
3016                                   SourceLocation RParenLoc) {
3017     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3018   }
3019 
3020   /// Build a new C++ __uuidof(expr) expression.
3021   ///
3022   /// By default, performs semantic analysis to build the new expression.
3023   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType Type,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)3024   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3025                                   Expr *Operand, SourceLocation RParenLoc) {
3026     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3027   }
3028 
3029   /// Build a new C++ "this" expression.
3030   ///
3031   /// By default, builds a new "this" expression without performing any
3032   /// semantic analysis. Subclasses may override this routine to provide
3033   /// different behavior.
RebuildCXXThisExpr(SourceLocation ThisLoc,QualType ThisType,bool isImplicit)3034   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3035                                 QualType ThisType,
3036                                 bool isImplicit) {
3037     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3038   }
3039 
3040   /// Build a new C++ throw expression.
3041   ///
3042   /// By default, performs semantic analysis to build the new expression.
3043   /// Subclasses may override this routine to provide different behavior.
RebuildCXXThrowExpr(SourceLocation ThrowLoc,Expr * Sub,bool IsThrownVariableInScope)3044   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3045                                  bool IsThrownVariableInScope) {
3046     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3047   }
3048 
3049   /// Build a new C++ default-argument expression.
3050   ///
3051   /// By default, builds a new default-argument expression, which does not
3052   /// require any semantic analysis. Subclasses may override this routine to
3053   /// provide different behavior.
RebuildCXXDefaultArgExpr(SourceLocation Loc,ParmVarDecl * Param)3054   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3055     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3056                                      getSema().CurContext);
3057   }
3058 
3059   /// Build a new C++11 default-initialization expression.
3060   ///
3061   /// By default, builds a new default field initialization expression, which
3062   /// does not require any semantic analysis. Subclasses may override this
3063   /// routine to provide different behavior.
RebuildCXXDefaultInitExpr(SourceLocation Loc,FieldDecl * Field)3064   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3065                                        FieldDecl *Field) {
3066     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3067                                       getSema().CurContext);
3068   }
3069 
3070   /// Build a new C++ zero-initialization expression.
3071   ///
3072   /// By default, performs semantic analysis to build the new expression.
3073   /// Subclasses may override this routine to provide different behavior.
RebuildCXXScalarValueInitExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,SourceLocation RParenLoc)3074   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3075                                            SourceLocation LParenLoc,
3076                                            SourceLocation RParenLoc) {
3077     return getSema().BuildCXXTypeConstructExpr(
3078         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3079   }
3080 
3081   /// Build a new C++ "new" expression.
3082   ///
3083   /// By default, performs semantic analysis to build the new expression.
3084   /// 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,Optional<Expr * > ArraySize,SourceRange DirectInitRange,Expr * Initializer)3085   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3086                                bool UseGlobal,
3087                                SourceLocation PlacementLParen,
3088                                MultiExprArg PlacementArgs,
3089                                SourceLocation PlacementRParen,
3090                                SourceRange TypeIdParens,
3091                                QualType AllocatedType,
3092                                TypeSourceInfo *AllocatedTypeInfo,
3093                                Optional<Expr *> ArraySize,
3094                                SourceRange DirectInitRange,
3095                                Expr *Initializer) {
3096     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3097                                  PlacementLParen,
3098                                  PlacementArgs,
3099                                  PlacementRParen,
3100                                  TypeIdParens,
3101                                  AllocatedType,
3102                                  AllocatedTypeInfo,
3103                                  ArraySize,
3104                                  DirectInitRange,
3105                                  Initializer);
3106   }
3107 
3108   /// Build a new C++ "delete" expression.
3109   ///
3110   /// By default, performs semantic analysis to build the new expression.
3111   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDeleteExpr(SourceLocation StartLoc,bool IsGlobalDelete,bool IsArrayForm,Expr * Operand)3112   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3113                                         bool IsGlobalDelete,
3114                                         bool IsArrayForm,
3115                                         Expr *Operand) {
3116     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3117                                     Operand);
3118   }
3119 
3120   /// Build a new type trait expression.
3121   ///
3122   /// By default, performs semantic analysis to build the new expression.
3123   /// Subclasses may override this routine to provide different behavior.
RebuildTypeTrait(TypeTrait Trait,SourceLocation StartLoc,ArrayRef<TypeSourceInfo * > Args,SourceLocation RParenLoc)3124   ExprResult RebuildTypeTrait(TypeTrait Trait,
3125                               SourceLocation StartLoc,
3126                               ArrayRef<TypeSourceInfo *> Args,
3127                               SourceLocation RParenLoc) {
3128     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3129   }
3130 
3131   /// Build a new array type trait expression.
3132   ///
3133   /// By default, performs semantic analysis to build the new expression.
3134   /// Subclasses may override this routine to provide different behavior.
RebuildArrayTypeTrait(ArrayTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * TSInfo,Expr * DimExpr,SourceLocation RParenLoc)3135   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3136                                    SourceLocation StartLoc,
3137                                    TypeSourceInfo *TSInfo,
3138                                    Expr *DimExpr,
3139                                    SourceLocation RParenLoc) {
3140     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3141   }
3142 
3143   /// Build a new expression trait expression.
3144   ///
3145   /// By default, performs semantic analysis to build the new expression.
3146   /// Subclasses may override this routine to provide different behavior.
RebuildExpressionTrait(ExpressionTrait Trait,SourceLocation StartLoc,Expr * Queried,SourceLocation RParenLoc)3147   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3148                                    SourceLocation StartLoc,
3149                                    Expr *Queried,
3150                                    SourceLocation RParenLoc) {
3151     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3152   }
3153 
3154   /// Build a new (previously unresolved) declaration reference
3155   /// expression.
3156   ///
3157   /// By default, performs semantic analysis to build the new expression.
3158   /// Subclasses may override this routine to provide different behavior.
RebuildDependentScopeDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * TemplateArgs,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)3159   ExprResult RebuildDependentScopeDeclRefExpr(
3160                                           NestedNameSpecifierLoc QualifierLoc,
3161                                           SourceLocation TemplateKWLoc,
3162                                        const DeclarationNameInfo &NameInfo,
3163                               const TemplateArgumentListInfo *TemplateArgs,
3164                                           bool IsAddressOfOperand,
3165                                           TypeSourceInfo **RecoveryTSI) {
3166     CXXScopeSpec SS;
3167     SS.Adopt(QualifierLoc);
3168 
3169     if (TemplateArgs || TemplateKWLoc.isValid())
3170       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3171                                                     TemplateArgs);
3172 
3173     return getSema().BuildQualifiedDeclarationNameExpr(
3174         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3175   }
3176 
3177   /// Build a new template-id expression.
3178   ///
3179   /// By default, performs semantic analysis to build the new expression.
3180   /// Subclasses may override this routine to provide different behavior.
RebuildTemplateIdExpr(const CXXScopeSpec & SS,SourceLocation TemplateKWLoc,LookupResult & R,bool RequiresADL,const TemplateArgumentListInfo * TemplateArgs)3181   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3182                                    SourceLocation TemplateKWLoc,
3183                                    LookupResult &R,
3184                                    bool RequiresADL,
3185                               const TemplateArgumentListInfo *TemplateArgs) {
3186     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3187                                          TemplateArgs);
3188   }
3189 
3190   /// Build a new object-construction expression.
3191   ///
3192   /// By default, performs semantic analysis to build the new expression.
3193   /// 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)3194   ExprResult RebuildCXXConstructExpr(QualType T,
3195                                      SourceLocation Loc,
3196                                      CXXConstructorDecl *Constructor,
3197                                      bool IsElidable,
3198                                      MultiExprArg Args,
3199                                      bool HadMultipleCandidates,
3200                                      bool ListInitialization,
3201                                      bool StdInitListInitialization,
3202                                      bool RequiresZeroInit,
3203                              CXXConstructExpr::ConstructionKind ConstructKind,
3204                                      SourceRange ParenRange) {
3205     // Reconstruct the constructor we originally found, which might be
3206     // different if this is a call to an inherited constructor.
3207     CXXConstructorDecl *FoundCtor = Constructor;
3208     if (Constructor->isInheritingConstructor())
3209       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3210 
3211     SmallVector<Expr *, 8> ConvertedArgs;
3212     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3213                                           ConvertedArgs))
3214       return ExprError();
3215 
3216     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3217                                            IsElidable,
3218                                            ConvertedArgs,
3219                                            HadMultipleCandidates,
3220                                            ListInitialization,
3221                                            StdInitListInitialization,
3222                                            RequiresZeroInit, ConstructKind,
3223                                            ParenRange);
3224   }
3225 
3226   /// Build a new implicit construction via inherited constructor
3227   /// expression.
RebuildCXXInheritedCtorInitExpr(QualType T,SourceLocation Loc,CXXConstructorDecl * Constructor,bool ConstructsVBase,bool InheritedFromVBase)3228   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3229                                              CXXConstructorDecl *Constructor,
3230                                              bool ConstructsVBase,
3231                                              bool InheritedFromVBase) {
3232     return new (getSema().Context) CXXInheritedCtorInitExpr(
3233         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3234   }
3235 
3236   /// Build a new object-construction expression.
3237   ///
3238   /// By default, performs semantic analysis to build the new expression.
3239   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTemporaryObjectExpr(TypeSourceInfo * TSInfo,SourceLocation LParenOrBraceLoc,MultiExprArg Args,SourceLocation RParenOrBraceLoc,bool ListInitialization)3240   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3241                                            SourceLocation LParenOrBraceLoc,
3242                                            MultiExprArg Args,
3243                                            SourceLocation RParenOrBraceLoc,
3244                                            bool ListInitialization) {
3245     return getSema().BuildCXXTypeConstructExpr(
3246         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3247   }
3248 
3249   /// Build a new object-construction expression.
3250   ///
3251   /// By default, performs semantic analysis to build the new expression.
3252   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUnresolvedConstructExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc,bool ListInitialization)3253   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3254                                                SourceLocation LParenLoc,
3255                                                MultiExprArg Args,
3256                                                SourceLocation RParenLoc,
3257                                                bool ListInitialization) {
3258     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3259                                                RParenLoc, ListInitialization);
3260   }
3261 
3262   /// Build a new member reference expression.
3263   ///
3264   /// By default, performs semantic analysis to build the new expression.
3265   /// 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)3266   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3267                                                 QualType BaseType,
3268                                                 bool IsArrow,
3269                                                 SourceLocation OperatorLoc,
3270                                           NestedNameSpecifierLoc QualifierLoc,
3271                                                 SourceLocation TemplateKWLoc,
3272                                             NamedDecl *FirstQualifierInScope,
3273                                    const DeclarationNameInfo &MemberNameInfo,
3274                               const TemplateArgumentListInfo *TemplateArgs) {
3275     CXXScopeSpec SS;
3276     SS.Adopt(QualifierLoc);
3277 
3278     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3279                                             OperatorLoc, IsArrow,
3280                                             SS, TemplateKWLoc,
3281                                             FirstQualifierInScope,
3282                                             MemberNameInfo,
3283                                             TemplateArgs, /*S*/nullptr);
3284   }
3285 
3286   /// Build a new member reference expression.
3287   ///
3288   /// By default, performs semantic analysis to build the new expression.
3289   /// 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)3290   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3291                                          SourceLocation OperatorLoc,
3292                                          bool IsArrow,
3293                                          NestedNameSpecifierLoc QualifierLoc,
3294                                          SourceLocation TemplateKWLoc,
3295                                          NamedDecl *FirstQualifierInScope,
3296                                          LookupResult &R,
3297                                 const TemplateArgumentListInfo *TemplateArgs) {
3298     CXXScopeSpec SS;
3299     SS.Adopt(QualifierLoc);
3300 
3301     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3302                                             OperatorLoc, IsArrow,
3303                                             SS, TemplateKWLoc,
3304                                             FirstQualifierInScope,
3305                                             R, TemplateArgs, /*S*/nullptr);
3306   }
3307 
3308   /// Build a new noexcept expression.
3309   ///
3310   /// By default, performs semantic analysis to build the new expression.
3311   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNoexceptExpr(SourceRange Range,Expr * Arg)3312   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3313     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3314   }
3315 
3316   /// Build a new expression to compute the length of a parameter pack.
RebuildSizeOfPackExpr(SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,Optional<unsigned> Length,ArrayRef<TemplateArgument> PartialArgs)3317   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3318                                    NamedDecl *Pack,
3319                                    SourceLocation PackLoc,
3320                                    SourceLocation RParenLoc,
3321                                    Optional<unsigned> Length,
3322                                    ArrayRef<TemplateArgument> PartialArgs) {
3323     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3324                                   RParenLoc, Length, PartialArgs);
3325   }
3326 
3327   /// Build a new expression representing a call to a source location
3328   ///  builtin.
3329   ///
3330   /// By default, performs semantic analysis to build the new expression.
3331   /// Subclasses may override this routine to provide different behavior.
RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,SourceLocation BuiltinLoc,SourceLocation RPLoc,DeclContext * ParentContext)3332   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3333                                   SourceLocation BuiltinLoc,
3334                                   SourceLocation RPLoc,
3335                                   DeclContext *ParentContext) {
3336     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3337   }
3338 
3339   /// Build a new Objective-C boxed expression.
3340   ///
3341   /// By default, performs semantic analysis to build the new expression.
3342   /// Subclasses may override this routine to provide different behavior.
RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,SourceLocation TemplateKWLoc,DeclarationNameInfo ConceptNameInfo,NamedDecl * FoundDecl,ConceptDecl * NamedConcept,TemplateArgumentListInfo * TALI)3343   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3344       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3345       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3346       TemplateArgumentListInfo *TALI) {
3347     CXXScopeSpec SS;
3348     SS.Adopt(NNS);
3349     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3350                                                          ConceptNameInfo,
3351                                                          FoundDecl,
3352                                                          NamedConcept, TALI);
3353     if (Result.isInvalid())
3354       return ExprError();
3355     return Result;
3356   }
3357 
3358   /// \brief Build a new requires expression.
3359   ///
3360   /// By default, performs semantic analysis to build the new expression.
3361   /// Subclasses may override this routine to provide different behavior.
RebuildRequiresExpr(SourceLocation RequiresKWLoc,RequiresExprBodyDecl * Body,ArrayRef<ParmVarDecl * > LocalParameters,ArrayRef<concepts::Requirement * > Requirements,SourceLocation ClosingBraceLoc)3362   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3363                                  RequiresExprBodyDecl *Body,
3364                                  ArrayRef<ParmVarDecl *> LocalParameters,
3365                                  ArrayRef<concepts::Requirement *> Requirements,
3366                                  SourceLocation ClosingBraceLoc) {
3367     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3368                                 LocalParameters, Requirements, ClosingBraceLoc);
3369   }
3370 
3371   concepts::TypeRequirement *
RebuildTypeRequirement(concepts::Requirement::SubstitutionDiagnostic * SubstDiag)3372   RebuildTypeRequirement(
3373       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3374     return SemaRef.BuildTypeRequirement(SubstDiag);
3375   }
3376 
RebuildTypeRequirement(TypeSourceInfo * T)3377   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3378     return SemaRef.BuildTypeRequirement(T);
3379   }
3380 
3381   concepts::ExprRequirement *
RebuildExprRequirement(concepts::Requirement::SubstitutionDiagnostic * SubstDiag,bool IsSimple,SourceLocation NoexceptLoc,concepts::ExprRequirement::ReturnTypeRequirement Ret)3382   RebuildExprRequirement(
3383       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3384       SourceLocation NoexceptLoc,
3385       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3386     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3387                                         std::move(Ret));
3388   }
3389 
3390   concepts::ExprRequirement *
RebuildExprRequirement(Expr * E,bool IsSimple,SourceLocation NoexceptLoc,concepts::ExprRequirement::ReturnTypeRequirement Ret)3391   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3392                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3393     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3394                                         std::move(Ret));
3395   }
3396 
3397   concepts::NestedRequirement *
RebuildNestedRequirement(concepts::Requirement::SubstitutionDiagnostic * SubstDiag)3398   RebuildNestedRequirement(
3399       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3400     return SemaRef.BuildNestedRequirement(SubstDiag);
3401   }
3402 
RebuildNestedRequirement(Expr * Constraint)3403   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3404     return SemaRef.BuildNestedRequirement(Constraint);
3405   }
3406 
3407   /// \brief Build a new Objective-C boxed expression.
3408   ///
3409   /// By default, performs semantic analysis to build the new expression.
3410   /// Subclasses may override this routine to provide different behavior.
RebuildObjCBoxedExpr(SourceRange SR,Expr * ValueExpr)3411   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3412     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3413   }
3414 
3415   /// Build a new Objective-C array literal.
3416   ///
3417   /// By default, performs semantic analysis to build the new expression.
3418   /// Subclasses may override this routine to provide different behavior.
RebuildObjCArrayLiteral(SourceRange Range,Expr ** Elements,unsigned NumElements)3419   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3420                                      Expr **Elements, unsigned NumElements) {
3421     return getSema().BuildObjCArrayLiteral(Range,
3422                                            MultiExprArg(Elements, NumElements));
3423   }
3424 
RebuildObjCSubscriptRefExpr(SourceLocation RB,Expr * Base,Expr * Key,ObjCMethodDecl * getterMethod,ObjCMethodDecl * setterMethod)3425   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3426                                          Expr *Base, Expr *Key,
3427                                          ObjCMethodDecl *getterMethod,
3428                                          ObjCMethodDecl *setterMethod) {
3429     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3430                                                    getterMethod, setterMethod);
3431   }
3432 
3433   /// Build a new Objective-C dictionary literal.
3434   ///
3435   /// By default, performs semantic analysis to build the new expression.
3436   /// Subclasses may override this routine to provide different behavior.
RebuildObjCDictionaryLiteral(SourceRange Range,MutableArrayRef<ObjCDictionaryElement> Elements)3437   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3438                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3439     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3440   }
3441 
3442   /// Build a new Objective-C \@encode expression.
3443   ///
3444   /// By default, performs semantic analysis to build the new expression.
3445   /// Subclasses may override this routine to provide different behavior.
RebuildObjCEncodeExpr(SourceLocation AtLoc,TypeSourceInfo * EncodeTypeInfo,SourceLocation RParenLoc)3446   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3447                                          TypeSourceInfo *EncodeTypeInfo,
3448                                          SourceLocation RParenLoc) {
3449     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3450   }
3451 
3452   /// Build a new Objective-C class message.
RebuildObjCMessageExpr(TypeSourceInfo * ReceiverTypeInfo,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)3453   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3454                                           Selector Sel,
3455                                           ArrayRef<SourceLocation> SelectorLocs,
3456                                           ObjCMethodDecl *Method,
3457                                           SourceLocation LBracLoc,
3458                                           MultiExprArg Args,
3459                                           SourceLocation RBracLoc) {
3460     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3461                                      ReceiverTypeInfo->getType(),
3462                                      /*SuperLoc=*/SourceLocation(),
3463                                      Sel, Method, LBracLoc, SelectorLocs,
3464                                      RBracLoc, Args);
3465   }
3466 
3467   /// Build a new Objective-C instance message.
RebuildObjCMessageExpr(Expr * Receiver,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)3468   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3469                                           Selector Sel,
3470                                           ArrayRef<SourceLocation> SelectorLocs,
3471                                           ObjCMethodDecl *Method,
3472                                           SourceLocation LBracLoc,
3473                                           MultiExprArg Args,
3474                                           SourceLocation RBracLoc) {
3475     return SemaRef.BuildInstanceMessage(Receiver,
3476                                         Receiver->getType(),
3477                                         /*SuperLoc=*/SourceLocation(),
3478                                         Sel, Method, LBracLoc, SelectorLocs,
3479                                         RBracLoc, Args);
3480   }
3481 
3482   /// 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)3483   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3484                                     Selector Sel,
3485                                     ArrayRef<SourceLocation> SelectorLocs,
3486                                     QualType SuperType,
3487                                     ObjCMethodDecl *Method,
3488                                     SourceLocation LBracLoc,
3489                                     MultiExprArg Args,
3490                                     SourceLocation RBracLoc) {
3491     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3492                                           SuperType,
3493                                           SuperLoc,
3494                                           Sel, Method, LBracLoc, SelectorLocs,
3495                                           RBracLoc, Args)
3496                                       : SemaRef.BuildClassMessage(nullptr,
3497                                           SuperType,
3498                                           SuperLoc,
3499                                           Sel, Method, LBracLoc, SelectorLocs,
3500                                           RBracLoc, Args);
3501 
3502 
3503   }
3504 
3505   /// Build a new Objective-C ivar reference expression.
3506   ///
3507   /// By default, performs semantic analysis to build the new expression.
3508   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIvarRefExpr(Expr * BaseArg,ObjCIvarDecl * Ivar,SourceLocation IvarLoc,bool IsArrow,bool IsFreeIvar)3509   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3510                                           SourceLocation IvarLoc,
3511                                           bool IsArrow, bool IsFreeIvar) {
3512     CXXScopeSpec SS;
3513     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3514     ExprResult Result = getSema().BuildMemberReferenceExpr(
3515         BaseArg, BaseArg->getType(),
3516         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3517         /*FirstQualifierInScope=*/nullptr, NameInfo,
3518         /*TemplateArgs=*/nullptr,
3519         /*S=*/nullptr);
3520     if (IsFreeIvar && Result.isUsable())
3521       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3522     return Result;
3523   }
3524 
3525   /// Build a new Objective-C property reference expression.
3526   ///
3527   /// By default, performs semantic analysis to build the new expression.
3528   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * BaseArg,ObjCPropertyDecl * Property,SourceLocation PropertyLoc)3529   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3530                                         ObjCPropertyDecl *Property,
3531                                         SourceLocation PropertyLoc) {
3532     CXXScopeSpec SS;
3533     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3534     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3535                                               /*FIXME:*/PropertyLoc,
3536                                               /*IsArrow=*/false,
3537                                               SS, SourceLocation(),
3538                                               /*FirstQualifierInScope=*/nullptr,
3539                                               NameInfo,
3540                                               /*TemplateArgs=*/nullptr,
3541                                               /*S=*/nullptr);
3542   }
3543 
3544   /// Build a new Objective-C property reference expression.
3545   ///
3546   /// By default, performs semantic analysis to build the new expression.
3547   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * Base,QualType T,ObjCMethodDecl * Getter,ObjCMethodDecl * Setter,SourceLocation PropertyLoc)3548   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3549                                         ObjCMethodDecl *Getter,
3550                                         ObjCMethodDecl *Setter,
3551                                         SourceLocation PropertyLoc) {
3552     // Since these expressions can only be value-dependent, we do not
3553     // need to perform semantic analysis again.
3554     return Owned(
3555       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3556                                                   VK_LValue, OK_ObjCProperty,
3557                                                   PropertyLoc, Base));
3558   }
3559 
3560   /// Build a new Objective-C "isa" expression.
3561   ///
3562   /// By default, performs semantic analysis to build the new expression.
3563   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIsaExpr(Expr * BaseArg,SourceLocation IsaLoc,SourceLocation OpLoc,bool IsArrow)3564   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3565                                 SourceLocation OpLoc, bool IsArrow) {
3566     CXXScopeSpec SS;
3567     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3568     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3569                                               OpLoc, IsArrow,
3570                                               SS, SourceLocation(),
3571                                               /*FirstQualifierInScope=*/nullptr,
3572                                               NameInfo,
3573                                               /*TemplateArgs=*/nullptr,
3574                                               /*S=*/nullptr);
3575   }
3576 
3577   /// Build a new shuffle vector expression.
3578   ///
3579   /// By default, performs semantic analysis to build the new expression.
3580   /// Subclasses may override this routine to provide different behavior.
RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)3581   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3582                                       MultiExprArg SubExprs,
3583                                       SourceLocation RParenLoc) {
3584     // Find the declaration for __builtin_shufflevector
3585     const IdentifierInfo &Name
3586       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3587     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3588     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3589     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3590 
3591     // Build a reference to the __builtin_shufflevector builtin
3592     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3593     Expr *Callee = new (SemaRef.Context)
3594         DeclRefExpr(SemaRef.Context, Builtin, false,
3595                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3596     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3597     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3598                                        CK_BuiltinFnToFnPtr).get();
3599 
3600     // Build the CallExpr
3601     ExprResult TheCall = CallExpr::Create(
3602         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3603         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3604         FPOptionsOverride());
3605 
3606     // Type-check the __builtin_shufflevector expression.
3607     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3608   }
3609 
3610   /// Build a new convert vector expression.
RebuildConvertVectorExpr(SourceLocation BuiltinLoc,Expr * SrcExpr,TypeSourceInfo * DstTInfo,SourceLocation RParenLoc)3611   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3612                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3613                                       SourceLocation RParenLoc) {
3614     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3615                                          BuiltinLoc, RParenLoc);
3616   }
3617 
3618   /// Build a new template argument pack expansion.
3619   ///
3620   /// By default, performs semantic analysis to build a new pack expansion
3621   /// for a template argument. Subclasses may override this routine to provide
3622   /// different behavior.
RebuildPackExpansion(TemplateArgumentLoc Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)3623   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3624                                            SourceLocation EllipsisLoc,
3625                                            Optional<unsigned> NumExpansions) {
3626     switch (Pattern.getArgument().getKind()) {
3627     case TemplateArgument::Expression: {
3628       ExprResult Result
3629         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3630                                        EllipsisLoc, NumExpansions);
3631       if (Result.isInvalid())
3632         return TemplateArgumentLoc();
3633 
3634       return TemplateArgumentLoc(Result.get(), Result.get());
3635     }
3636 
3637     case TemplateArgument::Template:
3638       return TemplateArgumentLoc(
3639           SemaRef.Context,
3640           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3641                            NumExpansions),
3642           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3643           EllipsisLoc);
3644 
3645     case TemplateArgument::Null:
3646     case TemplateArgument::Integral:
3647     case TemplateArgument::Declaration:
3648     case TemplateArgument::Pack:
3649     case TemplateArgument::TemplateExpansion:
3650     case TemplateArgument::NullPtr:
3651       llvm_unreachable("Pack expansion pattern has no parameter packs");
3652 
3653     case TemplateArgument::Type:
3654       if (TypeSourceInfo *Expansion
3655             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3656                                            EllipsisLoc,
3657                                            NumExpansions))
3658         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3659                                    Expansion);
3660       break;
3661     }
3662 
3663     return TemplateArgumentLoc();
3664   }
3665 
3666   /// Build a new expression pack expansion.
3667   ///
3668   /// By default, performs semantic analysis to build a new pack expansion
3669   /// for an expression. Subclasses may override this routine to provide
3670   /// different behavior.
RebuildPackExpansion(Expr * Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)3671   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3672                                   Optional<unsigned> NumExpansions) {
3673     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3674   }
3675 
3676   /// Build a new C++1z fold-expression.
3677   ///
3678   /// By default, performs semantic analysis in order to build a new fold
3679   /// expression.
RebuildCXXFoldExpr(UnresolvedLookupExpr * ULE,SourceLocation LParenLoc,Expr * LHS,BinaryOperatorKind Operator,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation RParenLoc,Optional<unsigned> NumExpansions)3680   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3681                                 SourceLocation LParenLoc, Expr *LHS,
3682                                 BinaryOperatorKind Operator,
3683                                 SourceLocation EllipsisLoc, Expr *RHS,
3684                                 SourceLocation RParenLoc,
3685                                 Optional<unsigned> NumExpansions) {
3686     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3687                                       EllipsisLoc, RHS, RParenLoc,
3688                                       NumExpansions);
3689   }
3690 
3691   /// Build an empty C++1z fold-expression with the given operator.
3692   ///
3693   /// By default, produces the fallback value for the fold-expression, or
3694   /// produce an error if there is no fallback value.
RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,BinaryOperatorKind Operator)3695   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3696                                      BinaryOperatorKind Operator) {
3697     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3698   }
3699 
3700   /// Build a new atomic operation expression.
3701   ///
3702   /// By default, performs semantic analysis to build the new expression.
3703   /// Subclasses may override this routine to provide different behavior.
RebuildAtomicExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,AtomicExpr::AtomicOp Op,SourceLocation RParenLoc)3704   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3705                                AtomicExpr::AtomicOp Op,
3706                                SourceLocation RParenLoc) {
3707     // Use this for all of the locations, since we don't know the difference
3708     // between the call and the expr at this point.
3709     SourceRange Range{BuiltinLoc, RParenLoc};
3710     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3711                                      Sema::AtomicArgumentOrder::AST);
3712   }
3713 
RebuildRecoveryExpr(SourceLocation BeginLoc,SourceLocation EndLoc,ArrayRef<Expr * > SubExprs,QualType Type)3714   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3715                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3716     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3717   }
3718 
3719 private:
3720   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3721                                      QualType ObjectType,
3722                                      NamedDecl *FirstQualifierInScope,
3723                                      CXXScopeSpec &SS);
3724 
3725   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3726                                              QualType ObjectType,
3727                                              NamedDecl *FirstQualifierInScope,
3728                                              CXXScopeSpec &SS);
3729 
3730   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3731                                             NamedDecl *FirstQualifierInScope,
3732                                             CXXScopeSpec &SS);
3733 
3734   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3735                                       DependentNameTypeLoc TL,
3736                                       bool DeducibleTSTContext);
3737 };
3738 
3739 template <typename Derived>
TransformStmt(Stmt * S,StmtDiscardKind SDK)3740 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3741   if (!S)
3742     return S;
3743 
3744   switch (S->getStmtClass()) {
3745   case Stmt::NoStmtClass: break;
3746 
3747   // Transform individual statement nodes
3748   // Pass SDK into statements that can produce a value
3749 #define STMT(Node, Parent)                                              \
3750   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3751 #define VALUESTMT(Node, Parent)                                         \
3752   case Stmt::Node##Class:                                               \
3753     return getDerived().Transform##Node(cast<Node>(S), SDK);
3754 #define ABSTRACT_STMT(Node)
3755 #define EXPR(Node, Parent)
3756 #include "clang/AST/StmtNodes.inc"
3757 
3758   // Transform expressions by calling TransformExpr.
3759 #define STMT(Node, Parent)
3760 #define ABSTRACT_STMT(Stmt)
3761 #define EXPR(Node, Parent) case Stmt::Node##Class:
3762 #include "clang/AST/StmtNodes.inc"
3763     {
3764       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3765 
3766       if (SDK == SDK_StmtExprResult)
3767         E = getSema().ActOnStmtExprResult(E);
3768       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3769     }
3770   }
3771 
3772   return S;
3773 }
3774 
3775 template<typename Derived>
TransformOMPClause(OMPClause * S)3776 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3777   if (!S)
3778     return S;
3779 
3780   switch (S->getClauseKind()) {
3781   default: break;
3782   // Transform individual clause nodes
3783 #define GEN_CLANG_CLAUSE_CLASS
3784 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3785   case Enum:                                                                   \
3786     return getDerived().Transform##Class(cast<Class>(S));
3787 #include "llvm/Frontend/OpenMP/OMP.inc"
3788   }
3789 
3790   return S;
3791 }
3792 
3793 
3794 template<typename Derived>
TransformExpr(Expr * E)3795 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3796   if (!E)
3797     return E;
3798 
3799   switch (E->getStmtClass()) {
3800     case Stmt::NoStmtClass: break;
3801 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3802 #define ABSTRACT_STMT(Stmt)
3803 #define EXPR(Node, Parent)                                              \
3804     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3805 #include "clang/AST/StmtNodes.inc"
3806   }
3807 
3808   return E;
3809 }
3810 
3811 template<typename Derived>
TransformInitializer(Expr * Init,bool NotCopyInit)3812 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3813                                                         bool NotCopyInit) {
3814   // Initializers are instantiated like expressions, except that various outer
3815   // layers are stripped.
3816   if (!Init)
3817     return Init;
3818 
3819   if (auto *FE = dyn_cast<FullExpr>(Init))
3820     Init = FE->getSubExpr();
3821 
3822   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3823     Init = AIL->getCommonExpr();
3824 
3825   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3826     Init = MTE->getSubExpr();
3827 
3828   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3829     Init = Binder->getSubExpr();
3830 
3831   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3832     Init = ICE->getSubExprAsWritten();
3833 
3834   if (CXXStdInitializerListExpr *ILE =
3835           dyn_cast<CXXStdInitializerListExpr>(Init))
3836     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3837 
3838   // If this is copy-initialization, we only need to reconstruct
3839   // InitListExprs. Other forms of copy-initialization will be a no-op if
3840   // the initializer is already the right type.
3841   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3842   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3843     return getDerived().TransformExpr(Init);
3844 
3845   // Revert value-initialization back to empty parens.
3846   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3847     SourceRange Parens = VIE->getSourceRange();
3848     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3849                                              Parens.getEnd());
3850   }
3851 
3852   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3853   if (isa<ImplicitValueInitExpr>(Init))
3854     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3855                                              SourceLocation());
3856 
3857   // Revert initialization by constructor back to a parenthesized or braced list
3858   // of expressions. Any other form of initializer can just be reused directly.
3859   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3860     return getDerived().TransformExpr(Init);
3861 
3862   // If the initialization implicitly converted an initializer list to a
3863   // std::initializer_list object, unwrap the std::initializer_list too.
3864   if (Construct && Construct->isStdInitListInitialization())
3865     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3866 
3867   // Enter a list-init context if this was list initialization.
3868   EnterExpressionEvaluationContext Context(
3869       getSema(), EnterExpressionEvaluationContext::InitList,
3870       Construct->isListInitialization());
3871 
3872   SmallVector<Expr*, 8> NewArgs;
3873   bool ArgChanged = false;
3874   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3875                                   /*IsCall*/true, NewArgs, &ArgChanged))
3876     return ExprError();
3877 
3878   // If this was list initialization, revert to syntactic list form.
3879   if (Construct->isListInitialization())
3880     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3881                                         Construct->getEndLoc());
3882 
3883   // Build a ParenListExpr to represent anything else.
3884   SourceRange Parens = Construct->getParenOrBraceRange();
3885   if (Parens.isInvalid()) {
3886     // This was a variable declaration's initialization for which no initializer
3887     // was specified.
3888     assert(NewArgs.empty() &&
3889            "no parens or braces but have direct init with arguments?");
3890     return ExprEmpty();
3891   }
3892   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3893                                            Parens.getEnd());
3894 }
3895 
3896 template<typename Derived>
TransformExprs(Expr * const * Inputs,unsigned NumInputs,bool IsCall,SmallVectorImpl<Expr * > & Outputs,bool * ArgChanged)3897 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3898                                             unsigned NumInputs,
3899                                             bool IsCall,
3900                                       SmallVectorImpl<Expr *> &Outputs,
3901                                             bool *ArgChanged) {
3902   for (unsigned I = 0; I != NumInputs; ++I) {
3903     // If requested, drop call arguments that need to be dropped.
3904     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3905       if (ArgChanged)
3906         *ArgChanged = true;
3907 
3908       break;
3909     }
3910 
3911     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3912       Expr *Pattern = Expansion->getPattern();
3913 
3914       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3915       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3916       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3917 
3918       // Determine whether the set of unexpanded parameter packs can and should
3919       // be expanded.
3920       bool Expand = true;
3921       bool RetainExpansion = false;
3922       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3923       Optional<unsigned> NumExpansions = OrigNumExpansions;
3924       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3925                                                Pattern->getSourceRange(),
3926                                                Unexpanded,
3927                                                Expand, RetainExpansion,
3928                                                NumExpansions))
3929         return true;
3930 
3931       if (!Expand) {
3932         // The transform has determined that we should perform a simple
3933         // transformation on the pack expansion, producing another pack
3934         // expansion.
3935         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3936         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3937         if (OutPattern.isInvalid())
3938           return true;
3939 
3940         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3941                                                 Expansion->getEllipsisLoc(),
3942                                                            NumExpansions);
3943         if (Out.isInvalid())
3944           return true;
3945 
3946         if (ArgChanged)
3947           *ArgChanged = true;
3948         Outputs.push_back(Out.get());
3949         continue;
3950       }
3951 
3952       // Record right away that the argument was changed.  This needs
3953       // to happen even if the array expands to nothing.
3954       if (ArgChanged) *ArgChanged = true;
3955 
3956       // The transform has determined that we should perform an elementwise
3957       // expansion of the pattern. Do so.
3958       for (unsigned I = 0; I != *NumExpansions; ++I) {
3959         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3960         ExprResult Out = getDerived().TransformExpr(Pattern);
3961         if (Out.isInvalid())
3962           return true;
3963 
3964         if (Out.get()->containsUnexpandedParameterPack()) {
3965           Out = getDerived().RebuildPackExpansion(
3966               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3967           if (Out.isInvalid())
3968             return true;
3969         }
3970 
3971         Outputs.push_back(Out.get());
3972       }
3973 
3974       // If we're supposed to retain a pack expansion, do so by temporarily
3975       // forgetting the partially-substituted parameter pack.
3976       if (RetainExpansion) {
3977         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3978 
3979         ExprResult Out = getDerived().TransformExpr(Pattern);
3980         if (Out.isInvalid())
3981           return true;
3982 
3983         Out = getDerived().RebuildPackExpansion(
3984             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3985         if (Out.isInvalid())
3986           return true;
3987 
3988         Outputs.push_back(Out.get());
3989       }
3990 
3991       continue;
3992     }
3993 
3994     ExprResult Result =
3995       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3996              : getDerived().TransformExpr(Inputs[I]);
3997     if (Result.isInvalid())
3998       return true;
3999 
4000     if (Result.get() != Inputs[I] && ArgChanged)
4001       *ArgChanged = true;
4002 
4003     Outputs.push_back(Result.get());
4004   }
4005 
4006   return false;
4007 }
4008 
4009 template <typename Derived>
TransformCondition(SourceLocation Loc,VarDecl * Var,Expr * Expr,Sema::ConditionKind Kind)4010 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4011     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4012   if (Var) {
4013     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4014         getDerived().TransformDefinition(Var->getLocation(), Var));
4015 
4016     if (!ConditionVar)
4017       return Sema::ConditionError();
4018 
4019     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4020   }
4021 
4022   if (Expr) {
4023     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4024 
4025     if (CondExpr.isInvalid())
4026       return Sema::ConditionError();
4027 
4028     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4029   }
4030 
4031   return Sema::ConditionResult();
4032 }
4033 
4034 template <typename Derived>
TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,QualType ObjectType,NamedDecl * FirstQualifierInScope)4035 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4036     NestedNameSpecifierLoc NNS, QualType ObjectType,
4037     NamedDecl *FirstQualifierInScope) {
4038   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4039   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4040        Qualifier = Qualifier.getPrefix())
4041     Qualifiers.push_back(Qualifier);
4042 
4043   CXXScopeSpec SS;
4044   while (!Qualifiers.empty()) {
4045     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4046     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4047 
4048     switch (QNNS->getKind()) {
4049     case NestedNameSpecifier::Identifier: {
4050       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4051                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4052                                       ObjectType);
4053       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4054                                               SS, FirstQualifierInScope, false))
4055         return NestedNameSpecifierLoc();
4056       break;
4057     }
4058 
4059     case NestedNameSpecifier::Namespace: {
4060       NamespaceDecl *NS =
4061           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4062               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4063       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4064       break;
4065     }
4066 
4067     case NestedNameSpecifier::NamespaceAlias: {
4068       NamespaceAliasDecl *Alias =
4069           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4070               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4071       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4072                 Q.getLocalEndLoc());
4073       break;
4074     }
4075 
4076     case NestedNameSpecifier::Global:
4077       // There is no meaningful transformation that one could perform on the
4078       // global scope.
4079       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4080       break;
4081 
4082     case NestedNameSpecifier::Super: {
4083       CXXRecordDecl *RD =
4084           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4085               SourceLocation(), QNNS->getAsRecordDecl()));
4086       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4087       break;
4088     }
4089 
4090     case NestedNameSpecifier::TypeSpecWithTemplate:
4091     case NestedNameSpecifier::TypeSpec: {
4092       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4093                                               FirstQualifierInScope, SS);
4094 
4095       if (!TL)
4096         return NestedNameSpecifierLoc();
4097 
4098       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4099           (SemaRef.getLangOpts().CPlusPlus11 &&
4100            TL.getType()->isEnumeralType())) {
4101         assert(!TL.getType().hasLocalQualifiers() &&
4102                "Can't get cv-qualifiers here");
4103         if (TL.getType()->isEnumeralType())
4104           SemaRef.Diag(TL.getBeginLoc(),
4105                        diag::warn_cxx98_compat_enum_nested_name_spec);
4106         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4107                   Q.getLocalEndLoc());
4108         break;
4109       }
4110       // If the nested-name-specifier is an invalid type def, don't emit an
4111       // error because a previous error should have already been emitted.
4112       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4113       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4114         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4115             << TL.getType() << SS.getRange();
4116       }
4117       return NestedNameSpecifierLoc();
4118     }
4119     }
4120 
4121     // The qualifier-in-scope and object type only apply to the leftmost entity.
4122     FirstQualifierInScope = nullptr;
4123     ObjectType = QualType();
4124   }
4125 
4126   // Don't rebuild the nested-name-specifier if we don't have to.
4127   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4128       !getDerived().AlwaysRebuild())
4129     return NNS;
4130 
4131   // If we can re-use the source-location data from the original
4132   // nested-name-specifier, do so.
4133   if (SS.location_size() == NNS.getDataLength() &&
4134       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4135     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4136 
4137   // Allocate new nested-name-specifier location information.
4138   return SS.getWithLocInContext(SemaRef.Context);
4139 }
4140 
4141 template<typename Derived>
4142 DeclarationNameInfo
4143 TreeTransform<Derived>
TransformDeclarationNameInfo(const DeclarationNameInfo & NameInfo)4144 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4145   DeclarationName Name = NameInfo.getName();
4146   if (!Name)
4147     return DeclarationNameInfo();
4148 
4149   switch (Name.getNameKind()) {
4150   case DeclarationName::Identifier:
4151   case DeclarationName::ObjCZeroArgSelector:
4152   case DeclarationName::ObjCOneArgSelector:
4153   case DeclarationName::ObjCMultiArgSelector:
4154   case DeclarationName::CXXOperatorName:
4155   case DeclarationName::CXXLiteralOperatorName:
4156   case DeclarationName::CXXUsingDirective:
4157     return NameInfo;
4158 
4159   case DeclarationName::CXXDeductionGuideName: {
4160     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4161     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4162         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4163     if (!NewTemplate)
4164       return DeclarationNameInfo();
4165 
4166     DeclarationNameInfo NewNameInfo(NameInfo);
4167     NewNameInfo.setName(
4168         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4169     return NewNameInfo;
4170   }
4171 
4172   case DeclarationName::CXXConstructorName:
4173   case DeclarationName::CXXDestructorName:
4174   case DeclarationName::CXXConversionFunctionName: {
4175     TypeSourceInfo *NewTInfo;
4176     CanQualType NewCanTy;
4177     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4178       NewTInfo = getDerived().TransformType(OldTInfo);
4179       if (!NewTInfo)
4180         return DeclarationNameInfo();
4181       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4182     }
4183     else {
4184       NewTInfo = nullptr;
4185       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4186       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4187       if (NewT.isNull())
4188         return DeclarationNameInfo();
4189       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4190     }
4191 
4192     DeclarationName NewName
4193       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4194                                                            NewCanTy);
4195     DeclarationNameInfo NewNameInfo(NameInfo);
4196     NewNameInfo.setName(NewName);
4197     NewNameInfo.setNamedTypeInfo(NewTInfo);
4198     return NewNameInfo;
4199   }
4200   }
4201 
4202   llvm_unreachable("Unknown name kind.");
4203 }
4204 
4205 template<typename Derived>
4206 TemplateName
TransformTemplateName(CXXScopeSpec & SS,TemplateName Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope,bool AllowInjectedClassName)4207 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4208                                               TemplateName Name,
4209                                               SourceLocation NameLoc,
4210                                               QualType ObjectType,
4211                                               NamedDecl *FirstQualifierInScope,
4212                                               bool AllowInjectedClassName) {
4213   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4214     TemplateDecl *Template = QTN->getTemplateDecl();
4215     assert(Template && "qualified template name must refer to a template");
4216 
4217     TemplateDecl *TransTemplate
4218       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4219                                                               Template));
4220     if (!TransTemplate)
4221       return TemplateName();
4222 
4223     if (!getDerived().AlwaysRebuild() &&
4224         SS.getScopeRep() == QTN->getQualifier() &&
4225         TransTemplate == Template)
4226       return Name;
4227 
4228     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4229                                             TransTemplate);
4230   }
4231 
4232   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4233     if (SS.getScopeRep()) {
4234       // These apply to the scope specifier, not the template.
4235       ObjectType = QualType();
4236       FirstQualifierInScope = nullptr;
4237     }
4238 
4239     if (!getDerived().AlwaysRebuild() &&
4240         SS.getScopeRep() == DTN->getQualifier() &&
4241         ObjectType.isNull())
4242       return Name;
4243 
4244     // FIXME: Preserve the location of the "template" keyword.
4245     SourceLocation TemplateKWLoc = NameLoc;
4246 
4247     if (DTN->isIdentifier()) {
4248       return getDerived().RebuildTemplateName(SS,
4249                                               TemplateKWLoc,
4250                                               *DTN->getIdentifier(),
4251                                               NameLoc,
4252                                               ObjectType,
4253                                               FirstQualifierInScope,
4254                                               AllowInjectedClassName);
4255     }
4256 
4257     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4258                                             DTN->getOperator(), NameLoc,
4259                                             ObjectType, AllowInjectedClassName);
4260   }
4261 
4262   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4263     TemplateDecl *TransTemplate
4264       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4265                                                               Template));
4266     if (!TransTemplate)
4267       return TemplateName();
4268 
4269     if (!getDerived().AlwaysRebuild() &&
4270         TransTemplate == Template)
4271       return Name;
4272 
4273     return TemplateName(TransTemplate);
4274   }
4275 
4276   if (SubstTemplateTemplateParmPackStorage *SubstPack
4277       = Name.getAsSubstTemplateTemplateParmPack()) {
4278     TemplateTemplateParmDecl *TransParam
4279     = cast_or_null<TemplateTemplateParmDecl>(
4280             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4281     if (!TransParam)
4282       return TemplateName();
4283 
4284     if (!getDerived().AlwaysRebuild() &&
4285         TransParam == SubstPack->getParameterPack())
4286       return Name;
4287 
4288     return getDerived().RebuildTemplateName(TransParam,
4289                                             SubstPack->getArgumentPack());
4290   }
4291 
4292   // These should be getting filtered out before they reach the AST.
4293   llvm_unreachable("overloaded function decl survived to here");
4294 }
4295 
4296 template<typename Derived>
InventTemplateArgumentLoc(const TemplateArgument & Arg,TemplateArgumentLoc & Output)4297 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4298                                          const TemplateArgument &Arg,
4299                                          TemplateArgumentLoc &Output) {
4300   Output = getSema().getTrivialTemplateArgumentLoc(
4301       Arg, QualType(), getDerived().getBaseLocation());
4302 }
4303 
4304 template<typename Derived>
TransformTemplateArgument(const TemplateArgumentLoc & Input,TemplateArgumentLoc & Output,bool Uneval)4305 bool TreeTransform<Derived>::TransformTemplateArgument(
4306                                          const TemplateArgumentLoc &Input,
4307                                          TemplateArgumentLoc &Output, bool Uneval) {
4308   const TemplateArgument &Arg = Input.getArgument();
4309   switch (Arg.getKind()) {
4310   case TemplateArgument::Null:
4311   case TemplateArgument::Pack:
4312     llvm_unreachable("Unexpected TemplateArgument");
4313 
4314   case TemplateArgument::Integral:
4315   case TemplateArgument::NullPtr:
4316   case TemplateArgument::Declaration: {
4317     // Transform a resolved template argument straight to a resolved template
4318     // argument. We get here when substituting into an already-substituted
4319     // template type argument during concept satisfaction checking.
4320     QualType T = Arg.getNonTypeTemplateArgumentType();
4321     QualType NewT = getDerived().TransformType(T);
4322     if (NewT.isNull())
4323       return true;
4324 
4325     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4326                        ? Arg.getAsDecl()
4327                        : nullptr;
4328     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4329                               getDerived().getBaseLocation(), D))
4330                         : nullptr;
4331     if (D && !NewD)
4332       return true;
4333 
4334     if (NewT == T && D == NewD)
4335       Output = Input;
4336     else if (Arg.getKind() == TemplateArgument::Integral)
4337       Output = TemplateArgumentLoc(
4338           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4339           TemplateArgumentLocInfo());
4340     else if (Arg.getKind() == TemplateArgument::NullPtr)
4341       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4342                                    TemplateArgumentLocInfo());
4343     else
4344       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4345                                    TemplateArgumentLocInfo());
4346 
4347     return false;
4348   }
4349 
4350   case TemplateArgument::Type: {
4351     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4352     if (!DI)
4353       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4354 
4355     DI = getDerived().TransformType(DI);
4356     if (!DI) return true;
4357 
4358     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4359     return false;
4360   }
4361 
4362   case TemplateArgument::Template: {
4363     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4364     if (QualifierLoc) {
4365       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4366       if (!QualifierLoc)
4367         return true;
4368     }
4369 
4370     CXXScopeSpec SS;
4371     SS.Adopt(QualifierLoc);
4372     TemplateName Template
4373       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4374                                            Input.getTemplateNameLoc());
4375     if (Template.isNull())
4376       return true;
4377 
4378     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4379                                  QualifierLoc, Input.getTemplateNameLoc());
4380     return false;
4381   }
4382 
4383   case TemplateArgument::TemplateExpansion:
4384     llvm_unreachable("Caller should expand pack expansions");
4385 
4386   case TemplateArgument::Expression: {
4387     // Template argument expressions are constant expressions.
4388     EnterExpressionEvaluationContext Unevaluated(
4389         getSema(),
4390         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4391                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4392         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4393         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4394 
4395     Expr *InputExpr = Input.getSourceExpression();
4396     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4397 
4398     ExprResult E = getDerived().TransformExpr(InputExpr);
4399     E = SemaRef.ActOnConstantExpression(E);
4400     if (E.isInvalid()) return true;
4401     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4402     return false;
4403   }
4404   }
4405 
4406   // Work around bogus GCC warning
4407   return true;
4408 }
4409 
4410 /// Iterator adaptor that invents template argument location information
4411 /// for each of the template arguments in its underlying iterator.
4412 template<typename Derived, typename InputIterator>
4413 class TemplateArgumentLocInventIterator {
4414   TreeTransform<Derived> &Self;
4415   InputIterator Iter;
4416 
4417 public:
4418   typedef TemplateArgumentLoc value_type;
4419   typedef TemplateArgumentLoc reference;
4420   typedef typename std::iterator_traits<InputIterator>::difference_type
4421     difference_type;
4422   typedef std::input_iterator_tag iterator_category;
4423 
4424   class pointer {
4425     TemplateArgumentLoc Arg;
4426 
4427   public:
pointer(TemplateArgumentLoc Arg)4428     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4429 
4430     const TemplateArgumentLoc *operator->() const { return &Arg; }
4431   };
4432 
TemplateArgumentLocInventIterator()4433   TemplateArgumentLocInventIterator() { }
4434 
TemplateArgumentLocInventIterator(TreeTransform<Derived> & Self,InputIterator Iter)4435   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4436                                              InputIterator Iter)
4437     : Self(Self), Iter(Iter) { }
4438 
4439   TemplateArgumentLocInventIterator &operator++() {
4440     ++Iter;
4441     return *this;
4442   }
4443 
4444   TemplateArgumentLocInventIterator operator++(int) {
4445     TemplateArgumentLocInventIterator Old(*this);
4446     ++(*this);
4447     return Old;
4448   }
4449 
4450   reference operator*() const {
4451     TemplateArgumentLoc Result;
4452     Self.InventTemplateArgumentLoc(*Iter, Result);
4453     return Result;
4454   }
4455 
4456   pointer operator->() const { return pointer(**this); }
4457 
4458   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4459                          const TemplateArgumentLocInventIterator &Y) {
4460     return X.Iter == Y.Iter;
4461   }
4462 
4463   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4464                          const TemplateArgumentLocInventIterator &Y) {
4465     return X.Iter != Y.Iter;
4466   }
4467 };
4468 
4469 template<typename Derived>
4470 template<typename InputIterator>
TransformTemplateArguments(InputIterator First,InputIterator Last,TemplateArgumentListInfo & Outputs,bool Uneval)4471 bool TreeTransform<Derived>::TransformTemplateArguments(
4472     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4473     bool Uneval) {
4474   for (; First != Last; ++First) {
4475     TemplateArgumentLoc Out;
4476     TemplateArgumentLoc In = *First;
4477 
4478     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4479       // Unpack argument packs, which we translate them into separate
4480       // arguments.
4481       // FIXME: We could do much better if we could guarantee that the
4482       // TemplateArgumentLocInfo for the pack expansion would be usable for
4483       // all of the template arguments in the argument pack.
4484       typedef TemplateArgumentLocInventIterator<Derived,
4485                                                 TemplateArgument::pack_iterator>
4486         PackLocIterator;
4487       if (TransformTemplateArguments(PackLocIterator(*this,
4488                                                  In.getArgument().pack_begin()),
4489                                      PackLocIterator(*this,
4490                                                    In.getArgument().pack_end()),
4491                                      Outputs, Uneval))
4492         return true;
4493 
4494       continue;
4495     }
4496 
4497     if (In.getArgument().isPackExpansion()) {
4498       // We have a pack expansion, for which we will be substituting into
4499       // the pattern.
4500       SourceLocation Ellipsis;
4501       Optional<unsigned> OrigNumExpansions;
4502       TemplateArgumentLoc Pattern
4503         = getSema().getTemplateArgumentPackExpansionPattern(
4504               In, Ellipsis, OrigNumExpansions);
4505 
4506       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4507       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4508       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4509 
4510       // Determine whether the set of unexpanded parameter packs can and should
4511       // be expanded.
4512       bool Expand = true;
4513       bool RetainExpansion = false;
4514       Optional<unsigned> NumExpansions = OrigNumExpansions;
4515       if (getDerived().TryExpandParameterPacks(Ellipsis,
4516                                                Pattern.getSourceRange(),
4517                                                Unexpanded,
4518                                                Expand,
4519                                                RetainExpansion,
4520                                                NumExpansions))
4521         return true;
4522 
4523       if (!Expand) {
4524         // The transform has determined that we should perform a simple
4525         // transformation on the pack expansion, producing another pack
4526         // expansion.
4527         TemplateArgumentLoc OutPattern;
4528         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4529         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4530           return true;
4531 
4532         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4533                                                 NumExpansions);
4534         if (Out.getArgument().isNull())
4535           return true;
4536 
4537         Outputs.addArgument(Out);
4538         continue;
4539       }
4540 
4541       // The transform has determined that we should perform an elementwise
4542       // expansion of the pattern. Do so.
4543       for (unsigned I = 0; I != *NumExpansions; ++I) {
4544         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4545 
4546         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4547           return true;
4548 
4549         if (Out.getArgument().containsUnexpandedParameterPack()) {
4550           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4551                                                   OrigNumExpansions);
4552           if (Out.getArgument().isNull())
4553             return true;
4554         }
4555 
4556         Outputs.addArgument(Out);
4557       }
4558 
4559       // If we're supposed to retain a pack expansion, do so by temporarily
4560       // forgetting the partially-substituted parameter pack.
4561       if (RetainExpansion) {
4562         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4563 
4564         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4565           return true;
4566 
4567         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4568                                                 OrigNumExpansions);
4569         if (Out.getArgument().isNull())
4570           return true;
4571 
4572         Outputs.addArgument(Out);
4573       }
4574 
4575       continue;
4576     }
4577 
4578     // The simple case:
4579     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4580       return true;
4581 
4582     Outputs.addArgument(Out);
4583   }
4584 
4585   return false;
4586 
4587 }
4588 
4589 //===----------------------------------------------------------------------===//
4590 // Type transformation
4591 //===----------------------------------------------------------------------===//
4592 
4593 template<typename Derived>
TransformType(QualType T)4594 QualType TreeTransform<Derived>::TransformType(QualType T) {
4595   if (getDerived().AlreadyTransformed(T))
4596     return T;
4597 
4598   // Temporary workaround.  All of these transformations should
4599   // eventually turn into transformations on TypeLocs.
4600   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4601                                                 getDerived().getBaseLocation());
4602 
4603   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4604 
4605   if (!NewDI)
4606     return QualType();
4607 
4608   return NewDI->getType();
4609 }
4610 
4611 template<typename Derived>
TransformType(TypeSourceInfo * DI)4612 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4613   // Refine the base location to the type's location.
4614   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4615                        getDerived().getBaseEntity());
4616   if (getDerived().AlreadyTransformed(DI->getType()))
4617     return DI;
4618 
4619   TypeLocBuilder TLB;
4620 
4621   TypeLoc TL = DI->getTypeLoc();
4622   TLB.reserve(TL.getFullDataSize());
4623 
4624   QualType Result = getDerived().TransformType(TLB, TL);
4625   if (Result.isNull())
4626     return nullptr;
4627 
4628   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4629 }
4630 
4631 template<typename Derived>
4632 QualType
TransformType(TypeLocBuilder & TLB,TypeLoc T)4633 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4634   switch (T.getTypeLocClass()) {
4635 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4636 #define TYPELOC(CLASS, PARENT)                                                 \
4637   case TypeLoc::CLASS:                                                         \
4638     return getDerived().Transform##CLASS##Type(TLB,                            \
4639                                                T.castAs<CLASS##TypeLoc>());
4640 #include "clang/AST/TypeLocNodes.def"
4641   }
4642 
4643   llvm_unreachable("unhandled type loc!");
4644 }
4645 
4646 template<typename Derived>
TransformTypeWithDeducedTST(QualType T)4647 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4648   if (!isa<DependentNameType>(T))
4649     return TransformType(T);
4650 
4651   if (getDerived().AlreadyTransformed(T))
4652     return T;
4653   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4654                                                 getDerived().getBaseLocation());
4655   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4656   return NewDI ? NewDI->getType() : QualType();
4657 }
4658 
4659 template<typename Derived>
4660 TypeSourceInfo *
TransformTypeWithDeducedTST(TypeSourceInfo * DI)4661 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4662   if (!isa<DependentNameType>(DI->getType()))
4663     return TransformType(DI);
4664 
4665   // Refine the base location to the type's location.
4666   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4667                        getDerived().getBaseEntity());
4668   if (getDerived().AlreadyTransformed(DI->getType()))
4669     return DI;
4670 
4671   TypeLocBuilder TLB;
4672 
4673   TypeLoc TL = DI->getTypeLoc();
4674   TLB.reserve(TL.getFullDataSize());
4675 
4676   auto QTL = TL.getAs<QualifiedTypeLoc>();
4677   if (QTL)
4678     TL = QTL.getUnqualifiedLoc();
4679 
4680   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4681 
4682   QualType Result = getDerived().TransformDependentNameType(
4683       TLB, DNTL, /*DeducedTSTContext*/true);
4684   if (Result.isNull())
4685     return nullptr;
4686 
4687   if (QTL) {
4688     Result = getDerived().RebuildQualifiedType(Result, QTL);
4689     if (Result.isNull())
4690       return nullptr;
4691     TLB.TypeWasModifiedSafely(Result);
4692   }
4693 
4694   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4695 }
4696 
4697 template<typename Derived>
4698 QualType
TransformQualifiedType(TypeLocBuilder & TLB,QualifiedTypeLoc T)4699 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4700                                                QualifiedTypeLoc T) {
4701   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4702   if (Result.isNull())
4703     return QualType();
4704 
4705   Result = getDerived().RebuildQualifiedType(Result, T);
4706 
4707   if (Result.isNull())
4708     return QualType();
4709 
4710   // RebuildQualifiedType might have updated the type, but not in a way
4711   // that invalidates the TypeLoc. (There's no location information for
4712   // qualifiers.)
4713   TLB.TypeWasModifiedSafely(Result);
4714 
4715   return Result;
4716 }
4717 
4718 template <typename Derived>
RebuildQualifiedType(QualType T,QualifiedTypeLoc TL)4719 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4720                                                       QualifiedTypeLoc TL) {
4721 
4722   SourceLocation Loc = TL.getBeginLoc();
4723   Qualifiers Quals = TL.getType().getLocalQualifiers();
4724 
4725   if (((T.getAddressSpace() != LangAS::Default &&
4726         Quals.getAddressSpace() != LangAS::Default)) &&
4727       T.getAddressSpace() != Quals.getAddressSpace()) {
4728     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4729         << TL.getType() << T;
4730     return QualType();
4731   }
4732 
4733   // C++ [dcl.fct]p7:
4734   //   [When] adding cv-qualifications on top of the function type [...] the
4735   //   cv-qualifiers are ignored.
4736   if (T->isFunctionType()) {
4737     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4738                                                      Quals.getAddressSpace());
4739     return T;
4740   }
4741 
4742   // C++ [dcl.ref]p1:
4743   //   when the cv-qualifiers are introduced through the use of a typedef-name
4744   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4745   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4746   // applied to a reference type.
4747   if (T->isReferenceType()) {
4748     // The only qualifier that applies to a reference type is restrict.
4749     if (!Quals.hasRestrict())
4750       return T;
4751     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4752   }
4753 
4754   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4755   // resulting type.
4756   if (Quals.hasObjCLifetime()) {
4757     if (!T->isObjCLifetimeType() && !T->isDependentType())
4758       Quals.removeObjCLifetime();
4759     else if (T.getObjCLifetime()) {
4760       // Objective-C ARC:
4761       //   A lifetime qualifier applied to a substituted template parameter
4762       //   overrides the lifetime qualifier from the template argument.
4763       const AutoType *AutoTy;
4764       if (const SubstTemplateTypeParmType *SubstTypeParam
4765                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4766         QualType Replacement = SubstTypeParam->getReplacementType();
4767         Qualifiers Qs = Replacement.getQualifiers();
4768         Qs.removeObjCLifetime();
4769         Replacement = SemaRef.Context.getQualifiedType(
4770             Replacement.getUnqualifiedType(), Qs);
4771         T = SemaRef.Context.getSubstTemplateTypeParmType(
4772             SubstTypeParam->getReplacedParameter(), Replacement);
4773       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4774         // 'auto' types behave the same way as template parameters.
4775         QualType Deduced = AutoTy->getDeducedType();
4776         Qualifiers Qs = Deduced.getQualifiers();
4777         Qs.removeObjCLifetime();
4778         Deduced =
4779             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4780         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4781                                         AutoTy->isDependentType(),
4782                                         /*isPack=*/false,
4783                                         AutoTy->getTypeConstraintConcept(),
4784                                         AutoTy->getTypeConstraintArguments());
4785       } else {
4786         // Otherwise, complain about the addition of a qualifier to an
4787         // already-qualified type.
4788         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4789         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4790         Quals.removeObjCLifetime();
4791       }
4792     }
4793   }
4794 
4795   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4796 }
4797 
4798 template<typename Derived>
4799 TypeLoc
TransformTypeInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4800 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4801                                                    QualType ObjectType,
4802                                                    NamedDecl *UnqualLookup,
4803                                                    CXXScopeSpec &SS) {
4804   if (getDerived().AlreadyTransformed(TL.getType()))
4805     return TL;
4806 
4807   TypeSourceInfo *TSI =
4808       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4809   if (TSI)
4810     return TSI->getTypeLoc();
4811   return TypeLoc();
4812 }
4813 
4814 template<typename Derived>
4815 TypeSourceInfo *
TransformTypeInObjectScope(TypeSourceInfo * TSInfo,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4816 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4817                                                    QualType ObjectType,
4818                                                    NamedDecl *UnqualLookup,
4819                                                    CXXScopeSpec &SS) {
4820   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4821     return TSInfo;
4822 
4823   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4824                                    UnqualLookup, SS);
4825 }
4826 
4827 template <typename Derived>
TransformTSIInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4828 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4829     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4830     CXXScopeSpec &SS) {
4831   QualType T = TL.getType();
4832   assert(!getDerived().AlreadyTransformed(T));
4833 
4834   TypeLocBuilder TLB;
4835   QualType Result;
4836 
4837   if (isa<TemplateSpecializationType>(T)) {
4838     TemplateSpecializationTypeLoc SpecTL =
4839         TL.castAs<TemplateSpecializationTypeLoc>();
4840 
4841     TemplateName Template = getDerived().TransformTemplateName(
4842         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4843         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4844     if (Template.isNull())
4845       return nullptr;
4846 
4847     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4848                                                               Template);
4849   } else if (isa<DependentTemplateSpecializationType>(T)) {
4850     DependentTemplateSpecializationTypeLoc SpecTL =
4851         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4852 
4853     TemplateName Template
4854       = getDerived().RebuildTemplateName(SS,
4855                                          SpecTL.getTemplateKeywordLoc(),
4856                                          *SpecTL.getTypePtr()->getIdentifier(),
4857                                          SpecTL.getTemplateNameLoc(),
4858                                          ObjectType, UnqualLookup,
4859                                          /*AllowInjectedClassName*/true);
4860     if (Template.isNull())
4861       return nullptr;
4862 
4863     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4864                                                                        SpecTL,
4865                                                                        Template,
4866                                                                        SS);
4867   } else {
4868     // Nothing special needs to be done for these.
4869     Result = getDerived().TransformType(TLB, TL);
4870   }
4871 
4872   if (Result.isNull())
4873     return nullptr;
4874 
4875   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4876 }
4877 
4878 template <class TyLoc> static inline
TransformTypeSpecType(TypeLocBuilder & TLB,TyLoc T)4879 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4880   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4881   NewT.setNameLoc(T.getNameLoc());
4882   return T.getType();
4883 }
4884 
4885 template<typename Derived>
TransformBuiltinType(TypeLocBuilder & TLB,BuiltinTypeLoc T)4886 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4887                                                       BuiltinTypeLoc T) {
4888   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4889   NewT.setBuiltinLoc(T.getBuiltinLoc());
4890   if (T.needsExtraLocalData())
4891     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4892   return T.getType();
4893 }
4894 
4895 template<typename Derived>
TransformComplexType(TypeLocBuilder & TLB,ComplexTypeLoc T)4896 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4897                                                       ComplexTypeLoc T) {
4898   // FIXME: recurse?
4899   return TransformTypeSpecType(TLB, T);
4900 }
4901 
4902 template <typename Derived>
TransformAdjustedType(TypeLocBuilder & TLB,AdjustedTypeLoc TL)4903 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4904                                                        AdjustedTypeLoc TL) {
4905   // Adjustments applied during transformation are handled elsewhere.
4906   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4907 }
4908 
4909 template<typename Derived>
TransformDecayedType(TypeLocBuilder & TLB,DecayedTypeLoc TL)4910 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4911                                                       DecayedTypeLoc TL) {
4912   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4913   if (OriginalType.isNull())
4914     return QualType();
4915 
4916   QualType Result = TL.getType();
4917   if (getDerived().AlwaysRebuild() ||
4918       OriginalType != TL.getOriginalLoc().getType())
4919     Result = SemaRef.Context.getDecayedType(OriginalType);
4920   TLB.push<DecayedTypeLoc>(Result);
4921   // Nothing to set for DecayedTypeLoc.
4922   return Result;
4923 }
4924 
4925 template<typename Derived>
TransformPointerType(TypeLocBuilder & TLB,PointerTypeLoc TL)4926 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4927                                                       PointerTypeLoc TL) {
4928   QualType PointeeType
4929     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4930   if (PointeeType.isNull())
4931     return QualType();
4932 
4933   QualType Result = TL.getType();
4934   if (PointeeType->getAs<ObjCObjectType>()) {
4935     // A dependent pointer type 'T *' has is being transformed such
4936     // that an Objective-C class type is being replaced for 'T'. The
4937     // resulting pointer type is an ObjCObjectPointerType, not a
4938     // PointerType.
4939     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4940 
4941     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4942     NewT.setStarLoc(TL.getStarLoc());
4943     return Result;
4944   }
4945 
4946   if (getDerived().AlwaysRebuild() ||
4947       PointeeType != TL.getPointeeLoc().getType()) {
4948     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4949     if (Result.isNull())
4950       return QualType();
4951   }
4952 
4953   // Objective-C ARC can add lifetime qualifiers to the type that we're
4954   // pointing to.
4955   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4956 
4957   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4958   NewT.setSigilLoc(TL.getSigilLoc());
4959   return Result;
4960 }
4961 
4962 template<typename Derived>
4963 QualType
TransformBlockPointerType(TypeLocBuilder & TLB,BlockPointerTypeLoc TL)4964 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4965                                                   BlockPointerTypeLoc TL) {
4966   QualType PointeeType
4967     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4968   if (PointeeType.isNull())
4969     return QualType();
4970 
4971   QualType Result = TL.getType();
4972   if (getDerived().AlwaysRebuild() ||
4973       PointeeType != TL.getPointeeLoc().getType()) {
4974     Result = getDerived().RebuildBlockPointerType(PointeeType,
4975                                                   TL.getSigilLoc());
4976     if (Result.isNull())
4977       return QualType();
4978   }
4979 
4980   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4981   NewT.setSigilLoc(TL.getSigilLoc());
4982   return Result;
4983 }
4984 
4985 /// Transforms a reference type.  Note that somewhat paradoxically we
4986 /// don't care whether the type itself is an l-value type or an r-value
4987 /// type;  we only care if the type was *written* as an l-value type
4988 /// or an r-value type.
4989 template<typename Derived>
4990 QualType
TransformReferenceType(TypeLocBuilder & TLB,ReferenceTypeLoc TL)4991 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4992                                                ReferenceTypeLoc TL) {
4993   const ReferenceType *T = TL.getTypePtr();
4994 
4995   // Note that this works with the pointee-as-written.
4996   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4997   if (PointeeType.isNull())
4998     return QualType();
4999 
5000   QualType Result = TL.getType();
5001   if (getDerived().AlwaysRebuild() ||
5002       PointeeType != T->getPointeeTypeAsWritten()) {
5003     Result = getDerived().RebuildReferenceType(PointeeType,
5004                                                T->isSpelledAsLValue(),
5005                                                TL.getSigilLoc());
5006     if (Result.isNull())
5007       return QualType();
5008   }
5009 
5010   // Objective-C ARC can add lifetime qualifiers to the type that we're
5011   // referring to.
5012   TLB.TypeWasModifiedSafely(
5013       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5014 
5015   // r-value references can be rebuilt as l-value references.
5016   ReferenceTypeLoc NewTL;
5017   if (isa<LValueReferenceType>(Result))
5018     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5019   else
5020     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5021   NewTL.setSigilLoc(TL.getSigilLoc());
5022 
5023   return Result;
5024 }
5025 
5026 template<typename Derived>
5027 QualType
TransformLValueReferenceType(TypeLocBuilder & TLB,LValueReferenceTypeLoc TL)5028 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5029                                                  LValueReferenceTypeLoc TL) {
5030   return TransformReferenceType(TLB, TL);
5031 }
5032 
5033 template<typename Derived>
5034 QualType
TransformRValueReferenceType(TypeLocBuilder & TLB,RValueReferenceTypeLoc TL)5035 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5036                                                  RValueReferenceTypeLoc TL) {
5037   return TransformReferenceType(TLB, TL);
5038 }
5039 
5040 template<typename Derived>
5041 QualType
TransformMemberPointerType(TypeLocBuilder & TLB,MemberPointerTypeLoc TL)5042 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5043                                                    MemberPointerTypeLoc TL) {
5044   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5045   if (PointeeType.isNull())
5046     return QualType();
5047 
5048   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5049   TypeSourceInfo *NewClsTInfo = nullptr;
5050   if (OldClsTInfo) {
5051     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5052     if (!NewClsTInfo)
5053       return QualType();
5054   }
5055 
5056   const MemberPointerType *T = TL.getTypePtr();
5057   QualType OldClsType = QualType(T->getClass(), 0);
5058   QualType NewClsType;
5059   if (NewClsTInfo)
5060     NewClsType = NewClsTInfo->getType();
5061   else {
5062     NewClsType = getDerived().TransformType(OldClsType);
5063     if (NewClsType.isNull())
5064       return QualType();
5065   }
5066 
5067   QualType Result = TL.getType();
5068   if (getDerived().AlwaysRebuild() ||
5069       PointeeType != T->getPointeeType() ||
5070       NewClsType != OldClsType) {
5071     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5072                                                    TL.getStarLoc());
5073     if (Result.isNull())
5074       return QualType();
5075   }
5076 
5077   // If we had to adjust the pointee type when building a member pointer, make
5078   // sure to push TypeLoc info for it.
5079   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5080   if (MPT && PointeeType != MPT->getPointeeType()) {
5081     assert(isa<AdjustedType>(MPT->getPointeeType()));
5082     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5083   }
5084 
5085   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5086   NewTL.setSigilLoc(TL.getSigilLoc());
5087   NewTL.setClassTInfo(NewClsTInfo);
5088 
5089   return Result;
5090 }
5091 
5092 template<typename Derived>
5093 QualType
TransformConstantArrayType(TypeLocBuilder & TLB,ConstantArrayTypeLoc TL)5094 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5095                                                    ConstantArrayTypeLoc TL) {
5096   const ConstantArrayType *T = TL.getTypePtr();
5097   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5098   if (ElementType.isNull())
5099     return QualType();
5100 
5101   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5102   Expr *OldSize = TL.getSizeExpr();
5103   if (!OldSize)
5104     OldSize = const_cast<Expr*>(T->getSizeExpr());
5105   Expr *NewSize = nullptr;
5106   if (OldSize) {
5107     EnterExpressionEvaluationContext Unevaluated(
5108         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5109     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5110     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5111   }
5112 
5113   QualType Result = TL.getType();
5114   if (getDerived().AlwaysRebuild() ||
5115       ElementType != T->getElementType() ||
5116       (T->getSizeExpr() && NewSize != OldSize)) {
5117     Result = getDerived().RebuildConstantArrayType(ElementType,
5118                                                    T->getSizeModifier(),
5119                                                    T->getSize(), NewSize,
5120                                              T->getIndexTypeCVRQualifiers(),
5121                                                    TL.getBracketsRange());
5122     if (Result.isNull())
5123       return QualType();
5124   }
5125 
5126   // We might have either a ConstantArrayType or a VariableArrayType now:
5127   // a ConstantArrayType is allowed to have an element type which is a
5128   // VariableArrayType if the type is dependent.  Fortunately, all array
5129   // types have the same location layout.
5130   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5131   NewTL.setLBracketLoc(TL.getLBracketLoc());
5132   NewTL.setRBracketLoc(TL.getRBracketLoc());
5133   NewTL.setSizeExpr(NewSize);
5134 
5135   return Result;
5136 }
5137 
5138 template<typename Derived>
TransformIncompleteArrayType(TypeLocBuilder & TLB,IncompleteArrayTypeLoc TL)5139 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5140                                               TypeLocBuilder &TLB,
5141                                               IncompleteArrayTypeLoc TL) {
5142   const IncompleteArrayType *T = TL.getTypePtr();
5143   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5144   if (ElementType.isNull())
5145     return QualType();
5146 
5147   QualType Result = TL.getType();
5148   if (getDerived().AlwaysRebuild() ||
5149       ElementType != T->getElementType()) {
5150     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5151                                                      T->getSizeModifier(),
5152                                            T->getIndexTypeCVRQualifiers(),
5153                                                      TL.getBracketsRange());
5154     if (Result.isNull())
5155       return QualType();
5156   }
5157 
5158   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5159   NewTL.setLBracketLoc(TL.getLBracketLoc());
5160   NewTL.setRBracketLoc(TL.getRBracketLoc());
5161   NewTL.setSizeExpr(nullptr);
5162 
5163   return Result;
5164 }
5165 
5166 template<typename Derived>
5167 QualType
TransformVariableArrayType(TypeLocBuilder & TLB,VariableArrayTypeLoc TL)5168 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5169                                                    VariableArrayTypeLoc TL) {
5170   const VariableArrayType *T = TL.getTypePtr();
5171   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5172   if (ElementType.isNull())
5173     return QualType();
5174 
5175   ExprResult SizeResult;
5176   {
5177     EnterExpressionEvaluationContext Context(
5178         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5179     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5180   }
5181   if (SizeResult.isInvalid())
5182     return QualType();
5183   SizeResult =
5184       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5185   if (SizeResult.isInvalid())
5186     return QualType();
5187 
5188   Expr *Size = SizeResult.get();
5189 
5190   QualType Result = TL.getType();
5191   if (getDerived().AlwaysRebuild() ||
5192       ElementType != T->getElementType() ||
5193       Size != T->getSizeExpr()) {
5194     Result = getDerived().RebuildVariableArrayType(ElementType,
5195                                                    T->getSizeModifier(),
5196                                                    Size,
5197                                              T->getIndexTypeCVRQualifiers(),
5198                                                    TL.getBracketsRange());
5199     if (Result.isNull())
5200       return QualType();
5201   }
5202 
5203   // We might have constant size array now, but fortunately it has the same
5204   // location layout.
5205   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5206   NewTL.setLBracketLoc(TL.getLBracketLoc());
5207   NewTL.setRBracketLoc(TL.getRBracketLoc());
5208   NewTL.setSizeExpr(Size);
5209 
5210   return Result;
5211 }
5212 
5213 template<typename Derived>
5214 QualType
TransformDependentSizedArrayType(TypeLocBuilder & TLB,DependentSizedArrayTypeLoc TL)5215 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5216                                              DependentSizedArrayTypeLoc TL) {
5217   const DependentSizedArrayType *T = TL.getTypePtr();
5218   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5219   if (ElementType.isNull())
5220     return QualType();
5221 
5222   // Array bounds are constant expressions.
5223   EnterExpressionEvaluationContext Unevaluated(
5224       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5225 
5226   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5227   Expr *origSize = TL.getSizeExpr();
5228   if (!origSize) origSize = T->getSizeExpr();
5229 
5230   ExprResult sizeResult
5231     = getDerived().TransformExpr(origSize);
5232   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5233   if (sizeResult.isInvalid())
5234     return QualType();
5235 
5236   Expr *size = sizeResult.get();
5237 
5238   QualType Result = TL.getType();
5239   if (getDerived().AlwaysRebuild() ||
5240       ElementType != T->getElementType() ||
5241       size != origSize) {
5242     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5243                                                          T->getSizeModifier(),
5244                                                          size,
5245                                                 T->getIndexTypeCVRQualifiers(),
5246                                                         TL.getBracketsRange());
5247     if (Result.isNull())
5248       return QualType();
5249   }
5250 
5251   // We might have any sort of array type now, but fortunately they
5252   // all have the same location layout.
5253   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5254   NewTL.setLBracketLoc(TL.getLBracketLoc());
5255   NewTL.setRBracketLoc(TL.getRBracketLoc());
5256   NewTL.setSizeExpr(size);
5257 
5258   return Result;
5259 }
5260 
5261 template <typename Derived>
TransformDependentVectorType(TypeLocBuilder & TLB,DependentVectorTypeLoc TL)5262 QualType TreeTransform<Derived>::TransformDependentVectorType(
5263     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5264   const DependentVectorType *T = TL.getTypePtr();
5265   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5266   if (ElementType.isNull())
5267     return QualType();
5268 
5269   EnterExpressionEvaluationContext Unevaluated(
5270       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5271 
5272   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5273   Size = SemaRef.ActOnConstantExpression(Size);
5274   if (Size.isInvalid())
5275     return QualType();
5276 
5277   QualType Result = TL.getType();
5278   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5279       Size.get() != T->getSizeExpr()) {
5280     Result = getDerived().RebuildDependentVectorType(
5281         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5282     if (Result.isNull())
5283       return QualType();
5284   }
5285 
5286   // Result might be dependent or not.
5287   if (isa<DependentVectorType>(Result)) {
5288     DependentVectorTypeLoc NewTL =
5289         TLB.push<DependentVectorTypeLoc>(Result);
5290     NewTL.setNameLoc(TL.getNameLoc());
5291   } else {
5292     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5293     NewTL.setNameLoc(TL.getNameLoc());
5294   }
5295 
5296   return Result;
5297 }
5298 
5299 template<typename Derived>
TransformDependentSizedExtVectorType(TypeLocBuilder & TLB,DependentSizedExtVectorTypeLoc TL)5300 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5301                                       TypeLocBuilder &TLB,
5302                                       DependentSizedExtVectorTypeLoc TL) {
5303   const DependentSizedExtVectorType *T = TL.getTypePtr();
5304 
5305   // FIXME: ext vector locs should be nested
5306   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5307   if (ElementType.isNull())
5308     return QualType();
5309 
5310   // Vector sizes are constant expressions.
5311   EnterExpressionEvaluationContext Unevaluated(
5312       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5313 
5314   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5315   Size = SemaRef.ActOnConstantExpression(Size);
5316   if (Size.isInvalid())
5317     return QualType();
5318 
5319   QualType Result = TL.getType();
5320   if (getDerived().AlwaysRebuild() ||
5321       ElementType != T->getElementType() ||
5322       Size.get() != T->getSizeExpr()) {
5323     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5324                                                              Size.get(),
5325                                                          T->getAttributeLoc());
5326     if (Result.isNull())
5327       return QualType();
5328   }
5329 
5330   // Result might be dependent or not.
5331   if (isa<DependentSizedExtVectorType>(Result)) {
5332     DependentSizedExtVectorTypeLoc NewTL
5333       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5334     NewTL.setNameLoc(TL.getNameLoc());
5335   } else {
5336     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5337     NewTL.setNameLoc(TL.getNameLoc());
5338   }
5339 
5340   return Result;
5341 }
5342 
5343 template <typename Derived>
5344 QualType
TransformConstantMatrixType(TypeLocBuilder & TLB,ConstantMatrixTypeLoc TL)5345 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5346                                                     ConstantMatrixTypeLoc TL) {
5347   const ConstantMatrixType *T = TL.getTypePtr();
5348   QualType ElementType = getDerived().TransformType(T->getElementType());
5349   if (ElementType.isNull())
5350     return QualType();
5351 
5352   QualType Result = TL.getType();
5353   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5354     Result = getDerived().RebuildConstantMatrixType(
5355         ElementType, T->getNumRows(), T->getNumColumns());
5356     if (Result.isNull())
5357       return QualType();
5358   }
5359 
5360   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5361   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5362   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5363   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5364   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5365 
5366   return Result;
5367 }
5368 
5369 template <typename Derived>
TransformDependentSizedMatrixType(TypeLocBuilder & TLB,DependentSizedMatrixTypeLoc TL)5370 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5371     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5372   const DependentSizedMatrixType *T = TL.getTypePtr();
5373 
5374   QualType ElementType = getDerived().TransformType(T->getElementType());
5375   if (ElementType.isNull()) {
5376     return QualType();
5377   }
5378 
5379   // Matrix dimensions are constant expressions.
5380   EnterExpressionEvaluationContext Unevaluated(
5381       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5382 
5383   Expr *origRows = TL.getAttrRowOperand();
5384   if (!origRows)
5385     origRows = T->getRowExpr();
5386   Expr *origColumns = TL.getAttrColumnOperand();
5387   if (!origColumns)
5388     origColumns = T->getColumnExpr();
5389 
5390   ExprResult rowResult = getDerived().TransformExpr(origRows);
5391   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5392   if (rowResult.isInvalid())
5393     return QualType();
5394 
5395   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5396   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5397   if (columnResult.isInvalid())
5398     return QualType();
5399 
5400   Expr *rows = rowResult.get();
5401   Expr *columns = columnResult.get();
5402 
5403   QualType Result = TL.getType();
5404   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5405       rows != origRows || columns != origColumns) {
5406     Result = getDerived().RebuildDependentSizedMatrixType(
5407         ElementType, rows, columns, T->getAttributeLoc());
5408 
5409     if (Result.isNull())
5410       return QualType();
5411   }
5412 
5413   // We might have any sort of matrix type now, but fortunately they
5414   // all have the same location layout.
5415   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5416   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5417   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5418   NewTL.setAttrRowOperand(rows);
5419   NewTL.setAttrColumnOperand(columns);
5420   return Result;
5421 }
5422 
5423 template <typename Derived>
TransformDependentAddressSpaceType(TypeLocBuilder & TLB,DependentAddressSpaceTypeLoc TL)5424 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5425     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5426   const DependentAddressSpaceType *T = TL.getTypePtr();
5427 
5428   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5429 
5430   if (pointeeType.isNull())
5431     return QualType();
5432 
5433   // Address spaces are constant expressions.
5434   EnterExpressionEvaluationContext Unevaluated(
5435       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5436 
5437   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5438   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5439   if (AddrSpace.isInvalid())
5440     return QualType();
5441 
5442   QualType Result = TL.getType();
5443   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5444       AddrSpace.get() != T->getAddrSpaceExpr()) {
5445     Result = getDerived().RebuildDependentAddressSpaceType(
5446         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5447     if (Result.isNull())
5448       return QualType();
5449   }
5450 
5451   // Result might be dependent or not.
5452   if (isa<DependentAddressSpaceType>(Result)) {
5453     DependentAddressSpaceTypeLoc NewTL =
5454         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5455 
5456     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5457     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5458     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5459 
5460   } else {
5461     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5462         Result, getDerived().getBaseLocation());
5463     TransformType(TLB, DI->getTypeLoc());
5464   }
5465 
5466   return Result;
5467 }
5468 
5469 template <typename Derived>
TransformVectorType(TypeLocBuilder & TLB,VectorTypeLoc TL)5470 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5471                                                      VectorTypeLoc TL) {
5472   const VectorType *T = TL.getTypePtr();
5473   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5474   if (ElementType.isNull())
5475     return QualType();
5476 
5477   QualType Result = TL.getType();
5478   if (getDerived().AlwaysRebuild() ||
5479       ElementType != T->getElementType()) {
5480     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5481                                             T->getVectorKind());
5482     if (Result.isNull())
5483       return QualType();
5484   }
5485 
5486   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5487   NewTL.setNameLoc(TL.getNameLoc());
5488 
5489   return Result;
5490 }
5491 
5492 template<typename Derived>
TransformExtVectorType(TypeLocBuilder & TLB,ExtVectorTypeLoc TL)5493 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5494                                                         ExtVectorTypeLoc TL) {
5495   const VectorType *T = TL.getTypePtr();
5496   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5497   if (ElementType.isNull())
5498     return QualType();
5499 
5500   QualType Result = TL.getType();
5501   if (getDerived().AlwaysRebuild() ||
5502       ElementType != T->getElementType()) {
5503     Result = getDerived().RebuildExtVectorType(ElementType,
5504                                                T->getNumElements(),
5505                                                /*FIXME*/ SourceLocation());
5506     if (Result.isNull())
5507       return QualType();
5508   }
5509 
5510   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5511   NewTL.setNameLoc(TL.getNameLoc());
5512 
5513   return Result;
5514 }
5515 
5516 template <typename Derived>
TransformFunctionTypeParam(ParmVarDecl * OldParm,int indexAdjustment,Optional<unsigned> NumExpansions,bool ExpectParameterPack)5517 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5518     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5519     bool ExpectParameterPack) {
5520   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5521   TypeSourceInfo *NewDI = nullptr;
5522 
5523   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5524     // If we're substituting into a pack expansion type and we know the
5525     // length we want to expand to, just substitute for the pattern.
5526     TypeLoc OldTL = OldDI->getTypeLoc();
5527     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5528 
5529     TypeLocBuilder TLB;
5530     TypeLoc NewTL = OldDI->getTypeLoc();
5531     TLB.reserve(NewTL.getFullDataSize());
5532 
5533     QualType Result = getDerived().TransformType(TLB,
5534                                                OldExpansionTL.getPatternLoc());
5535     if (Result.isNull())
5536       return nullptr;
5537 
5538     Result = RebuildPackExpansionType(Result,
5539                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5540                                       OldExpansionTL.getEllipsisLoc(),
5541                                       NumExpansions);
5542     if (Result.isNull())
5543       return nullptr;
5544 
5545     PackExpansionTypeLoc NewExpansionTL
5546       = TLB.push<PackExpansionTypeLoc>(Result);
5547     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5548     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5549   } else
5550     NewDI = getDerived().TransformType(OldDI);
5551   if (!NewDI)
5552     return nullptr;
5553 
5554   if (NewDI == OldDI && indexAdjustment == 0)
5555     return OldParm;
5556 
5557   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5558                                              OldParm->getDeclContext(),
5559                                              OldParm->getInnerLocStart(),
5560                                              OldParm->getLocation(),
5561                                              OldParm->getIdentifier(),
5562                                              NewDI->getType(),
5563                                              NewDI,
5564                                              OldParm->getStorageClass(),
5565                                              /* DefArg */ nullptr);
5566   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5567                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5568   transformedLocalDecl(OldParm, {newParm});
5569   return newParm;
5570 }
5571 
5572 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)5573 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5574     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5575     const QualType *ParamTypes,
5576     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5577     SmallVectorImpl<QualType> &OutParamTypes,
5578     SmallVectorImpl<ParmVarDecl *> *PVars,
5579     Sema::ExtParameterInfoBuilder &PInfos) {
5580   int indexAdjustment = 0;
5581 
5582   unsigned NumParams = Params.size();
5583   for (unsigned i = 0; i != NumParams; ++i) {
5584     if (ParmVarDecl *OldParm = Params[i]) {
5585       assert(OldParm->getFunctionScopeIndex() == i);
5586 
5587       Optional<unsigned> NumExpansions;
5588       ParmVarDecl *NewParm = nullptr;
5589       if (OldParm->isParameterPack()) {
5590         // We have a function parameter pack that may need to be expanded.
5591         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5592 
5593         // Find the parameter packs that could be expanded.
5594         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5595         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5596         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5597         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5598 
5599         // Determine whether we should expand the parameter packs.
5600         bool ShouldExpand = false;
5601         bool RetainExpansion = false;
5602         Optional<unsigned> OrigNumExpansions;
5603         if (Unexpanded.size() > 0) {
5604           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5605           NumExpansions = OrigNumExpansions;
5606           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5607                                                    Pattern.getSourceRange(),
5608                                                    Unexpanded,
5609                                                    ShouldExpand,
5610                                                    RetainExpansion,
5611                                                    NumExpansions)) {
5612             return true;
5613           }
5614         } else {
5615 #ifndef NDEBUG
5616           const AutoType *AT =
5617               Pattern.getType().getTypePtr()->getContainedAutoType();
5618           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5619                  "Could not find parameter packs or undeduced auto type!");
5620 #endif
5621         }
5622 
5623         if (ShouldExpand) {
5624           // Expand the function parameter pack into multiple, separate
5625           // parameters.
5626           getDerived().ExpandingFunctionParameterPack(OldParm);
5627           for (unsigned I = 0; I != *NumExpansions; ++I) {
5628             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5629             ParmVarDecl *NewParm
5630               = getDerived().TransformFunctionTypeParam(OldParm,
5631                                                         indexAdjustment++,
5632                                                         OrigNumExpansions,
5633                                                 /*ExpectParameterPack=*/false);
5634             if (!NewParm)
5635               return true;
5636 
5637             if (ParamInfos)
5638               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5639             OutParamTypes.push_back(NewParm->getType());
5640             if (PVars)
5641               PVars->push_back(NewParm);
5642           }
5643 
5644           // If we're supposed to retain a pack expansion, do so by temporarily
5645           // forgetting the partially-substituted parameter pack.
5646           if (RetainExpansion) {
5647             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5648             ParmVarDecl *NewParm
5649               = getDerived().TransformFunctionTypeParam(OldParm,
5650                                                         indexAdjustment++,
5651                                                         OrigNumExpansions,
5652                                                 /*ExpectParameterPack=*/false);
5653             if (!NewParm)
5654               return true;
5655 
5656             if (ParamInfos)
5657               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5658             OutParamTypes.push_back(NewParm->getType());
5659             if (PVars)
5660               PVars->push_back(NewParm);
5661           }
5662 
5663           // The next parameter should have the same adjustment as the
5664           // last thing we pushed, but we post-incremented indexAdjustment
5665           // on every push.  Also, if we push nothing, the adjustment should
5666           // go down by one.
5667           indexAdjustment--;
5668 
5669           // We're done with the pack expansion.
5670           continue;
5671         }
5672 
5673         // We'll substitute the parameter now without expanding the pack
5674         // expansion.
5675         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5676         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5677                                                           indexAdjustment,
5678                                                           NumExpansions,
5679                                                   /*ExpectParameterPack=*/true);
5680         assert(NewParm->isParameterPack() &&
5681                "Parameter pack no longer a parameter pack after "
5682                "transformation.");
5683       } else {
5684         NewParm = getDerived().TransformFunctionTypeParam(
5685             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5686       }
5687 
5688       if (!NewParm)
5689         return true;
5690 
5691       if (ParamInfos)
5692         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5693       OutParamTypes.push_back(NewParm->getType());
5694       if (PVars)
5695         PVars->push_back(NewParm);
5696       continue;
5697     }
5698 
5699     // Deal with the possibility that we don't have a parameter
5700     // declaration for this parameter.
5701     QualType OldType = ParamTypes[i];
5702     bool IsPackExpansion = false;
5703     Optional<unsigned> NumExpansions;
5704     QualType NewType;
5705     if (const PackExpansionType *Expansion
5706                                        = dyn_cast<PackExpansionType>(OldType)) {
5707       // We have a function parameter pack that may need to be expanded.
5708       QualType Pattern = Expansion->getPattern();
5709       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5710       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5711 
5712       // Determine whether we should expand the parameter packs.
5713       bool ShouldExpand = false;
5714       bool RetainExpansion = false;
5715       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5716                                                Unexpanded,
5717                                                ShouldExpand,
5718                                                RetainExpansion,
5719                                                NumExpansions)) {
5720         return true;
5721       }
5722 
5723       if (ShouldExpand) {
5724         // Expand the function parameter pack into multiple, separate
5725         // parameters.
5726         for (unsigned I = 0; I != *NumExpansions; ++I) {
5727           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5728           QualType NewType = getDerived().TransformType(Pattern);
5729           if (NewType.isNull())
5730             return true;
5731 
5732           if (NewType->containsUnexpandedParameterPack()) {
5733             NewType =
5734                 getSema().getASTContext().getPackExpansionType(NewType, None);
5735 
5736             if (NewType.isNull())
5737               return true;
5738           }
5739 
5740           if (ParamInfos)
5741             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5742           OutParamTypes.push_back(NewType);
5743           if (PVars)
5744             PVars->push_back(nullptr);
5745         }
5746 
5747         // We're done with the pack expansion.
5748         continue;
5749       }
5750 
5751       // If we're supposed to retain a pack expansion, do so by temporarily
5752       // forgetting the partially-substituted parameter pack.
5753       if (RetainExpansion) {
5754         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5755         QualType NewType = getDerived().TransformType(Pattern);
5756         if (NewType.isNull())
5757           return true;
5758 
5759         if (ParamInfos)
5760           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5761         OutParamTypes.push_back(NewType);
5762         if (PVars)
5763           PVars->push_back(nullptr);
5764       }
5765 
5766       // We'll substitute the parameter now without expanding the pack
5767       // expansion.
5768       OldType = Expansion->getPattern();
5769       IsPackExpansion = true;
5770       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5771       NewType = getDerived().TransformType(OldType);
5772     } else {
5773       NewType = getDerived().TransformType(OldType);
5774     }
5775 
5776     if (NewType.isNull())
5777       return true;
5778 
5779     if (IsPackExpansion)
5780       NewType = getSema().Context.getPackExpansionType(NewType,
5781                                                        NumExpansions);
5782 
5783     if (ParamInfos)
5784       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5785     OutParamTypes.push_back(NewType);
5786     if (PVars)
5787       PVars->push_back(nullptr);
5788   }
5789 
5790 #ifndef NDEBUG
5791   if (PVars) {
5792     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5793       if (ParmVarDecl *parm = (*PVars)[i])
5794         assert(parm->getFunctionScopeIndex() == i);
5795   }
5796 #endif
5797 
5798   return false;
5799 }
5800 
5801 template<typename Derived>
5802 QualType
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL)5803 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5804                                                    FunctionProtoTypeLoc TL) {
5805   SmallVector<QualType, 4> ExceptionStorage;
5806   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5807   return getDerived().TransformFunctionProtoType(
5808       TLB, TL, nullptr, Qualifiers(),
5809       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5810         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5811                                             ExceptionStorage, Changed);
5812       });
5813 }
5814 
5815 template<typename Derived> template<typename Fn>
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL,CXXRecordDecl * ThisContext,Qualifiers ThisTypeQuals,Fn TransformExceptionSpec)5816 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5817     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5818     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5819 
5820   // Transform the parameters and return type.
5821   //
5822   // We are required to instantiate the params and return type in source order.
5823   // When the function has a trailing return type, we instantiate the
5824   // parameters before the return type,  since the return type can then refer
5825   // to the parameters themselves (via decltype, sizeof, etc.).
5826   //
5827   SmallVector<QualType, 4> ParamTypes;
5828   SmallVector<ParmVarDecl*, 4> ParamDecls;
5829   Sema::ExtParameterInfoBuilder ExtParamInfos;
5830   const FunctionProtoType *T = TL.getTypePtr();
5831 
5832   QualType ResultType;
5833 
5834   if (T->hasTrailingReturn()) {
5835     if (getDerived().TransformFunctionTypeParams(
5836             TL.getBeginLoc(), TL.getParams(),
5837             TL.getTypePtr()->param_type_begin(),
5838             T->getExtParameterInfosOrNull(),
5839             ParamTypes, &ParamDecls, ExtParamInfos))
5840       return QualType();
5841 
5842     {
5843       // C++11 [expr.prim.general]p3:
5844       //   If a declaration declares a member function or member function
5845       //   template of a class X, the expression this is a prvalue of type
5846       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5847       //   and the end of the function-definition, member-declarator, or
5848       //   declarator.
5849       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5850 
5851       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5852       if (ResultType.isNull())
5853         return QualType();
5854     }
5855   }
5856   else {
5857     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5858     if (ResultType.isNull())
5859       return QualType();
5860 
5861     if (getDerived().TransformFunctionTypeParams(
5862             TL.getBeginLoc(), TL.getParams(),
5863             TL.getTypePtr()->param_type_begin(),
5864             T->getExtParameterInfosOrNull(),
5865             ParamTypes, &ParamDecls, ExtParamInfos))
5866       return QualType();
5867   }
5868 
5869   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5870 
5871   bool EPIChanged = false;
5872   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5873     return QualType();
5874 
5875   // Handle extended parameter information.
5876   if (auto NewExtParamInfos =
5877         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5878     if (!EPI.ExtParameterInfos ||
5879         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5880           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5881       EPIChanged = true;
5882     }
5883     EPI.ExtParameterInfos = NewExtParamInfos;
5884   } else if (EPI.ExtParameterInfos) {
5885     EPIChanged = true;
5886     EPI.ExtParameterInfos = nullptr;
5887   }
5888 
5889   QualType Result = TL.getType();
5890   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5891       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5892     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5893     if (Result.isNull())
5894       return QualType();
5895   }
5896 
5897   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5898   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5899   NewTL.setLParenLoc(TL.getLParenLoc());
5900   NewTL.setRParenLoc(TL.getRParenLoc());
5901   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5902   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5903   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5904     NewTL.setParam(i, ParamDecls[i]);
5905 
5906   return Result;
5907 }
5908 
5909 template<typename Derived>
TransformExceptionSpec(SourceLocation Loc,FunctionProtoType::ExceptionSpecInfo & ESI,SmallVectorImpl<QualType> & Exceptions,bool & Changed)5910 bool TreeTransform<Derived>::TransformExceptionSpec(
5911     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5912     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5913   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5914 
5915   // Instantiate a dynamic noexcept expression, if any.
5916   if (isComputedNoexcept(ESI.Type)) {
5917     EnterExpressionEvaluationContext Unevaluated(
5918         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5919     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5920     if (NoexceptExpr.isInvalid())
5921       return true;
5922 
5923     ExceptionSpecificationType EST = ESI.Type;
5924     NoexceptExpr =
5925         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5926     if (NoexceptExpr.isInvalid())
5927       return true;
5928 
5929     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5930       Changed = true;
5931     ESI.NoexceptExpr = NoexceptExpr.get();
5932     ESI.Type = EST;
5933   }
5934 
5935   if (ESI.Type != EST_Dynamic)
5936     return false;
5937 
5938   // Instantiate a dynamic exception specification's type.
5939   for (QualType T : ESI.Exceptions) {
5940     if (const PackExpansionType *PackExpansion =
5941             T->getAs<PackExpansionType>()) {
5942       Changed = true;
5943 
5944       // We have a pack expansion. Instantiate it.
5945       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5946       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5947                                               Unexpanded);
5948       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5949 
5950       // Determine whether the set of unexpanded parameter packs can and
5951       // should
5952       // be expanded.
5953       bool Expand = false;
5954       bool RetainExpansion = false;
5955       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5956       // FIXME: Track the location of the ellipsis (and track source location
5957       // information for the types in the exception specification in general).
5958       if (getDerived().TryExpandParameterPacks(
5959               Loc, SourceRange(), Unexpanded, Expand,
5960               RetainExpansion, NumExpansions))
5961         return true;
5962 
5963       if (!Expand) {
5964         // We can't expand this pack expansion into separate arguments yet;
5965         // just substitute into the pattern and create a new pack expansion
5966         // type.
5967         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5968         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5969         if (U.isNull())
5970           return true;
5971 
5972         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5973         Exceptions.push_back(U);
5974         continue;
5975       }
5976 
5977       // Substitute into the pack expansion pattern for each slice of the
5978       // pack.
5979       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5980         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5981 
5982         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5983         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5984           return true;
5985 
5986         Exceptions.push_back(U);
5987       }
5988     } else {
5989       QualType U = getDerived().TransformType(T);
5990       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5991         return true;
5992       if (T != U)
5993         Changed = true;
5994 
5995       Exceptions.push_back(U);
5996     }
5997   }
5998 
5999   ESI.Exceptions = Exceptions;
6000   if (ESI.Exceptions.empty())
6001     ESI.Type = EST_DynamicNone;
6002   return false;
6003 }
6004 
6005 template<typename Derived>
TransformFunctionNoProtoType(TypeLocBuilder & TLB,FunctionNoProtoTypeLoc TL)6006 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6007                                                  TypeLocBuilder &TLB,
6008                                                  FunctionNoProtoTypeLoc TL) {
6009   const FunctionNoProtoType *T = TL.getTypePtr();
6010   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6011   if (ResultType.isNull())
6012     return QualType();
6013 
6014   QualType Result = TL.getType();
6015   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6016     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6017 
6018   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6019   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6020   NewTL.setLParenLoc(TL.getLParenLoc());
6021   NewTL.setRParenLoc(TL.getRParenLoc());
6022   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6023 
6024   return Result;
6025 }
6026 
6027 template<typename Derived> QualType
TransformUnresolvedUsingType(TypeLocBuilder & TLB,UnresolvedUsingTypeLoc TL)6028 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6029                                                  UnresolvedUsingTypeLoc TL) {
6030   const UnresolvedUsingType *T = TL.getTypePtr();
6031   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6032   if (!D)
6033     return QualType();
6034 
6035   QualType Result = TL.getType();
6036   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6037     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6038     if (Result.isNull())
6039       return QualType();
6040   }
6041 
6042   // We might get an arbitrary type spec type back.  We should at
6043   // least always get a type spec type, though.
6044   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6045   NewTL.setNameLoc(TL.getNameLoc());
6046 
6047   return Result;
6048 }
6049 
6050 template<typename Derived>
TransformTypedefType(TypeLocBuilder & TLB,TypedefTypeLoc TL)6051 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6052                                                       TypedefTypeLoc TL) {
6053   const TypedefType *T = TL.getTypePtr();
6054   TypedefNameDecl *Typedef
6055     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6056                                                                T->getDecl()));
6057   if (!Typedef)
6058     return QualType();
6059 
6060   QualType Result = TL.getType();
6061   if (getDerived().AlwaysRebuild() ||
6062       Typedef != T->getDecl()) {
6063     Result = getDerived().RebuildTypedefType(Typedef);
6064     if (Result.isNull())
6065       return QualType();
6066   }
6067 
6068   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6069   NewTL.setNameLoc(TL.getNameLoc());
6070 
6071   return Result;
6072 }
6073 
6074 template<typename Derived>
TransformTypeOfExprType(TypeLocBuilder & TLB,TypeOfExprTypeLoc TL)6075 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6076                                                       TypeOfExprTypeLoc TL) {
6077   // typeof expressions are not potentially evaluated contexts
6078   EnterExpressionEvaluationContext Unevaluated(
6079       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6080       Sema::ReuseLambdaContextDecl);
6081 
6082   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6083   if (E.isInvalid())
6084     return QualType();
6085 
6086   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6087   if (E.isInvalid())
6088     return QualType();
6089 
6090   QualType Result = TL.getType();
6091   if (getDerived().AlwaysRebuild() ||
6092       E.get() != TL.getUnderlyingExpr()) {
6093     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6094     if (Result.isNull())
6095       return QualType();
6096   }
6097   else E.get();
6098 
6099   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6100   NewTL.setTypeofLoc(TL.getTypeofLoc());
6101   NewTL.setLParenLoc(TL.getLParenLoc());
6102   NewTL.setRParenLoc(TL.getRParenLoc());
6103 
6104   return Result;
6105 }
6106 
6107 template<typename Derived>
TransformTypeOfType(TypeLocBuilder & TLB,TypeOfTypeLoc TL)6108 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6109                                                      TypeOfTypeLoc TL) {
6110   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6111   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6112   if (!New_Under_TI)
6113     return QualType();
6114 
6115   QualType Result = TL.getType();
6116   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6117     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6118     if (Result.isNull())
6119       return QualType();
6120   }
6121 
6122   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6123   NewTL.setTypeofLoc(TL.getTypeofLoc());
6124   NewTL.setLParenLoc(TL.getLParenLoc());
6125   NewTL.setRParenLoc(TL.getRParenLoc());
6126   NewTL.setUnderlyingTInfo(New_Under_TI);
6127 
6128   return Result;
6129 }
6130 
6131 template<typename Derived>
TransformDecltypeType(TypeLocBuilder & TLB,DecltypeTypeLoc TL)6132 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6133                                                        DecltypeTypeLoc TL) {
6134   const DecltypeType *T = TL.getTypePtr();
6135 
6136   // decltype expressions are not potentially evaluated contexts
6137   EnterExpressionEvaluationContext Unevaluated(
6138       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6139       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6140 
6141   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6142   if (E.isInvalid())
6143     return QualType();
6144 
6145   E = getSema().ActOnDecltypeExpression(E.get());
6146   if (E.isInvalid())
6147     return QualType();
6148 
6149   QualType Result = TL.getType();
6150   if (getDerived().AlwaysRebuild() ||
6151       E.get() != T->getUnderlyingExpr()) {
6152     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6153     if (Result.isNull())
6154       return QualType();
6155   }
6156   else E.get();
6157 
6158   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6159   NewTL.setNameLoc(TL.getNameLoc());
6160 
6161   return Result;
6162 }
6163 
6164 template<typename Derived>
TransformUnaryTransformType(TypeLocBuilder & TLB,UnaryTransformTypeLoc TL)6165 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6166                                                             TypeLocBuilder &TLB,
6167                                                      UnaryTransformTypeLoc TL) {
6168   QualType Result = TL.getType();
6169   if (Result->isDependentType()) {
6170     const UnaryTransformType *T = TL.getTypePtr();
6171     QualType NewBase =
6172       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6173     Result = getDerived().RebuildUnaryTransformType(NewBase,
6174                                                     T->getUTTKind(),
6175                                                     TL.getKWLoc());
6176     if (Result.isNull())
6177       return QualType();
6178   }
6179 
6180   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6181   NewTL.setKWLoc(TL.getKWLoc());
6182   NewTL.setParensRange(TL.getParensRange());
6183   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6184   return Result;
6185 }
6186 
6187 template<typename Derived>
TransformDeducedTemplateSpecializationType(TypeLocBuilder & TLB,DeducedTemplateSpecializationTypeLoc TL)6188 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6189     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6190   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6191 
6192   CXXScopeSpec SS;
6193   TemplateName TemplateName = getDerived().TransformTemplateName(
6194       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6195   if (TemplateName.isNull())
6196     return QualType();
6197 
6198   QualType OldDeduced = T->getDeducedType();
6199   QualType NewDeduced;
6200   if (!OldDeduced.isNull()) {
6201     NewDeduced = getDerived().TransformType(OldDeduced);
6202     if (NewDeduced.isNull())
6203       return QualType();
6204   }
6205 
6206   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6207       TemplateName, NewDeduced);
6208   if (Result.isNull())
6209     return QualType();
6210 
6211   DeducedTemplateSpecializationTypeLoc NewTL =
6212       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6213   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6214 
6215   return Result;
6216 }
6217 
6218 template<typename Derived>
TransformRecordType(TypeLocBuilder & TLB,RecordTypeLoc TL)6219 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6220                                                      RecordTypeLoc TL) {
6221   const RecordType *T = TL.getTypePtr();
6222   RecordDecl *Record
6223     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6224                                                           T->getDecl()));
6225   if (!Record)
6226     return QualType();
6227 
6228   QualType Result = TL.getType();
6229   if (getDerived().AlwaysRebuild() ||
6230       Record != T->getDecl()) {
6231     Result = getDerived().RebuildRecordType(Record);
6232     if (Result.isNull())
6233       return QualType();
6234   }
6235 
6236   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6237   NewTL.setNameLoc(TL.getNameLoc());
6238 
6239   return Result;
6240 }
6241 
6242 template<typename Derived>
TransformEnumType(TypeLocBuilder & TLB,EnumTypeLoc TL)6243 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6244                                                    EnumTypeLoc TL) {
6245   const EnumType *T = TL.getTypePtr();
6246   EnumDecl *Enum
6247     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6248                                                         T->getDecl()));
6249   if (!Enum)
6250     return QualType();
6251 
6252   QualType Result = TL.getType();
6253   if (getDerived().AlwaysRebuild() ||
6254       Enum != T->getDecl()) {
6255     Result = getDerived().RebuildEnumType(Enum);
6256     if (Result.isNull())
6257       return QualType();
6258   }
6259 
6260   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6261   NewTL.setNameLoc(TL.getNameLoc());
6262 
6263   return Result;
6264 }
6265 
6266 template<typename Derived>
TransformInjectedClassNameType(TypeLocBuilder & TLB,InjectedClassNameTypeLoc TL)6267 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6268                                          TypeLocBuilder &TLB,
6269                                          InjectedClassNameTypeLoc TL) {
6270   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6271                                        TL.getTypePtr()->getDecl());
6272   if (!D) return QualType();
6273 
6274   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6275   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6276   return T;
6277 }
6278 
6279 template<typename Derived>
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL)6280 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6281                                                 TypeLocBuilder &TLB,
6282                                                 TemplateTypeParmTypeLoc TL) {
6283   return TransformTypeSpecType(TLB, TL);
6284 }
6285 
6286 template<typename Derived>
TransformSubstTemplateTypeParmType(TypeLocBuilder & TLB,SubstTemplateTypeParmTypeLoc TL)6287 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6288                                          TypeLocBuilder &TLB,
6289                                          SubstTemplateTypeParmTypeLoc TL) {
6290   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6291 
6292   // Substitute into the replacement type, which itself might involve something
6293   // that needs to be transformed. This only tends to occur with default
6294   // template arguments of template template parameters.
6295   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6296   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6297   if (Replacement.isNull())
6298     return QualType();
6299 
6300   // Always canonicalize the replacement type.
6301   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6302   QualType Result
6303     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6304                                                    Replacement);
6305 
6306   // Propagate type-source information.
6307   SubstTemplateTypeParmTypeLoc NewTL
6308     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6309   NewTL.setNameLoc(TL.getNameLoc());
6310   return Result;
6311 
6312 }
6313 
6314 template<typename Derived>
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL)6315 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6316                                           TypeLocBuilder &TLB,
6317                                           SubstTemplateTypeParmPackTypeLoc TL) {
6318   return TransformTypeSpecType(TLB, TL);
6319 }
6320 
6321 template<typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL)6322 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6323                                                         TypeLocBuilder &TLB,
6324                                            TemplateSpecializationTypeLoc TL) {
6325   const TemplateSpecializationType *T = TL.getTypePtr();
6326 
6327   // The nested-name-specifier never matters in a TemplateSpecializationType,
6328   // because we can't have a dependent nested-name-specifier anyway.
6329   CXXScopeSpec SS;
6330   TemplateName Template
6331     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6332                                          TL.getTemplateNameLoc());
6333   if (Template.isNull())
6334     return QualType();
6335 
6336   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6337 }
6338 
6339 template<typename Derived>
TransformAtomicType(TypeLocBuilder & TLB,AtomicTypeLoc TL)6340 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6341                                                      AtomicTypeLoc TL) {
6342   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6343   if (ValueType.isNull())
6344     return QualType();
6345 
6346   QualType Result = TL.getType();
6347   if (getDerived().AlwaysRebuild() ||
6348       ValueType != TL.getValueLoc().getType()) {
6349     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6350     if (Result.isNull())
6351       return QualType();
6352   }
6353 
6354   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6355   NewTL.setKWLoc(TL.getKWLoc());
6356   NewTL.setLParenLoc(TL.getLParenLoc());
6357   NewTL.setRParenLoc(TL.getRParenLoc());
6358 
6359   return Result;
6360 }
6361 
6362 template <typename Derived>
TransformPipeType(TypeLocBuilder & TLB,PipeTypeLoc TL)6363 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6364                                                    PipeTypeLoc TL) {
6365   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6366   if (ValueType.isNull())
6367     return QualType();
6368 
6369   QualType Result = TL.getType();
6370   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6371     const PipeType *PT = Result->castAs<PipeType>();
6372     bool isReadPipe = PT->isReadOnly();
6373     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6374     if (Result.isNull())
6375       return QualType();
6376   }
6377 
6378   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6379   NewTL.setKWLoc(TL.getKWLoc());
6380 
6381   return Result;
6382 }
6383 
6384 template <typename Derived>
TransformExtIntType(TypeLocBuilder & TLB,ExtIntTypeLoc TL)6385 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6386                                                      ExtIntTypeLoc TL) {
6387   const ExtIntType *EIT = TL.getTypePtr();
6388   QualType Result = TL.getType();
6389 
6390   if (getDerived().AlwaysRebuild()) {
6391     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6392                                             EIT->getNumBits(), TL.getNameLoc());
6393     if (Result.isNull())
6394       return QualType();
6395   }
6396 
6397   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6398   NewTL.setNameLoc(TL.getNameLoc());
6399   return Result;
6400 }
6401 
6402 template <typename Derived>
TransformDependentExtIntType(TypeLocBuilder & TLB,DependentExtIntTypeLoc TL)6403 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6404     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6405   const DependentExtIntType *EIT = TL.getTypePtr();
6406 
6407   EnterExpressionEvaluationContext Unevaluated(
6408       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6409   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6410   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6411 
6412   if (BitsExpr.isInvalid())
6413     return QualType();
6414 
6415   QualType Result = TL.getType();
6416 
6417   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6418     Result = getDerived().RebuildDependentExtIntType(
6419         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6420 
6421     if (Result.isNull())
6422       return QualType();
6423   }
6424 
6425   if (isa<DependentExtIntType>(Result)) {
6426     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6427     NewTL.setNameLoc(TL.getNameLoc());
6428   } else {
6429     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6430     NewTL.setNameLoc(TL.getNameLoc());
6431   }
6432   return Result;
6433 }
6434 
6435   /// Simple iterator that traverses the template arguments in a
6436   /// container that provides a \c getArgLoc() member function.
6437   ///
6438   /// This iterator is intended to be used with the iterator form of
6439   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6440   template<typename ArgLocContainer>
6441   class TemplateArgumentLocContainerIterator {
6442     ArgLocContainer *Container;
6443     unsigned Index;
6444 
6445   public:
6446     typedef TemplateArgumentLoc value_type;
6447     typedef TemplateArgumentLoc reference;
6448     typedef int difference_type;
6449     typedef std::input_iterator_tag iterator_category;
6450 
6451     class pointer {
6452       TemplateArgumentLoc Arg;
6453 
6454     public:
pointer(TemplateArgumentLoc Arg)6455       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6456 
6457       const TemplateArgumentLoc *operator->() const {
6458         return &Arg;
6459       }
6460     };
6461 
6462 
TemplateArgumentLocContainerIterator()6463     TemplateArgumentLocContainerIterator() {}
6464 
TemplateArgumentLocContainerIterator(ArgLocContainer & Container,unsigned Index)6465     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6466                                  unsigned Index)
6467       : Container(&Container), Index(Index) { }
6468 
6469     TemplateArgumentLocContainerIterator &operator++() {
6470       ++Index;
6471       return *this;
6472     }
6473 
6474     TemplateArgumentLocContainerIterator operator++(int) {
6475       TemplateArgumentLocContainerIterator Old(*this);
6476       ++(*this);
6477       return Old;
6478     }
6479 
6480     TemplateArgumentLoc operator*() const {
6481       return Container->getArgLoc(Index);
6482     }
6483 
6484     pointer operator->() const {
6485       return pointer(Container->getArgLoc(Index));
6486     }
6487 
6488     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6489                            const TemplateArgumentLocContainerIterator &Y) {
6490       return X.Container == Y.Container && X.Index == Y.Index;
6491     }
6492 
6493     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6494                            const TemplateArgumentLocContainerIterator &Y) {
6495       return !(X == Y);
6496     }
6497   };
6498 
6499 template<typename Derived>
TransformAutoType(TypeLocBuilder & TLB,AutoTypeLoc TL)6500 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6501                                                    AutoTypeLoc TL) {
6502   const AutoType *T = TL.getTypePtr();
6503   QualType OldDeduced = T->getDeducedType();
6504   QualType NewDeduced;
6505   if (!OldDeduced.isNull()) {
6506     NewDeduced = getDerived().TransformType(OldDeduced);
6507     if (NewDeduced.isNull())
6508       return QualType();
6509   }
6510 
6511   ConceptDecl *NewCD = nullptr;
6512   TemplateArgumentListInfo NewTemplateArgs;
6513   NestedNameSpecifierLoc NewNestedNameSpec;
6514   if (T->isConstrained()) {
6515     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6516         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6517 
6518     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6519     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6520     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6521     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6522                                                 ArgIterator(TL,
6523                                                             TL.getNumArgs()),
6524                                                 NewTemplateArgs))
6525       return QualType();
6526 
6527     if (TL.getNestedNameSpecifierLoc()) {
6528       NewNestedNameSpec
6529         = getDerived().TransformNestedNameSpecifierLoc(
6530             TL.getNestedNameSpecifierLoc());
6531       if (!NewNestedNameSpec)
6532         return QualType();
6533     }
6534   }
6535 
6536   QualType Result = TL.getType();
6537   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6538       T->isDependentType() || T->isConstrained()) {
6539     // FIXME: Maybe don't rebuild if all template arguments are the same.
6540     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6541     NewArgList.reserve(NewArgList.size());
6542     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6543       NewArgList.push_back(ArgLoc.getArgument());
6544     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6545                                           NewArgList);
6546     if (Result.isNull())
6547       return QualType();
6548   }
6549 
6550   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6551   NewTL.setNameLoc(TL.getNameLoc());
6552   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6553   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6554   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6555   NewTL.setFoundDecl(TL.getFoundDecl());
6556   NewTL.setLAngleLoc(TL.getLAngleLoc());
6557   NewTL.setRAngleLoc(TL.getRAngleLoc());
6558   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6559     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6560 
6561   return Result;
6562 }
6563 
6564 template <typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL,TemplateName Template)6565 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6566                                                         TypeLocBuilder &TLB,
6567                                            TemplateSpecializationTypeLoc TL,
6568                                                       TemplateName Template) {
6569   TemplateArgumentListInfo NewTemplateArgs;
6570   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6571   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6572   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6573     ArgIterator;
6574   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6575                                               ArgIterator(TL, TL.getNumArgs()),
6576                                               NewTemplateArgs))
6577     return QualType();
6578 
6579   // FIXME: maybe don't rebuild if all the template arguments are the same.
6580 
6581   QualType Result =
6582     getDerived().RebuildTemplateSpecializationType(Template,
6583                                                    TL.getTemplateNameLoc(),
6584                                                    NewTemplateArgs);
6585 
6586   if (!Result.isNull()) {
6587     // Specializations of template template parameters are represented as
6588     // TemplateSpecializationTypes, and substitution of type alias templates
6589     // within a dependent context can transform them into
6590     // DependentTemplateSpecializationTypes.
6591     if (isa<DependentTemplateSpecializationType>(Result)) {
6592       DependentTemplateSpecializationTypeLoc NewTL
6593         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6594       NewTL.setElaboratedKeywordLoc(SourceLocation());
6595       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6596       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6597       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6598       NewTL.setLAngleLoc(TL.getLAngleLoc());
6599       NewTL.setRAngleLoc(TL.getRAngleLoc());
6600       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6601         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6602       return Result;
6603     }
6604 
6605     TemplateSpecializationTypeLoc NewTL
6606       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6607     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6608     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6609     NewTL.setLAngleLoc(TL.getLAngleLoc());
6610     NewTL.setRAngleLoc(TL.getRAngleLoc());
6611     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6612       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6613   }
6614 
6615   return Result;
6616 }
6617 
6618 template <typename Derived>
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,TemplateName Template,CXXScopeSpec & SS)6619 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6620                                      TypeLocBuilder &TLB,
6621                                      DependentTemplateSpecializationTypeLoc TL,
6622                                      TemplateName Template,
6623                                      CXXScopeSpec &SS) {
6624   TemplateArgumentListInfo NewTemplateArgs;
6625   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6626   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6627   typedef TemplateArgumentLocContainerIterator<
6628             DependentTemplateSpecializationTypeLoc> ArgIterator;
6629   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6630                                               ArgIterator(TL, TL.getNumArgs()),
6631                                               NewTemplateArgs))
6632     return QualType();
6633 
6634   // FIXME: maybe don't rebuild if all the template arguments are the same.
6635 
6636   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6637     QualType Result
6638       = getSema().Context.getDependentTemplateSpecializationType(
6639                                                 TL.getTypePtr()->getKeyword(),
6640                                                          DTN->getQualifier(),
6641                                                          DTN->getIdentifier(),
6642                                                                NewTemplateArgs);
6643 
6644     DependentTemplateSpecializationTypeLoc NewTL
6645       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6646     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6647     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6648     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6649     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6650     NewTL.setLAngleLoc(TL.getLAngleLoc());
6651     NewTL.setRAngleLoc(TL.getRAngleLoc());
6652     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6653       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6654     return Result;
6655   }
6656 
6657   QualType Result
6658     = getDerived().RebuildTemplateSpecializationType(Template,
6659                                                      TL.getTemplateNameLoc(),
6660                                                      NewTemplateArgs);
6661 
6662   if (!Result.isNull()) {
6663     /// FIXME: Wrap this in an elaborated-type-specifier?
6664     TemplateSpecializationTypeLoc NewTL
6665       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6666     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6667     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6668     NewTL.setLAngleLoc(TL.getLAngleLoc());
6669     NewTL.setRAngleLoc(TL.getRAngleLoc());
6670     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6671       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6672   }
6673 
6674   return Result;
6675 }
6676 
6677 template<typename Derived>
6678 QualType
TransformElaboratedType(TypeLocBuilder & TLB,ElaboratedTypeLoc TL)6679 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6680                                                 ElaboratedTypeLoc TL) {
6681   const ElaboratedType *T = TL.getTypePtr();
6682 
6683   NestedNameSpecifierLoc QualifierLoc;
6684   // NOTE: the qualifier in an ElaboratedType is optional.
6685   if (TL.getQualifierLoc()) {
6686     QualifierLoc
6687       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6688     if (!QualifierLoc)
6689       return QualType();
6690   }
6691 
6692   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6693   if (NamedT.isNull())
6694     return QualType();
6695 
6696   // C++0x [dcl.type.elab]p2:
6697   //   If the identifier resolves to a typedef-name or the simple-template-id
6698   //   resolves to an alias template specialization, the
6699   //   elaborated-type-specifier is ill-formed.
6700   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6701     if (const TemplateSpecializationType *TST =
6702           NamedT->getAs<TemplateSpecializationType>()) {
6703       TemplateName Template = TST->getTemplateName();
6704       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6705               Template.getAsTemplateDecl())) {
6706         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6707                      diag::err_tag_reference_non_tag)
6708             << TAT << Sema::NTK_TypeAliasTemplate
6709             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6710         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6711       }
6712     }
6713   }
6714 
6715   QualType Result = TL.getType();
6716   if (getDerived().AlwaysRebuild() ||
6717       QualifierLoc != TL.getQualifierLoc() ||
6718       NamedT != T->getNamedType()) {
6719     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6720                                                 T->getKeyword(),
6721                                                 QualifierLoc, NamedT);
6722     if (Result.isNull())
6723       return QualType();
6724   }
6725 
6726   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6727   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6728   NewTL.setQualifierLoc(QualifierLoc);
6729   return Result;
6730 }
6731 
6732 template<typename Derived>
TransformAttributedType(TypeLocBuilder & TLB,AttributedTypeLoc TL)6733 QualType TreeTransform<Derived>::TransformAttributedType(
6734                                                 TypeLocBuilder &TLB,
6735                                                 AttributedTypeLoc TL) {
6736   const AttributedType *oldType = TL.getTypePtr();
6737   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6738   if (modifiedType.isNull())
6739     return QualType();
6740 
6741   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6742   const Attr *oldAttr = TL.getAttr();
6743   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6744   if (oldAttr && !newAttr)
6745     return QualType();
6746 
6747   QualType result = TL.getType();
6748 
6749   // FIXME: dependent operand expressions?
6750   if (getDerived().AlwaysRebuild() ||
6751       modifiedType != oldType->getModifiedType()) {
6752     // TODO: this is really lame; we should really be rebuilding the
6753     // equivalent type from first principles.
6754     QualType equivalentType
6755       = getDerived().TransformType(oldType->getEquivalentType());
6756     if (equivalentType.isNull())
6757       return QualType();
6758 
6759     // Check whether we can add nullability; it is only represented as
6760     // type sugar, and therefore cannot be diagnosed in any other way.
6761     if (auto nullability = oldType->getImmediateNullability()) {
6762       if (!modifiedType->canHaveNullability()) {
6763         SemaRef.Diag(TL.getAttr()->getLocation(),
6764                      diag::err_nullability_nonpointer)
6765             << DiagNullabilityKind(*nullability, false) << modifiedType;
6766         return QualType();
6767       }
6768     }
6769 
6770     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6771                                                modifiedType,
6772                                                equivalentType);
6773   }
6774 
6775   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6776   newTL.setAttr(newAttr);
6777   return result;
6778 }
6779 
6780 template<typename Derived>
6781 QualType
TransformParenType(TypeLocBuilder & TLB,ParenTypeLoc TL)6782 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6783                                            ParenTypeLoc TL) {
6784   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6785   if (Inner.isNull())
6786     return QualType();
6787 
6788   QualType Result = TL.getType();
6789   if (getDerived().AlwaysRebuild() ||
6790       Inner != TL.getInnerLoc().getType()) {
6791     Result = getDerived().RebuildParenType(Inner);
6792     if (Result.isNull())
6793       return QualType();
6794   }
6795 
6796   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6797   NewTL.setLParenLoc(TL.getLParenLoc());
6798   NewTL.setRParenLoc(TL.getRParenLoc());
6799   return Result;
6800 }
6801 
6802 template <typename Derived>
6803 QualType
TransformMacroQualifiedType(TypeLocBuilder & TLB,MacroQualifiedTypeLoc TL)6804 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6805                                                     MacroQualifiedTypeLoc TL) {
6806   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6807   if (Inner.isNull())
6808     return QualType();
6809 
6810   QualType Result = TL.getType();
6811   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6812     Result =
6813         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6814     if (Result.isNull())
6815       return QualType();
6816   }
6817 
6818   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6819   NewTL.setExpansionLoc(TL.getExpansionLoc());
6820   return Result;
6821 }
6822 
6823 template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL)6824 QualType TreeTransform<Derived>::TransformDependentNameType(
6825     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6826   return TransformDependentNameType(TLB, TL, false);
6827 }
6828 
6829 template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL,bool DeducedTSTContext)6830 QualType TreeTransform<Derived>::TransformDependentNameType(
6831     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6832   const DependentNameType *T = TL.getTypePtr();
6833 
6834   NestedNameSpecifierLoc QualifierLoc
6835     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6836   if (!QualifierLoc)
6837     return QualType();
6838 
6839   QualType Result
6840     = getDerived().RebuildDependentNameType(T->getKeyword(),
6841                                             TL.getElaboratedKeywordLoc(),
6842                                             QualifierLoc,
6843                                             T->getIdentifier(),
6844                                             TL.getNameLoc(),
6845                                             DeducedTSTContext);
6846   if (Result.isNull())
6847     return QualType();
6848 
6849   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6850     QualType NamedT = ElabT->getNamedType();
6851     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6852 
6853     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6854     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6855     NewTL.setQualifierLoc(QualifierLoc);
6856   } else {
6857     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6858     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6859     NewTL.setQualifierLoc(QualifierLoc);
6860     NewTL.setNameLoc(TL.getNameLoc());
6861   }
6862   return Result;
6863 }
6864 
6865 template<typename Derived>
6866 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL)6867           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6868                                  DependentTemplateSpecializationTypeLoc TL) {
6869   NestedNameSpecifierLoc QualifierLoc;
6870   if (TL.getQualifierLoc()) {
6871     QualifierLoc
6872       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6873     if (!QualifierLoc)
6874       return QualType();
6875   }
6876 
6877   return getDerived()
6878            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6879 }
6880 
6881 template<typename Derived>
6882 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,NestedNameSpecifierLoc QualifierLoc)6883 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6884                                    DependentTemplateSpecializationTypeLoc TL,
6885                                        NestedNameSpecifierLoc QualifierLoc) {
6886   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6887 
6888   TemplateArgumentListInfo NewTemplateArgs;
6889   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6890   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6891 
6892   typedef TemplateArgumentLocContainerIterator<
6893   DependentTemplateSpecializationTypeLoc> ArgIterator;
6894   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6895                                               ArgIterator(TL, TL.getNumArgs()),
6896                                               NewTemplateArgs))
6897     return QualType();
6898 
6899   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6900       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6901       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6902       /*AllowInjectedClassName*/ false);
6903   if (Result.isNull())
6904     return QualType();
6905 
6906   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6907     QualType NamedT = ElabT->getNamedType();
6908 
6909     // Copy information relevant to the template specialization.
6910     TemplateSpecializationTypeLoc NamedTL
6911       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6912     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6913     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6914     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6915     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6916     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6917       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6918 
6919     // Copy information relevant to the elaborated type.
6920     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6921     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6922     NewTL.setQualifierLoc(QualifierLoc);
6923   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6924     DependentTemplateSpecializationTypeLoc SpecTL
6925       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6926     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6927     SpecTL.setQualifierLoc(QualifierLoc);
6928     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6929     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6930     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6931     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6932     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6933       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6934   } else {
6935     TemplateSpecializationTypeLoc SpecTL
6936       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6937     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6938     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6939     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6940     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6941     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6942       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6943   }
6944   return Result;
6945 }
6946 
6947 template<typename Derived>
TransformPackExpansionType(TypeLocBuilder & TLB,PackExpansionTypeLoc TL)6948 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6949                                                       PackExpansionTypeLoc TL) {
6950   QualType Pattern
6951     = getDerived().TransformType(TLB, TL.getPatternLoc());
6952   if (Pattern.isNull())
6953     return QualType();
6954 
6955   QualType Result = TL.getType();
6956   if (getDerived().AlwaysRebuild() ||
6957       Pattern != TL.getPatternLoc().getType()) {
6958     Result = getDerived().RebuildPackExpansionType(Pattern,
6959                                            TL.getPatternLoc().getSourceRange(),
6960                                                    TL.getEllipsisLoc(),
6961                                            TL.getTypePtr()->getNumExpansions());
6962     if (Result.isNull())
6963       return QualType();
6964   }
6965 
6966   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6967   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6968   return Result;
6969 }
6970 
6971 template<typename Derived>
6972 QualType
TransformObjCInterfaceType(TypeLocBuilder & TLB,ObjCInterfaceTypeLoc TL)6973 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6974                                                    ObjCInterfaceTypeLoc TL) {
6975   // ObjCInterfaceType is never dependent.
6976   TLB.pushFullCopy(TL);
6977   return TL.getType();
6978 }
6979 
6980 template<typename Derived>
6981 QualType
TransformObjCTypeParamType(TypeLocBuilder & TLB,ObjCTypeParamTypeLoc TL)6982 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6983                                                    ObjCTypeParamTypeLoc TL) {
6984   const ObjCTypeParamType *T = TL.getTypePtr();
6985   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6986       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6987   if (!OTP)
6988     return QualType();
6989 
6990   QualType Result = TL.getType();
6991   if (getDerived().AlwaysRebuild() ||
6992       OTP != T->getDecl()) {
6993     Result = getDerived().RebuildObjCTypeParamType(OTP,
6994                  TL.getProtocolLAngleLoc(),
6995                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6996                                     TL.getNumProtocols()),
6997                  TL.getProtocolLocs(),
6998                  TL.getProtocolRAngleLoc());
6999     if (Result.isNull())
7000       return QualType();
7001   }
7002 
7003   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7004   if (TL.getNumProtocols()) {
7005     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7006     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7007       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7008     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7009   }
7010   return Result;
7011 }
7012 
7013 template<typename Derived>
7014 QualType
TransformObjCObjectType(TypeLocBuilder & TLB,ObjCObjectTypeLoc TL)7015 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7016                                                 ObjCObjectTypeLoc TL) {
7017   // Transform base type.
7018   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7019   if (BaseType.isNull())
7020     return QualType();
7021 
7022   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7023 
7024   // Transform type arguments.
7025   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7026   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7027     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7028     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7029     QualType TypeArg = TypeArgInfo->getType();
7030     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7031       AnyChanged = true;
7032 
7033       // We have a pack expansion. Instantiate it.
7034       const auto *PackExpansion = PackExpansionLoc.getType()
7035                                     ->castAs<PackExpansionType>();
7036       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7037       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7038                                               Unexpanded);
7039       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7040 
7041       // Determine whether the set of unexpanded parameter packs can
7042       // and should be expanded.
7043       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7044       bool Expand = false;
7045       bool RetainExpansion = false;
7046       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7047       if (getDerived().TryExpandParameterPacks(
7048             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7049             Unexpanded, Expand, RetainExpansion, NumExpansions))
7050         return QualType();
7051 
7052       if (!Expand) {
7053         // We can't expand this pack expansion into separate arguments yet;
7054         // just substitute into the pattern and create a new pack expansion
7055         // type.
7056         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7057 
7058         TypeLocBuilder TypeArgBuilder;
7059         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7060         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7061                                                              PatternLoc);
7062         if (NewPatternType.isNull())
7063           return QualType();
7064 
7065         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7066                                       NewPatternType, NumExpansions);
7067         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7068         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7069         NewTypeArgInfos.push_back(
7070           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7071         continue;
7072       }
7073 
7074       // Substitute into the pack expansion pattern for each slice of the
7075       // pack.
7076       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7077         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7078 
7079         TypeLocBuilder TypeArgBuilder;
7080         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7081 
7082         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7083                                                          PatternLoc);
7084         if (NewTypeArg.isNull())
7085           return QualType();
7086 
7087         NewTypeArgInfos.push_back(
7088           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7089       }
7090 
7091       continue;
7092     }
7093 
7094     TypeLocBuilder TypeArgBuilder;
7095     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7096     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7097     if (NewTypeArg.isNull())
7098       return QualType();
7099 
7100     // If nothing changed, just keep the old TypeSourceInfo.
7101     if (NewTypeArg == TypeArg) {
7102       NewTypeArgInfos.push_back(TypeArgInfo);
7103       continue;
7104     }
7105 
7106     NewTypeArgInfos.push_back(
7107       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7108     AnyChanged = true;
7109   }
7110 
7111   QualType Result = TL.getType();
7112   if (getDerived().AlwaysRebuild() || AnyChanged) {
7113     // Rebuild the type.
7114     Result = getDerived().RebuildObjCObjectType(
7115         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7116         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7117         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7118         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7119 
7120     if (Result.isNull())
7121       return QualType();
7122   }
7123 
7124   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7125   NewT.setHasBaseTypeAsWritten(true);
7126   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7127   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7128     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7129   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7130   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7131   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7132     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7133   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7134   return Result;
7135 }
7136 
7137 template<typename Derived>
7138 QualType
TransformObjCObjectPointerType(TypeLocBuilder & TLB,ObjCObjectPointerTypeLoc TL)7139 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7140                                                ObjCObjectPointerTypeLoc TL) {
7141   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7142   if (PointeeType.isNull())
7143     return QualType();
7144 
7145   QualType Result = TL.getType();
7146   if (getDerived().AlwaysRebuild() ||
7147       PointeeType != TL.getPointeeLoc().getType()) {
7148     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7149                                                        TL.getStarLoc());
7150     if (Result.isNull())
7151       return QualType();
7152   }
7153 
7154   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7155   NewT.setStarLoc(TL.getStarLoc());
7156   return Result;
7157 }
7158 
7159 //===----------------------------------------------------------------------===//
7160 // Statement transformation
7161 //===----------------------------------------------------------------------===//
7162 template<typename Derived>
7163 StmtResult
TransformNullStmt(NullStmt * S)7164 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7165   return S;
7166 }
7167 
7168 template<typename Derived>
7169 StmtResult
TransformCompoundStmt(CompoundStmt * S)7170 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7171   return getDerived().TransformCompoundStmt(S, false);
7172 }
7173 
7174 template<typename Derived>
7175 StmtResult
TransformCompoundStmt(CompoundStmt * S,bool IsStmtExpr)7176 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7177                                               bool IsStmtExpr) {
7178   Sema::CompoundScopeRAII CompoundScope(getSema());
7179 
7180   const Stmt *ExprResult = S->getStmtExprResult();
7181   bool SubStmtInvalid = false;
7182   bool SubStmtChanged = false;
7183   SmallVector<Stmt*, 8> Statements;
7184   for (auto *B : S->body()) {
7185     StmtResult Result = getDerived().TransformStmt(
7186         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7187 
7188     if (Result.isInvalid()) {
7189       // Immediately fail if this was a DeclStmt, since it's very
7190       // likely that this will cause problems for future statements.
7191       if (isa<DeclStmt>(B))
7192         return StmtError();
7193 
7194       // Otherwise, just keep processing substatements and fail later.
7195       SubStmtInvalid = true;
7196       continue;
7197     }
7198 
7199     SubStmtChanged = SubStmtChanged || Result.get() != B;
7200     Statements.push_back(Result.getAs<Stmt>());
7201   }
7202 
7203   if (SubStmtInvalid)
7204     return StmtError();
7205 
7206   if (!getDerived().AlwaysRebuild() &&
7207       !SubStmtChanged)
7208     return S;
7209 
7210   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7211                                           Statements,
7212                                           S->getRBracLoc(),
7213                                           IsStmtExpr);
7214 }
7215 
7216 template<typename Derived>
7217 StmtResult
TransformCaseStmt(CaseStmt * S)7218 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7219   ExprResult LHS, RHS;
7220   {
7221     EnterExpressionEvaluationContext Unevaluated(
7222         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7223 
7224     // Transform the left-hand case value.
7225     LHS = getDerived().TransformExpr(S->getLHS());
7226     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7227     if (LHS.isInvalid())
7228       return StmtError();
7229 
7230     // Transform the right-hand case value (for the GNU case-range extension).
7231     RHS = getDerived().TransformExpr(S->getRHS());
7232     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7233     if (RHS.isInvalid())
7234       return StmtError();
7235   }
7236 
7237   // Build the case statement.
7238   // Case statements are always rebuilt so that they will attached to their
7239   // transformed switch statement.
7240   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7241                                                        LHS.get(),
7242                                                        S->getEllipsisLoc(),
7243                                                        RHS.get(),
7244                                                        S->getColonLoc());
7245   if (Case.isInvalid())
7246     return StmtError();
7247 
7248   // Transform the statement following the case
7249   StmtResult SubStmt =
7250       getDerived().TransformStmt(S->getSubStmt());
7251   if (SubStmt.isInvalid())
7252     return StmtError();
7253 
7254   // Attach the body to the case statement
7255   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7256 }
7257 
7258 template <typename Derived>
TransformDefaultStmt(DefaultStmt * S)7259 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7260   // Transform the statement following the default case
7261   StmtResult SubStmt =
7262       getDerived().TransformStmt(S->getSubStmt());
7263   if (SubStmt.isInvalid())
7264     return StmtError();
7265 
7266   // Default statements are always rebuilt
7267   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7268                                          SubStmt.get());
7269 }
7270 
7271 template<typename Derived>
7272 StmtResult
TransformLabelStmt(LabelStmt * S,StmtDiscardKind SDK)7273 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7274   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7275   if (SubStmt.isInvalid())
7276     return StmtError();
7277 
7278   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7279                                         S->getDecl());
7280   if (!LD)
7281     return StmtError();
7282 
7283   // If we're transforming "in-place" (we're not creating new local
7284   // declarations), assume we're replacing the old label statement
7285   // and clear out the reference to it.
7286   if (LD == S->getDecl())
7287     S->getDecl()->setStmt(nullptr);
7288 
7289   // FIXME: Pass the real colon location in.
7290   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7291                                        cast<LabelDecl>(LD), SourceLocation(),
7292                                        SubStmt.get());
7293 }
7294 
7295 template <typename Derived>
TransformAttr(const Attr * R)7296 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7297   if (!R)
7298     return R;
7299 
7300   switch (R->getKind()) {
7301 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7302 #define ATTR(X)
7303 #define PRAGMA_SPELLING_ATTR(X)                                                \
7304   case attr::X:                                                                \
7305     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7306 #include "clang/Basic/AttrList.inc"
7307   default:
7308     return R;
7309   }
7310 }
7311 
7312 template <typename Derived>
7313 StmtResult
TransformAttributedStmt(AttributedStmt * S,StmtDiscardKind SDK)7314 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7315                                                 StmtDiscardKind SDK) {
7316   bool AttrsChanged = false;
7317   SmallVector<const Attr *, 1> Attrs;
7318 
7319   // Visit attributes and keep track if any are transformed.
7320   for (const auto *I : S->getAttrs()) {
7321     const Attr *R = getDerived().TransformAttr(I);
7322     AttrsChanged |= (I != R);
7323     if (R)
7324       Attrs.push_back(R);
7325   }
7326 
7327   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7328   if (SubStmt.isInvalid())
7329     return StmtError();
7330 
7331   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7332     return S;
7333 
7334   // If transforming the attributes failed for all of the attributes in the
7335   // statement, don't make an AttributedStmt without attributes.
7336   if (Attrs.empty())
7337     return SubStmt;
7338 
7339   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7340                                             SubStmt.get());
7341 }
7342 
7343 template<typename Derived>
7344 StmtResult
TransformIfStmt(IfStmt * S)7345 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7346   // Transform the initialization statement
7347   StmtResult Init = getDerived().TransformStmt(S->getInit());
7348   if (Init.isInvalid())
7349     return StmtError();
7350 
7351   // Transform the condition
7352   Sema::ConditionResult Cond = getDerived().TransformCondition(
7353       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7354       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7355                        : Sema::ConditionKind::Boolean);
7356   if (Cond.isInvalid())
7357     return StmtError();
7358 
7359   // If this is a constexpr if, determine which arm we should instantiate.
7360   llvm::Optional<bool> ConstexprConditionValue;
7361   if (S->isConstexpr())
7362     ConstexprConditionValue = Cond.getKnownValue();
7363 
7364   // Transform the "then" branch.
7365   StmtResult Then;
7366   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7367     Then = getDerived().TransformStmt(S->getThen());
7368     if (Then.isInvalid())
7369       return StmtError();
7370   } else {
7371     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7372   }
7373 
7374   // Transform the "else" branch.
7375   StmtResult Else;
7376   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7377     Else = getDerived().TransformStmt(S->getElse());
7378     if (Else.isInvalid())
7379       return StmtError();
7380   }
7381 
7382   if (!getDerived().AlwaysRebuild() &&
7383       Init.get() == S->getInit() &&
7384       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7385       Then.get() == S->getThen() &&
7386       Else.get() == S->getElse())
7387     return S;
7388 
7389   return getDerived().RebuildIfStmt(
7390       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7391       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7392 }
7393 
7394 template<typename Derived>
7395 StmtResult
TransformSwitchStmt(SwitchStmt * S)7396 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7397   // Transform the initialization statement
7398   StmtResult Init = getDerived().TransformStmt(S->getInit());
7399   if (Init.isInvalid())
7400     return StmtError();
7401 
7402   // Transform the condition.
7403   Sema::ConditionResult Cond = getDerived().TransformCondition(
7404       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7405       Sema::ConditionKind::Switch);
7406   if (Cond.isInvalid())
7407     return StmtError();
7408 
7409   // Rebuild the switch statement.
7410   StmtResult Switch =
7411       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7412                                           Init.get(), Cond, S->getRParenLoc());
7413   if (Switch.isInvalid())
7414     return StmtError();
7415 
7416   // Transform the body of the switch statement.
7417   StmtResult Body = getDerived().TransformStmt(S->getBody());
7418   if (Body.isInvalid())
7419     return StmtError();
7420 
7421   // Complete the switch statement.
7422   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7423                                             Body.get());
7424 }
7425 
7426 template<typename Derived>
7427 StmtResult
TransformWhileStmt(WhileStmt * S)7428 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7429   // Transform the condition
7430   Sema::ConditionResult Cond = getDerived().TransformCondition(
7431       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7432       Sema::ConditionKind::Boolean);
7433   if (Cond.isInvalid())
7434     return StmtError();
7435 
7436   // Transform the body
7437   StmtResult Body = getDerived().TransformStmt(S->getBody());
7438   if (Body.isInvalid())
7439     return StmtError();
7440 
7441   if (!getDerived().AlwaysRebuild() &&
7442       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7443       Body.get() == S->getBody())
7444     return Owned(S);
7445 
7446   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7447                                        Cond, S->getRParenLoc(), Body.get());
7448 }
7449 
7450 template<typename Derived>
7451 StmtResult
TransformDoStmt(DoStmt * S)7452 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7453   // Transform the body
7454   StmtResult Body = getDerived().TransformStmt(S->getBody());
7455   if (Body.isInvalid())
7456     return StmtError();
7457 
7458   // Transform the condition
7459   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7460   if (Cond.isInvalid())
7461     return StmtError();
7462 
7463   if (!getDerived().AlwaysRebuild() &&
7464       Cond.get() == S->getCond() &&
7465       Body.get() == S->getBody())
7466     return S;
7467 
7468   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7469                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7470                                     S->getRParenLoc());
7471 }
7472 
7473 template<typename Derived>
7474 StmtResult
TransformForStmt(ForStmt * S)7475 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7476   if (getSema().getLangOpts().OpenMP)
7477     getSema().startOpenMPLoop();
7478 
7479   // Transform the initialization statement
7480   StmtResult Init = getDerived().TransformStmt(S->getInit());
7481   if (Init.isInvalid())
7482     return StmtError();
7483 
7484   // In OpenMP loop region loop control variable must be captured and be
7485   // private. Perform analysis of first part (if any).
7486   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7487     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7488 
7489   // Transform the condition
7490   Sema::ConditionResult Cond = getDerived().TransformCondition(
7491       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7492       Sema::ConditionKind::Boolean);
7493   if (Cond.isInvalid())
7494     return StmtError();
7495 
7496   // Transform the increment
7497   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7498   if (Inc.isInvalid())
7499     return StmtError();
7500 
7501   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7502   if (S->getInc() && !FullInc.get())
7503     return StmtError();
7504 
7505   // Transform the body
7506   StmtResult Body = getDerived().TransformStmt(S->getBody());
7507   if (Body.isInvalid())
7508     return StmtError();
7509 
7510   if (!getDerived().AlwaysRebuild() &&
7511       Init.get() == S->getInit() &&
7512       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7513       Inc.get() == S->getInc() &&
7514       Body.get() == S->getBody())
7515     return S;
7516 
7517   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7518                                      Init.get(), Cond, FullInc,
7519                                      S->getRParenLoc(), Body.get());
7520 }
7521 
7522 template<typename Derived>
7523 StmtResult
TransformGotoStmt(GotoStmt * S)7524 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7525   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7526                                         S->getLabel());
7527   if (!LD)
7528     return StmtError();
7529 
7530   // Goto statements must always be rebuilt, to resolve the label.
7531   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7532                                       cast<LabelDecl>(LD));
7533 }
7534 
7535 template<typename Derived>
7536 StmtResult
TransformIndirectGotoStmt(IndirectGotoStmt * S)7537 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7538   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7539   if (Target.isInvalid())
7540     return StmtError();
7541   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7542 
7543   if (!getDerived().AlwaysRebuild() &&
7544       Target.get() == S->getTarget())
7545     return S;
7546 
7547   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7548                                               Target.get());
7549 }
7550 
7551 template<typename Derived>
7552 StmtResult
TransformContinueStmt(ContinueStmt * S)7553 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7554   return S;
7555 }
7556 
7557 template<typename Derived>
7558 StmtResult
TransformBreakStmt(BreakStmt * S)7559 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7560   return S;
7561 }
7562 
7563 template<typename Derived>
7564 StmtResult
TransformReturnStmt(ReturnStmt * S)7565 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7566   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7567                                                         /*NotCopyInit*/false);
7568   if (Result.isInvalid())
7569     return StmtError();
7570 
7571   // FIXME: We always rebuild the return statement because there is no way
7572   // to tell whether the return type of the function has changed.
7573   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7574 }
7575 
7576 template<typename Derived>
7577 StmtResult
TransformDeclStmt(DeclStmt * S)7578 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7579   bool DeclChanged = false;
7580   SmallVector<Decl *, 4> Decls;
7581   for (auto *D : S->decls()) {
7582     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7583     if (!Transformed)
7584       return StmtError();
7585 
7586     if (Transformed != D)
7587       DeclChanged = true;
7588 
7589     Decls.push_back(Transformed);
7590   }
7591 
7592   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7593     return S;
7594 
7595   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7596 }
7597 
7598 template<typename Derived>
7599 StmtResult
TransformGCCAsmStmt(GCCAsmStmt * S)7600 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7601 
7602   SmallVector<Expr*, 8> Constraints;
7603   SmallVector<Expr*, 8> Exprs;
7604   SmallVector<IdentifierInfo *, 4> Names;
7605 
7606   ExprResult AsmString;
7607   SmallVector<Expr*, 8> Clobbers;
7608 
7609   bool ExprsChanged = false;
7610 
7611   // Go through the outputs.
7612   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7613     Names.push_back(S->getOutputIdentifier(I));
7614 
7615     // No need to transform the constraint literal.
7616     Constraints.push_back(S->getOutputConstraintLiteral(I));
7617 
7618     // Transform the output expr.
7619     Expr *OutputExpr = S->getOutputExpr(I);
7620     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7621     if (Result.isInvalid())
7622       return StmtError();
7623 
7624     ExprsChanged |= Result.get() != OutputExpr;
7625 
7626     Exprs.push_back(Result.get());
7627   }
7628 
7629   // Go through the inputs.
7630   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7631     Names.push_back(S->getInputIdentifier(I));
7632 
7633     // No need to transform the constraint literal.
7634     Constraints.push_back(S->getInputConstraintLiteral(I));
7635 
7636     // Transform the input expr.
7637     Expr *InputExpr = S->getInputExpr(I);
7638     ExprResult Result = getDerived().TransformExpr(InputExpr);
7639     if (Result.isInvalid())
7640       return StmtError();
7641 
7642     ExprsChanged |= Result.get() != InputExpr;
7643 
7644     Exprs.push_back(Result.get());
7645   }
7646 
7647   // Go through the Labels.
7648   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7649     Names.push_back(S->getLabelIdentifier(I));
7650 
7651     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7652     if (Result.isInvalid())
7653       return StmtError();
7654     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7655     Exprs.push_back(Result.get());
7656   }
7657   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7658     return S;
7659 
7660   // Go through the clobbers.
7661   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7662     Clobbers.push_back(S->getClobberStringLiteral(I));
7663 
7664   // No need to transform the asm string literal.
7665   AsmString = S->getAsmString();
7666   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7667                                         S->isVolatile(), S->getNumOutputs(),
7668                                         S->getNumInputs(), Names.data(),
7669                                         Constraints, Exprs, AsmString.get(),
7670                                         Clobbers, S->getNumLabels(),
7671                                         S->getRParenLoc());
7672 }
7673 
7674 template<typename Derived>
7675 StmtResult
TransformMSAsmStmt(MSAsmStmt * S)7676 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7677   ArrayRef<Token> AsmToks =
7678     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7679 
7680   bool HadError = false, HadChange = false;
7681 
7682   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7683   SmallVector<Expr*, 8> TransformedExprs;
7684   TransformedExprs.reserve(SrcExprs.size());
7685   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7686     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7687     if (!Result.isUsable()) {
7688       HadError = true;
7689     } else {
7690       HadChange |= (Result.get() != SrcExprs[i]);
7691       TransformedExprs.push_back(Result.get());
7692     }
7693   }
7694 
7695   if (HadError) return StmtError();
7696   if (!HadChange && !getDerived().AlwaysRebuild())
7697     return Owned(S);
7698 
7699   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7700                                        AsmToks, S->getAsmString(),
7701                                        S->getNumOutputs(), S->getNumInputs(),
7702                                        S->getAllConstraints(), S->getClobbers(),
7703                                        TransformedExprs, S->getEndLoc());
7704 }
7705 
7706 // C++ Coroutines TS
7707 
7708 template<typename Derived>
7709 StmtResult
TransformCoroutineBodyStmt(CoroutineBodyStmt * S)7710 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7711   auto *ScopeInfo = SemaRef.getCurFunction();
7712   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7713   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7714          ScopeInfo->NeedsCoroutineSuspends &&
7715          ScopeInfo->CoroutineSuspends.first == nullptr &&
7716          ScopeInfo->CoroutineSuspends.second == nullptr &&
7717          "expected clean scope info");
7718 
7719   // Set that we have (possibly-invalid) suspend points before we do anything
7720   // that may fail.
7721   ScopeInfo->setNeedsCoroutineSuspends(false);
7722 
7723   // We re-build the coroutine promise object (and the coroutine parameters its
7724   // type and constructor depend on) based on the types used in our current
7725   // function. We must do so, and set it on the current FunctionScopeInfo,
7726   // before attempting to transform the other parts of the coroutine body
7727   // statement, such as the implicit suspend statements (because those
7728   // statements reference the FunctionScopeInfo::CoroutinePromise).
7729   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7730     return StmtError();
7731   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7732   if (!Promise)
7733     return StmtError();
7734   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7735   ScopeInfo->CoroutinePromise = Promise;
7736 
7737   // Transform the implicit coroutine statements constructed using dependent
7738   // types during the previous parse: initial and final suspensions, the return
7739   // object, and others. We also transform the coroutine function's body.
7740   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7741   if (InitSuspend.isInvalid())
7742     return StmtError();
7743   StmtResult FinalSuspend =
7744       getDerived().TransformStmt(S->getFinalSuspendStmt());
7745   if (FinalSuspend.isInvalid() ||
7746       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7747     return StmtError();
7748   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7749   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7750 
7751   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7752   if (BodyRes.isInvalid())
7753     return StmtError();
7754 
7755   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7756   if (Builder.isInvalid())
7757     return StmtError();
7758 
7759   Expr *ReturnObject = S->getReturnValueInit();
7760   assert(ReturnObject && "the return object is expected to be valid");
7761   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7762                                                      /*NoCopyInit*/ false);
7763   if (Res.isInvalid())
7764     return StmtError();
7765   Builder.ReturnValue = Res.get();
7766 
7767   // If during the previous parse the coroutine still had a dependent promise
7768   // statement, we may need to build some implicit coroutine statements
7769   // (such as exception and fallthrough handlers) for the first time.
7770   if (S->hasDependentPromiseType()) {
7771     // We can only build these statements, however, if the current promise type
7772     // is not dependent.
7773     if (!Promise->getType()->isDependentType()) {
7774       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7775              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7776              "these nodes should not have been built yet");
7777       if (!Builder.buildDependentStatements())
7778         return StmtError();
7779     }
7780   } else {
7781     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7782       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7783       if (Res.isInvalid())
7784         return StmtError();
7785       Builder.OnFallthrough = Res.get();
7786     }
7787 
7788     if (auto *OnException = S->getExceptionHandler()) {
7789       StmtResult Res = getDerived().TransformStmt(OnException);
7790       if (Res.isInvalid())
7791         return StmtError();
7792       Builder.OnException = Res.get();
7793     }
7794 
7795     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7796       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7797       if (Res.isInvalid())
7798         return StmtError();
7799       Builder.ReturnStmtOnAllocFailure = Res.get();
7800     }
7801 
7802     // Transform any additional statements we may have already built
7803     assert(S->getAllocate() && S->getDeallocate() &&
7804            "allocation and deallocation calls must already be built");
7805     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7806     if (AllocRes.isInvalid())
7807       return StmtError();
7808     Builder.Allocate = AllocRes.get();
7809 
7810     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7811     if (DeallocRes.isInvalid())
7812       return StmtError();
7813     Builder.Deallocate = DeallocRes.get();
7814 
7815     assert(S->getResultDecl() && "ResultDecl must already be built");
7816     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7817     if (ResultDecl.isInvalid())
7818       return StmtError();
7819     Builder.ResultDecl = ResultDecl.get();
7820 
7821     if (auto *ReturnStmt = S->getReturnStmt()) {
7822       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7823       if (Res.isInvalid())
7824         return StmtError();
7825       Builder.ReturnStmt = Res.get();
7826     }
7827   }
7828 
7829   return getDerived().RebuildCoroutineBodyStmt(Builder);
7830 }
7831 
7832 template<typename Derived>
7833 StmtResult
TransformCoreturnStmt(CoreturnStmt * S)7834 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7835   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7836                                                         /*NotCopyInit*/false);
7837   if (Result.isInvalid())
7838     return StmtError();
7839 
7840   // Always rebuild; we don't know if this needs to be injected into a new
7841   // context or if the promise type has changed.
7842   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7843                                           S->isImplicit());
7844 }
7845 
7846 template<typename Derived>
7847 ExprResult
TransformCoawaitExpr(CoawaitExpr * E)7848 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7849   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7850                                                         /*NotCopyInit*/false);
7851   if (Result.isInvalid())
7852     return ExprError();
7853 
7854   // Always rebuild; we don't know if this needs to be injected into a new
7855   // context or if the promise type has changed.
7856   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7857                                          E->isImplicit());
7858 }
7859 
7860 template <typename Derived>
7861 ExprResult
TransformDependentCoawaitExpr(DependentCoawaitExpr * E)7862 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7863   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7864                                                         /*NotCopyInit*/ false);
7865   if (OperandResult.isInvalid())
7866     return ExprError();
7867 
7868   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7869           E->getOperatorCoawaitLookup());
7870 
7871   if (LookupResult.isInvalid())
7872     return ExprError();
7873 
7874   // Always rebuild; we don't know if this needs to be injected into a new
7875   // context or if the promise type has changed.
7876   return getDerived().RebuildDependentCoawaitExpr(
7877       E->getKeywordLoc(), OperandResult.get(),
7878       cast<UnresolvedLookupExpr>(LookupResult.get()));
7879 }
7880 
7881 template<typename Derived>
7882 ExprResult
TransformCoyieldExpr(CoyieldExpr * E)7883 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7884   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7885                                                         /*NotCopyInit*/false);
7886   if (Result.isInvalid())
7887     return ExprError();
7888 
7889   // Always rebuild; we don't know if this needs to be injected into a new
7890   // context or if the promise type has changed.
7891   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7892 }
7893 
7894 // Objective-C Statements.
7895 
7896 template<typename Derived>
7897 StmtResult
TransformObjCAtTryStmt(ObjCAtTryStmt * S)7898 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7899   // Transform the body of the @try.
7900   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7901   if (TryBody.isInvalid())
7902     return StmtError();
7903 
7904   // Transform the @catch statements (if present).
7905   bool AnyCatchChanged = false;
7906   SmallVector<Stmt*, 8> CatchStmts;
7907   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7908     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7909     if (Catch.isInvalid())
7910       return StmtError();
7911     if (Catch.get() != S->getCatchStmt(I))
7912       AnyCatchChanged = true;
7913     CatchStmts.push_back(Catch.get());
7914   }
7915 
7916   // Transform the @finally statement (if present).
7917   StmtResult Finally;
7918   if (S->getFinallyStmt()) {
7919     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7920     if (Finally.isInvalid())
7921       return StmtError();
7922   }
7923 
7924   // If nothing changed, just retain this statement.
7925   if (!getDerived().AlwaysRebuild() &&
7926       TryBody.get() == S->getTryBody() &&
7927       !AnyCatchChanged &&
7928       Finally.get() == S->getFinallyStmt())
7929     return S;
7930 
7931   // Build a new statement.
7932   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7933                                            CatchStmts, Finally.get());
7934 }
7935 
7936 template<typename Derived>
7937 StmtResult
TransformObjCAtCatchStmt(ObjCAtCatchStmt * S)7938 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7939   // Transform the @catch parameter, if there is one.
7940   VarDecl *Var = nullptr;
7941   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7942     TypeSourceInfo *TSInfo = nullptr;
7943     if (FromVar->getTypeSourceInfo()) {
7944       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7945       if (!TSInfo)
7946         return StmtError();
7947     }
7948 
7949     QualType T;
7950     if (TSInfo)
7951       T = TSInfo->getType();
7952     else {
7953       T = getDerived().TransformType(FromVar->getType());
7954       if (T.isNull())
7955         return StmtError();
7956     }
7957 
7958     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7959     if (!Var)
7960       return StmtError();
7961   }
7962 
7963   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7964   if (Body.isInvalid())
7965     return StmtError();
7966 
7967   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7968                                              S->getRParenLoc(),
7969                                              Var, Body.get());
7970 }
7971 
7972 template<typename Derived>
7973 StmtResult
TransformObjCAtFinallyStmt(ObjCAtFinallyStmt * S)7974 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7975   // Transform the body.
7976   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7977   if (Body.isInvalid())
7978     return StmtError();
7979 
7980   // If nothing changed, just retain this statement.
7981   if (!getDerived().AlwaysRebuild() &&
7982       Body.get() == S->getFinallyBody())
7983     return S;
7984 
7985   // Build a new statement.
7986   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7987                                                Body.get());
7988 }
7989 
7990 template<typename Derived>
7991 StmtResult
TransformObjCAtThrowStmt(ObjCAtThrowStmt * S)7992 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7993   ExprResult Operand;
7994   if (S->getThrowExpr()) {
7995     Operand = getDerived().TransformExpr(S->getThrowExpr());
7996     if (Operand.isInvalid())
7997       return StmtError();
7998   }
7999 
8000   if (!getDerived().AlwaysRebuild() &&
8001       Operand.get() == S->getThrowExpr())
8002     return S;
8003 
8004   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8005 }
8006 
8007 template<typename Derived>
8008 StmtResult
TransformObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)8009 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8010                                                   ObjCAtSynchronizedStmt *S) {
8011   // Transform the object we are locking.
8012   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8013   if (Object.isInvalid())
8014     return StmtError();
8015   Object =
8016     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8017                                                   Object.get());
8018   if (Object.isInvalid())
8019     return StmtError();
8020 
8021   // Transform the body.
8022   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8023   if (Body.isInvalid())
8024     return StmtError();
8025 
8026   // If nothing change, just retain the current statement.
8027   if (!getDerived().AlwaysRebuild() &&
8028       Object.get() == S->getSynchExpr() &&
8029       Body.get() == S->getSynchBody())
8030     return S;
8031 
8032   // Build a new statement.
8033   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8034                                                     Object.get(), Body.get());
8035 }
8036 
8037 template<typename Derived>
8038 StmtResult
TransformObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)8039 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8040                                               ObjCAutoreleasePoolStmt *S) {
8041   // Transform the body.
8042   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8043   if (Body.isInvalid())
8044     return StmtError();
8045 
8046   // If nothing changed, just retain this statement.
8047   if (!getDerived().AlwaysRebuild() &&
8048       Body.get() == S->getSubStmt())
8049     return S;
8050 
8051   // Build a new statement.
8052   return getDerived().RebuildObjCAutoreleasePoolStmt(
8053                         S->getAtLoc(), Body.get());
8054 }
8055 
8056 template<typename Derived>
8057 StmtResult
TransformObjCForCollectionStmt(ObjCForCollectionStmt * S)8058 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8059                                                   ObjCForCollectionStmt *S) {
8060   // Transform the element statement.
8061   StmtResult Element =
8062       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8063   if (Element.isInvalid())
8064     return StmtError();
8065 
8066   // Transform the collection expression.
8067   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8068   if (Collection.isInvalid())
8069     return StmtError();
8070 
8071   // Transform the body.
8072   StmtResult Body = getDerived().TransformStmt(S->getBody());
8073   if (Body.isInvalid())
8074     return StmtError();
8075 
8076   // If nothing changed, just retain this statement.
8077   if (!getDerived().AlwaysRebuild() &&
8078       Element.get() == S->getElement() &&
8079       Collection.get() == S->getCollection() &&
8080       Body.get() == S->getBody())
8081     return S;
8082 
8083   // Build a new statement.
8084   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8085                                                    Element.get(),
8086                                                    Collection.get(),
8087                                                    S->getRParenLoc(),
8088                                                    Body.get());
8089 }
8090 
8091 template <typename Derived>
TransformCXXCatchStmt(CXXCatchStmt * S)8092 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8093   // Transform the exception declaration, if any.
8094   VarDecl *Var = nullptr;
8095   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8096     TypeSourceInfo *T =
8097         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8098     if (!T)
8099       return StmtError();
8100 
8101     Var = getDerived().RebuildExceptionDecl(
8102         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8103         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8104     if (!Var || Var->isInvalidDecl())
8105       return StmtError();
8106   }
8107 
8108   // Transform the actual exception handler.
8109   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8110   if (Handler.isInvalid())
8111     return StmtError();
8112 
8113   if (!getDerived().AlwaysRebuild() && !Var &&
8114       Handler.get() == S->getHandlerBlock())
8115     return S;
8116 
8117   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8118 }
8119 
8120 template <typename Derived>
TransformCXXTryStmt(CXXTryStmt * S)8121 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8122   // Transform the try block itself.
8123   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8124   if (TryBlock.isInvalid())
8125     return StmtError();
8126 
8127   // Transform the handlers.
8128   bool HandlerChanged = false;
8129   SmallVector<Stmt *, 8> Handlers;
8130   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8131     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8132     if (Handler.isInvalid())
8133       return StmtError();
8134 
8135     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8136     Handlers.push_back(Handler.getAs<Stmt>());
8137   }
8138 
8139   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8140       !HandlerChanged)
8141     return S;
8142 
8143   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8144                                         Handlers);
8145 }
8146 
8147 template<typename Derived>
8148 StmtResult
TransformCXXForRangeStmt(CXXForRangeStmt * S)8149 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8150   StmtResult Init =
8151       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8152   if (Init.isInvalid())
8153     return StmtError();
8154 
8155   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8156   if (Range.isInvalid())
8157     return StmtError();
8158 
8159   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8160   if (Begin.isInvalid())
8161     return StmtError();
8162   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8163   if (End.isInvalid())
8164     return StmtError();
8165 
8166   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8167   if (Cond.isInvalid())
8168     return StmtError();
8169   if (Cond.get())
8170     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8171   if (Cond.isInvalid())
8172     return StmtError();
8173   if (Cond.get())
8174     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8175 
8176   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8177   if (Inc.isInvalid())
8178     return StmtError();
8179   if (Inc.get())
8180     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8181 
8182   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8183   if (LoopVar.isInvalid())
8184     return StmtError();
8185 
8186   StmtResult NewStmt = S;
8187   if (getDerived().AlwaysRebuild() ||
8188       Init.get() != S->getInit() ||
8189       Range.get() != S->getRangeStmt() ||
8190       Begin.get() != S->getBeginStmt() ||
8191       End.get() != S->getEndStmt() ||
8192       Cond.get() != S->getCond() ||
8193       Inc.get() != S->getInc() ||
8194       LoopVar.get() != S->getLoopVarStmt()) {
8195     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8196                                                   S->getCoawaitLoc(), Init.get(),
8197                                                   S->getColonLoc(), Range.get(),
8198                                                   Begin.get(), End.get(),
8199                                                   Cond.get(),
8200                                                   Inc.get(), LoopVar.get(),
8201                                                   S->getRParenLoc());
8202     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8203       // Might not have attached any initializer to the loop variable.
8204       getSema().ActOnInitializerError(
8205           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8206       return StmtError();
8207     }
8208   }
8209 
8210   StmtResult Body = getDerived().TransformStmt(S->getBody());
8211   if (Body.isInvalid())
8212     return StmtError();
8213 
8214   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8215   // it now so we have a new statement to attach the body to.
8216   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8217     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8218                                                   S->getCoawaitLoc(), Init.get(),
8219                                                   S->getColonLoc(), Range.get(),
8220                                                   Begin.get(), End.get(),
8221                                                   Cond.get(),
8222                                                   Inc.get(), LoopVar.get(),
8223                                                   S->getRParenLoc());
8224     if (NewStmt.isInvalid())
8225       return StmtError();
8226   }
8227 
8228   if (NewStmt.get() == S)
8229     return S;
8230 
8231   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8232 }
8233 
8234 template<typename Derived>
8235 StmtResult
TransformMSDependentExistsStmt(MSDependentExistsStmt * S)8236 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8237                                                     MSDependentExistsStmt *S) {
8238   // Transform the nested-name-specifier, if any.
8239   NestedNameSpecifierLoc QualifierLoc;
8240   if (S->getQualifierLoc()) {
8241     QualifierLoc
8242       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8243     if (!QualifierLoc)
8244       return StmtError();
8245   }
8246 
8247   // Transform the declaration name.
8248   DeclarationNameInfo NameInfo = S->getNameInfo();
8249   if (NameInfo.getName()) {
8250     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8251     if (!NameInfo.getName())
8252       return StmtError();
8253   }
8254 
8255   // Check whether anything changed.
8256   if (!getDerived().AlwaysRebuild() &&
8257       QualifierLoc == S->getQualifierLoc() &&
8258       NameInfo.getName() == S->getNameInfo().getName())
8259     return S;
8260 
8261   // Determine whether this name exists, if we can.
8262   CXXScopeSpec SS;
8263   SS.Adopt(QualifierLoc);
8264   bool Dependent = false;
8265   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8266   case Sema::IER_Exists:
8267     if (S->isIfExists())
8268       break;
8269 
8270     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8271 
8272   case Sema::IER_DoesNotExist:
8273     if (S->isIfNotExists())
8274       break;
8275 
8276     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8277 
8278   case Sema::IER_Dependent:
8279     Dependent = true;
8280     break;
8281 
8282   case Sema::IER_Error:
8283     return StmtError();
8284   }
8285 
8286   // We need to continue with the instantiation, so do so now.
8287   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8288   if (SubStmt.isInvalid())
8289     return StmtError();
8290 
8291   // If we have resolved the name, just transform to the substatement.
8292   if (!Dependent)
8293     return SubStmt;
8294 
8295   // The name is still dependent, so build a dependent expression again.
8296   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8297                                                    S->isIfExists(),
8298                                                    QualifierLoc,
8299                                                    NameInfo,
8300                                                    SubStmt.get());
8301 }
8302 
8303 template<typename Derived>
8304 ExprResult
TransformMSPropertyRefExpr(MSPropertyRefExpr * E)8305 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8306   NestedNameSpecifierLoc QualifierLoc;
8307   if (E->getQualifierLoc()) {
8308     QualifierLoc
8309     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8310     if (!QualifierLoc)
8311       return ExprError();
8312   }
8313 
8314   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8315     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8316   if (!PD)
8317     return ExprError();
8318 
8319   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8320   if (Base.isInvalid())
8321     return ExprError();
8322 
8323   return new (SemaRef.getASTContext())
8324       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8325                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8326                         QualifierLoc, E->getMemberLoc());
8327 }
8328 
8329 template <typename Derived>
TransformMSPropertySubscriptExpr(MSPropertySubscriptExpr * E)8330 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8331     MSPropertySubscriptExpr *E) {
8332   auto BaseRes = getDerived().TransformExpr(E->getBase());
8333   if (BaseRes.isInvalid())
8334     return ExprError();
8335   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8336   if (IdxRes.isInvalid())
8337     return ExprError();
8338 
8339   if (!getDerived().AlwaysRebuild() &&
8340       BaseRes.get() == E->getBase() &&
8341       IdxRes.get() == E->getIdx())
8342     return E;
8343 
8344   return getDerived().RebuildArraySubscriptExpr(
8345       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8346 }
8347 
8348 template <typename Derived>
TransformSEHTryStmt(SEHTryStmt * S)8349 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8350   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8351   if (TryBlock.isInvalid())
8352     return StmtError();
8353 
8354   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8355   if (Handler.isInvalid())
8356     return StmtError();
8357 
8358   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8359       Handler.get() == S->getHandler())
8360     return S;
8361 
8362   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8363                                         TryBlock.get(), Handler.get());
8364 }
8365 
8366 template <typename Derived>
TransformSEHFinallyStmt(SEHFinallyStmt * S)8367 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8368   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8369   if (Block.isInvalid())
8370     return StmtError();
8371 
8372   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8373 }
8374 
8375 template <typename Derived>
TransformSEHExceptStmt(SEHExceptStmt * S)8376 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8377   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8378   if (FilterExpr.isInvalid())
8379     return StmtError();
8380 
8381   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8382   if (Block.isInvalid())
8383     return StmtError();
8384 
8385   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8386                                            Block.get());
8387 }
8388 
8389 template <typename Derived>
TransformSEHHandler(Stmt * Handler)8390 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8391   if (isa<SEHFinallyStmt>(Handler))
8392     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8393   else
8394     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8395 }
8396 
8397 template<typename Derived>
8398 StmtResult
TransformSEHLeaveStmt(SEHLeaveStmt * S)8399 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8400   return S;
8401 }
8402 
8403 //===----------------------------------------------------------------------===//
8404 // OpenMP directive transformation
8405 //===----------------------------------------------------------------------===//
8406 
8407 template <typename Derived>
8408 StmtResult
TransformOMPCanonicalLoop(OMPCanonicalLoop * L)8409 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8410   // OMPCanonicalLoops are eliminated during transformation, since they will be
8411   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8412   // after transformation.
8413   return getDerived().TransformStmt(L->getLoopStmt());
8414 }
8415 
8416 template <typename Derived>
TransformOMPExecutableDirective(OMPExecutableDirective * D)8417 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8418     OMPExecutableDirective *D) {
8419 
8420   // Transform the clauses
8421   llvm::SmallVector<OMPClause *, 16> TClauses;
8422   ArrayRef<OMPClause *> Clauses = D->clauses();
8423   TClauses.reserve(Clauses.size());
8424   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8425        I != E; ++I) {
8426     if (*I) {
8427       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8428       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8429       getDerived().getSema().EndOpenMPClause();
8430       if (Clause)
8431         TClauses.push_back(Clause);
8432     } else {
8433       TClauses.push_back(nullptr);
8434     }
8435   }
8436   StmtResult AssociatedStmt;
8437   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8438     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8439                                                   /*CurScope=*/nullptr);
8440     StmtResult Body;
8441     {
8442       Sema::CompoundScopeRAII CompoundScope(getSema());
8443       Stmt *CS;
8444       if (D->getDirectiveKind() == OMPD_atomic ||
8445           D->getDirectiveKind() == OMPD_critical ||
8446           D->getDirectiveKind() == OMPD_section ||
8447           D->getDirectiveKind() == OMPD_master)
8448         CS = D->getAssociatedStmt();
8449       else
8450         CS = D->getRawStmt();
8451       Body = getDerived().TransformStmt(CS);
8452       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8453           getSema().getLangOpts().OpenMPIRBuilder)
8454         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8455     }
8456     AssociatedStmt =
8457         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8458     if (AssociatedStmt.isInvalid()) {
8459       return StmtError();
8460     }
8461   }
8462   if (TClauses.size() != Clauses.size()) {
8463     return StmtError();
8464   }
8465 
8466   // Transform directive name for 'omp critical' directive.
8467   DeclarationNameInfo DirName;
8468   if (D->getDirectiveKind() == OMPD_critical) {
8469     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8470     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8471   }
8472   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8473   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8474     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8475   } else if (D->getDirectiveKind() == OMPD_cancel) {
8476     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8477   }
8478 
8479   return getDerived().RebuildOMPExecutableDirective(
8480       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8481       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8482 }
8483 
8484 template <typename Derived>
8485 StmtResult
TransformOMPParallelDirective(OMPParallelDirective * D)8486 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8487   DeclarationNameInfo DirName;
8488   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8489                                              D->getBeginLoc());
8490   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8491   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8492   return Res;
8493 }
8494 
8495 template <typename Derived>
8496 StmtResult
TransformOMPSimdDirective(OMPSimdDirective * D)8497 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8498   DeclarationNameInfo DirName;
8499   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8500                                              D->getBeginLoc());
8501   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8502   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8503   return Res;
8504 }
8505 
8506 template <typename Derived>
8507 StmtResult
TransformOMPTileDirective(OMPTileDirective * D)8508 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8509   DeclarationNameInfo DirName;
8510   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8511                                              nullptr, D->getBeginLoc());
8512   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8513   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8514   return Res;
8515 }
8516 
8517 template <typename Derived>
8518 StmtResult
TransformOMPForDirective(OMPForDirective * D)8519 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8520   DeclarationNameInfo DirName;
8521   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8522                                              D->getBeginLoc());
8523   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8524   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8525   return Res;
8526 }
8527 
8528 template <typename Derived>
8529 StmtResult
TransformOMPForSimdDirective(OMPForSimdDirective * D)8530 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8531   DeclarationNameInfo DirName;
8532   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8533                                              D->getBeginLoc());
8534   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8535   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8536   return Res;
8537 }
8538 
8539 template <typename Derived>
8540 StmtResult
TransformOMPSectionsDirective(OMPSectionsDirective * D)8541 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8542   DeclarationNameInfo DirName;
8543   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8544                                              D->getBeginLoc());
8545   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8546   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8547   return Res;
8548 }
8549 
8550 template <typename Derived>
8551 StmtResult
TransformOMPSectionDirective(OMPSectionDirective * D)8552 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8553   DeclarationNameInfo DirName;
8554   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8555                                              D->getBeginLoc());
8556   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8557   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8558   return Res;
8559 }
8560 
8561 template <typename Derived>
8562 StmtResult
TransformOMPSingleDirective(OMPSingleDirective * D)8563 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8564   DeclarationNameInfo DirName;
8565   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8566                                              D->getBeginLoc());
8567   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8568   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8569   return Res;
8570 }
8571 
8572 template <typename Derived>
8573 StmtResult
TransformOMPMasterDirective(OMPMasterDirective * D)8574 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8575   DeclarationNameInfo DirName;
8576   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8577                                              D->getBeginLoc());
8578   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8579   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8580   return Res;
8581 }
8582 
8583 template <typename Derived>
8584 StmtResult
TransformOMPCriticalDirective(OMPCriticalDirective * D)8585 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8586   getDerived().getSema().StartOpenMPDSABlock(
8587       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8588   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8589   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8590   return Res;
8591 }
8592 
8593 template <typename Derived>
TransformOMPParallelForDirective(OMPParallelForDirective * D)8594 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8595     OMPParallelForDirective *D) {
8596   DeclarationNameInfo DirName;
8597   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8598                                              nullptr, D->getBeginLoc());
8599   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8600   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8601   return Res;
8602 }
8603 
8604 template <typename Derived>
TransformOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)8605 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8606     OMPParallelForSimdDirective *D) {
8607   DeclarationNameInfo DirName;
8608   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8609                                              nullptr, D->getBeginLoc());
8610   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8611   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8612   return Res;
8613 }
8614 
8615 template <typename Derived>
TransformOMPParallelMasterDirective(OMPParallelMasterDirective * D)8616 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8617     OMPParallelMasterDirective *D) {
8618   DeclarationNameInfo DirName;
8619   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8620                                              nullptr, D->getBeginLoc());
8621   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8622   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8623   return Res;
8624 }
8625 
8626 template <typename Derived>
TransformOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)8627 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8628     OMPParallelSectionsDirective *D) {
8629   DeclarationNameInfo DirName;
8630   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8631                                              nullptr, D->getBeginLoc());
8632   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8633   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8634   return Res;
8635 }
8636 
8637 template <typename Derived>
8638 StmtResult
TransformOMPTaskDirective(OMPTaskDirective * D)8639 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8640   DeclarationNameInfo DirName;
8641   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8642                                              D->getBeginLoc());
8643   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8644   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8645   return Res;
8646 }
8647 
8648 template <typename Derived>
TransformOMPTaskyieldDirective(OMPTaskyieldDirective * D)8649 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8650     OMPTaskyieldDirective *D) {
8651   DeclarationNameInfo DirName;
8652   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8653                                              D->getBeginLoc());
8654   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8655   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8656   return Res;
8657 }
8658 
8659 template <typename Derived>
8660 StmtResult
TransformOMPBarrierDirective(OMPBarrierDirective * D)8661 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8662   DeclarationNameInfo DirName;
8663   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8664                                              D->getBeginLoc());
8665   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8666   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8667   return Res;
8668 }
8669 
8670 template <typename Derived>
8671 StmtResult
TransformOMPTaskwaitDirective(OMPTaskwaitDirective * D)8672 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8673   DeclarationNameInfo DirName;
8674   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8675                                              D->getBeginLoc());
8676   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8677   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8678   return Res;
8679 }
8680 
8681 template <typename Derived>
TransformOMPTaskgroupDirective(OMPTaskgroupDirective * D)8682 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8683     OMPTaskgroupDirective *D) {
8684   DeclarationNameInfo DirName;
8685   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8686                                              D->getBeginLoc());
8687   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8688   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8689   return Res;
8690 }
8691 
8692 template <typename Derived>
8693 StmtResult
TransformOMPFlushDirective(OMPFlushDirective * D)8694 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8695   DeclarationNameInfo DirName;
8696   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8697                                              D->getBeginLoc());
8698   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8699   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8700   return Res;
8701 }
8702 
8703 template <typename Derived>
8704 StmtResult
TransformOMPDepobjDirective(OMPDepobjDirective * D)8705 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8706   DeclarationNameInfo DirName;
8707   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8708                                              D->getBeginLoc());
8709   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8710   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8711   return Res;
8712 }
8713 
8714 template <typename Derived>
8715 StmtResult
TransformOMPScanDirective(OMPScanDirective * D)8716 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8717   DeclarationNameInfo DirName;
8718   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8719                                              D->getBeginLoc());
8720   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8721   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8722   return Res;
8723 }
8724 
8725 template <typename Derived>
8726 StmtResult
TransformOMPOrderedDirective(OMPOrderedDirective * D)8727 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8728   DeclarationNameInfo DirName;
8729   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8730                                              D->getBeginLoc());
8731   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8732   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8733   return Res;
8734 }
8735 
8736 template <typename Derived>
8737 StmtResult
TransformOMPAtomicDirective(OMPAtomicDirective * D)8738 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8739   DeclarationNameInfo DirName;
8740   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8741                                              D->getBeginLoc());
8742   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8743   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8744   return Res;
8745 }
8746 
8747 template <typename Derived>
8748 StmtResult
TransformOMPTargetDirective(OMPTargetDirective * D)8749 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8750   DeclarationNameInfo DirName;
8751   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8752                                              D->getBeginLoc());
8753   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8754   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8755   return Res;
8756 }
8757 
8758 template <typename Derived>
TransformOMPTargetDataDirective(OMPTargetDataDirective * D)8759 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8760     OMPTargetDataDirective *D) {
8761   DeclarationNameInfo DirName;
8762   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8763                                              D->getBeginLoc());
8764   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8765   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8766   return Res;
8767 }
8768 
8769 template <typename Derived>
TransformOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * D)8770 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8771     OMPTargetEnterDataDirective *D) {
8772   DeclarationNameInfo DirName;
8773   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8774                                              nullptr, D->getBeginLoc());
8775   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8776   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8777   return Res;
8778 }
8779 
8780 template <typename Derived>
TransformOMPTargetExitDataDirective(OMPTargetExitDataDirective * D)8781 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8782     OMPTargetExitDataDirective *D) {
8783   DeclarationNameInfo DirName;
8784   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8785                                              nullptr, D->getBeginLoc());
8786   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8787   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8788   return Res;
8789 }
8790 
8791 template <typename Derived>
TransformOMPTargetParallelDirective(OMPTargetParallelDirective * D)8792 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8793     OMPTargetParallelDirective *D) {
8794   DeclarationNameInfo DirName;
8795   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8796                                              nullptr, D->getBeginLoc());
8797   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8798   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8799   return Res;
8800 }
8801 
8802 template <typename Derived>
TransformOMPTargetParallelForDirective(OMPTargetParallelForDirective * D)8803 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8804     OMPTargetParallelForDirective *D) {
8805   DeclarationNameInfo DirName;
8806   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8807                                              nullptr, D->getBeginLoc());
8808   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8809   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8810   return Res;
8811 }
8812 
8813 template <typename Derived>
TransformOMPTargetUpdateDirective(OMPTargetUpdateDirective * D)8814 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8815     OMPTargetUpdateDirective *D) {
8816   DeclarationNameInfo DirName;
8817   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8818                                              nullptr, D->getBeginLoc());
8819   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8820   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8821   return Res;
8822 }
8823 
8824 template <typename Derived>
8825 StmtResult
TransformOMPTeamsDirective(OMPTeamsDirective * D)8826 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8827   DeclarationNameInfo DirName;
8828   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8829                                              D->getBeginLoc());
8830   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8831   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8832   return Res;
8833 }
8834 
8835 template <typename Derived>
TransformOMPCancellationPointDirective(OMPCancellationPointDirective * D)8836 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8837     OMPCancellationPointDirective *D) {
8838   DeclarationNameInfo DirName;
8839   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8840                                              nullptr, D->getBeginLoc());
8841   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8842   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8843   return Res;
8844 }
8845 
8846 template <typename Derived>
8847 StmtResult
TransformOMPCancelDirective(OMPCancelDirective * D)8848 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8849   DeclarationNameInfo DirName;
8850   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8851                                              D->getBeginLoc());
8852   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8853   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8854   return Res;
8855 }
8856 
8857 template <typename Derived>
8858 StmtResult
TransformOMPTaskLoopDirective(OMPTaskLoopDirective * D)8859 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8860   DeclarationNameInfo DirName;
8861   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8862                                              D->getBeginLoc());
8863   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8864   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8865   return Res;
8866 }
8867 
8868 template <typename Derived>
TransformOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * D)8869 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8870     OMPTaskLoopSimdDirective *D) {
8871   DeclarationNameInfo DirName;
8872   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8873                                              nullptr, D->getBeginLoc());
8874   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8875   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8876   return Res;
8877 }
8878 
8879 template <typename Derived>
TransformOMPMasterTaskLoopDirective(OMPMasterTaskLoopDirective * D)8880 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8881     OMPMasterTaskLoopDirective *D) {
8882   DeclarationNameInfo DirName;
8883   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8884                                              nullptr, D->getBeginLoc());
8885   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8886   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8887   return Res;
8888 }
8889 
8890 template <typename Derived>
TransformOMPMasterTaskLoopSimdDirective(OMPMasterTaskLoopSimdDirective * D)8891 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8892     OMPMasterTaskLoopSimdDirective *D) {
8893   DeclarationNameInfo DirName;
8894   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8895                                              nullptr, D->getBeginLoc());
8896   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8897   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8898   return Res;
8899 }
8900 
8901 template <typename Derived>
TransformOMPParallelMasterTaskLoopDirective(OMPParallelMasterTaskLoopDirective * D)8902 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8903     OMPParallelMasterTaskLoopDirective *D) {
8904   DeclarationNameInfo DirName;
8905   getDerived().getSema().StartOpenMPDSABlock(
8906       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8907   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8908   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8909   return Res;
8910 }
8911 
8912 template <typename Derived>
8913 StmtResult
TransformOMPParallelMasterTaskLoopSimdDirective(OMPParallelMasterTaskLoopSimdDirective * D)8914 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8915     OMPParallelMasterTaskLoopSimdDirective *D) {
8916   DeclarationNameInfo DirName;
8917   getDerived().getSema().StartOpenMPDSABlock(
8918       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8919   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8920   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8921   return Res;
8922 }
8923 
8924 template <typename Derived>
TransformOMPDistributeDirective(OMPDistributeDirective * D)8925 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8926     OMPDistributeDirective *D) {
8927   DeclarationNameInfo DirName;
8928   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8929                                              D->getBeginLoc());
8930   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8931   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8932   return Res;
8933 }
8934 
8935 template <typename Derived>
TransformOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * D)8936 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8937     OMPDistributeParallelForDirective *D) {
8938   DeclarationNameInfo DirName;
8939   getDerived().getSema().StartOpenMPDSABlock(
8940       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8941   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8942   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8943   return Res;
8944 }
8945 
8946 template <typename Derived>
8947 StmtResult
TransformOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * D)8948 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8949     OMPDistributeParallelForSimdDirective *D) {
8950   DeclarationNameInfo DirName;
8951   getDerived().getSema().StartOpenMPDSABlock(
8952       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8953   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8954   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8955   return Res;
8956 }
8957 
8958 template <typename Derived>
TransformOMPDistributeSimdDirective(OMPDistributeSimdDirective * D)8959 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8960     OMPDistributeSimdDirective *D) {
8961   DeclarationNameInfo DirName;
8962   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8963                                              nullptr, D->getBeginLoc());
8964   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8965   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8966   return Res;
8967 }
8968 
8969 template <typename Derived>
TransformOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * D)8970 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8971     OMPTargetParallelForSimdDirective *D) {
8972   DeclarationNameInfo DirName;
8973   getDerived().getSema().StartOpenMPDSABlock(
8974       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8975   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8976   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8977   return Res;
8978 }
8979 
8980 template <typename Derived>
TransformOMPTargetSimdDirective(OMPTargetSimdDirective * D)8981 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8982     OMPTargetSimdDirective *D) {
8983   DeclarationNameInfo DirName;
8984   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8985                                              D->getBeginLoc());
8986   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8987   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8988   return Res;
8989 }
8990 
8991 template <typename Derived>
TransformOMPTeamsDistributeDirective(OMPTeamsDistributeDirective * D)8992 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8993     OMPTeamsDistributeDirective *D) {
8994   DeclarationNameInfo DirName;
8995   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8996                                              nullptr, D->getBeginLoc());
8997   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8998   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8999   return Res;
9000 }
9001 
9002 template <typename Derived>
TransformOMPTeamsDistributeSimdDirective(OMPTeamsDistributeSimdDirective * D)9003 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9004     OMPTeamsDistributeSimdDirective *D) {
9005   DeclarationNameInfo DirName;
9006   getDerived().getSema().StartOpenMPDSABlock(
9007       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9008   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9009   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9010   return Res;
9011 }
9012 
9013 template <typename Derived>
TransformOMPTeamsDistributeParallelForSimdDirective(OMPTeamsDistributeParallelForSimdDirective * D)9014 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9015     OMPTeamsDistributeParallelForSimdDirective *D) {
9016   DeclarationNameInfo DirName;
9017   getDerived().getSema().StartOpenMPDSABlock(
9018       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9019       D->getBeginLoc());
9020   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9021   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9022   return Res;
9023 }
9024 
9025 template <typename Derived>
TransformOMPTeamsDistributeParallelForDirective(OMPTeamsDistributeParallelForDirective * D)9026 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9027     OMPTeamsDistributeParallelForDirective *D) {
9028   DeclarationNameInfo DirName;
9029   getDerived().getSema().StartOpenMPDSABlock(
9030       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9031   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9032   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9033   return Res;
9034 }
9035 
9036 template <typename Derived>
TransformOMPTargetTeamsDirective(OMPTargetTeamsDirective * D)9037 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9038     OMPTargetTeamsDirective *D) {
9039   DeclarationNameInfo DirName;
9040   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9041                                              nullptr, D->getBeginLoc());
9042   auto Res = getDerived().TransformOMPExecutableDirective(D);
9043   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9044   return Res;
9045 }
9046 
9047 template <typename Derived>
TransformOMPTargetTeamsDistributeDirective(OMPTargetTeamsDistributeDirective * D)9048 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9049     OMPTargetTeamsDistributeDirective *D) {
9050   DeclarationNameInfo DirName;
9051   getDerived().getSema().StartOpenMPDSABlock(
9052       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9053   auto Res = getDerived().TransformOMPExecutableDirective(D);
9054   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9055   return Res;
9056 }
9057 
9058 template <typename Derived>
9059 StmtResult
TransformOMPTargetTeamsDistributeParallelForDirective(OMPTargetTeamsDistributeParallelForDirective * D)9060 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9061     OMPTargetTeamsDistributeParallelForDirective *D) {
9062   DeclarationNameInfo DirName;
9063   getDerived().getSema().StartOpenMPDSABlock(
9064       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9065       D->getBeginLoc());
9066   auto Res = getDerived().TransformOMPExecutableDirective(D);
9067   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9068   return Res;
9069 }
9070 
9071 template <typename Derived>
9072 StmtResult TreeTransform<Derived>::
TransformOMPTargetTeamsDistributeParallelForSimdDirective(OMPTargetTeamsDistributeParallelForSimdDirective * D)9073     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9074         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9075   DeclarationNameInfo DirName;
9076   getDerived().getSema().StartOpenMPDSABlock(
9077       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9078       D->getBeginLoc());
9079   auto Res = getDerived().TransformOMPExecutableDirective(D);
9080   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9081   return Res;
9082 }
9083 
9084 template <typename Derived>
9085 StmtResult
TransformOMPTargetTeamsDistributeSimdDirective(OMPTargetTeamsDistributeSimdDirective * D)9086 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9087     OMPTargetTeamsDistributeSimdDirective *D) {
9088   DeclarationNameInfo DirName;
9089   getDerived().getSema().StartOpenMPDSABlock(
9090       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9091   auto Res = getDerived().TransformOMPExecutableDirective(D);
9092   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9093   return Res;
9094 }
9095 
9096 template <typename Derived>
9097 StmtResult
TransformOMPInteropDirective(OMPInteropDirective * D)9098 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9099   DeclarationNameInfo DirName;
9100   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9101                                              D->getBeginLoc());
9102   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9103   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9104   return Res;
9105 }
9106 
9107 template <typename Derived>
9108 StmtResult
TransformOMPDispatchDirective(OMPDispatchDirective * D)9109 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9110   DeclarationNameInfo DirName;
9111   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9112                                              D->getBeginLoc());
9113   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9114   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9115   return Res;
9116 }
9117 
9118 template <typename Derived>
9119 StmtResult
TransformOMPMaskedDirective(OMPMaskedDirective * D)9120 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9121   DeclarationNameInfo DirName;
9122   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9123                                              D->getBeginLoc());
9124   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9125   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9126   return Res;
9127 }
9128 
9129 //===----------------------------------------------------------------------===//
9130 // OpenMP clause transformation
9131 //===----------------------------------------------------------------------===//
9132 template <typename Derived>
TransformOMPIfClause(OMPIfClause * C)9133 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9134   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9135   if (Cond.isInvalid())
9136     return nullptr;
9137   return getDerived().RebuildOMPIfClause(
9138       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9139       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9140 }
9141 
9142 template <typename Derived>
TransformOMPFinalClause(OMPFinalClause * C)9143 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9144   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9145   if (Cond.isInvalid())
9146     return nullptr;
9147   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9148                                             C->getLParenLoc(), C->getEndLoc());
9149 }
9150 
9151 template <typename Derived>
9152 OMPClause *
TransformOMPNumThreadsClause(OMPNumThreadsClause * C)9153 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9154   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9155   if (NumThreads.isInvalid())
9156     return nullptr;
9157   return getDerived().RebuildOMPNumThreadsClause(
9158       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9159 }
9160 
9161 template <typename Derived>
9162 OMPClause *
TransformOMPSafelenClause(OMPSafelenClause * C)9163 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9164   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9165   if (E.isInvalid())
9166     return nullptr;
9167   return getDerived().RebuildOMPSafelenClause(
9168       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9169 }
9170 
9171 template <typename Derived>
9172 OMPClause *
TransformOMPAllocatorClause(OMPAllocatorClause * C)9173 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9174   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9175   if (E.isInvalid())
9176     return nullptr;
9177   return getDerived().RebuildOMPAllocatorClause(
9178       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9179 }
9180 
9181 template <typename Derived>
9182 OMPClause *
TransformOMPSimdlenClause(OMPSimdlenClause * C)9183 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9184   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9185   if (E.isInvalid())
9186     return nullptr;
9187   return getDerived().RebuildOMPSimdlenClause(
9188       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9189 }
9190 
9191 template <typename Derived>
TransformOMPSizesClause(OMPSizesClause * C)9192 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9193   SmallVector<Expr *, 4> TransformedSizes;
9194   TransformedSizes.reserve(C->getNumSizes());
9195   bool Changed = false;
9196   for (Expr *E : C->getSizesRefs()) {
9197     if (!E) {
9198       TransformedSizes.push_back(nullptr);
9199       continue;
9200     }
9201 
9202     ExprResult T = getDerived().TransformExpr(E);
9203     if (T.isInvalid())
9204       return nullptr;
9205     if (E != T.get())
9206       Changed = true;
9207     TransformedSizes.push_back(T.get());
9208   }
9209 
9210   if (!Changed && !getDerived().AlwaysRebuild())
9211     return C;
9212   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9213                                C->getLParenLoc(), C->getEndLoc());
9214 }
9215 
9216 template <typename Derived>
9217 OMPClause *
TransformOMPCollapseClause(OMPCollapseClause * C)9218 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9219   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9220   if (E.isInvalid())
9221     return nullptr;
9222   return getDerived().RebuildOMPCollapseClause(
9223       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9224 }
9225 
9226 template <typename Derived>
9227 OMPClause *
TransformOMPDefaultClause(OMPDefaultClause * C)9228 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9229   return getDerived().RebuildOMPDefaultClause(
9230       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9231       C->getLParenLoc(), C->getEndLoc());
9232 }
9233 
9234 template <typename Derived>
9235 OMPClause *
TransformOMPProcBindClause(OMPProcBindClause * C)9236 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9237   return getDerived().RebuildOMPProcBindClause(
9238       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9239       C->getLParenLoc(), C->getEndLoc());
9240 }
9241 
9242 template <typename Derived>
9243 OMPClause *
TransformOMPScheduleClause(OMPScheduleClause * C)9244 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9245   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9246   if (E.isInvalid())
9247     return nullptr;
9248   return getDerived().RebuildOMPScheduleClause(
9249       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9250       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9251       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9252       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9253 }
9254 
9255 template <typename Derived>
9256 OMPClause *
TransformOMPOrderedClause(OMPOrderedClause * C)9257 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9258   ExprResult E;
9259   if (auto *Num = C->getNumForLoops()) {
9260     E = getDerived().TransformExpr(Num);
9261     if (E.isInvalid())
9262       return nullptr;
9263   }
9264   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9265                                               C->getLParenLoc(), E.get());
9266 }
9267 
9268 template <typename Derived>
9269 OMPClause *
TransformOMPDetachClause(OMPDetachClause * C)9270 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9271   ExprResult E;
9272   if (Expr *Evt = C->getEventHandler()) {
9273     E = getDerived().TransformExpr(Evt);
9274     if (E.isInvalid())
9275       return nullptr;
9276   }
9277   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9278                                              C->getLParenLoc(), C->getEndLoc());
9279 }
9280 
9281 template <typename Derived>
9282 OMPClause *
TransformOMPNowaitClause(OMPNowaitClause * C)9283 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9284   // No need to rebuild this clause, no template-dependent parameters.
9285   return C;
9286 }
9287 
9288 template <typename Derived>
9289 OMPClause *
TransformOMPUntiedClause(OMPUntiedClause * C)9290 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9291   // No need to rebuild this clause, no template-dependent parameters.
9292   return C;
9293 }
9294 
9295 template <typename Derived>
9296 OMPClause *
TransformOMPMergeableClause(OMPMergeableClause * C)9297 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9298   // No need to rebuild this clause, no template-dependent parameters.
9299   return C;
9300 }
9301 
9302 template <typename Derived>
TransformOMPReadClause(OMPReadClause * C)9303 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9304   // No need to rebuild this clause, no template-dependent parameters.
9305   return C;
9306 }
9307 
9308 template <typename Derived>
TransformOMPWriteClause(OMPWriteClause * C)9309 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9310   // No need to rebuild this clause, no template-dependent parameters.
9311   return C;
9312 }
9313 
9314 template <typename Derived>
9315 OMPClause *
TransformOMPUpdateClause(OMPUpdateClause * C)9316 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9317   // No need to rebuild this clause, no template-dependent parameters.
9318   return C;
9319 }
9320 
9321 template <typename Derived>
9322 OMPClause *
TransformOMPCaptureClause(OMPCaptureClause * C)9323 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9324   // No need to rebuild this clause, no template-dependent parameters.
9325   return C;
9326 }
9327 
9328 template <typename Derived>
9329 OMPClause *
TransformOMPSeqCstClause(OMPSeqCstClause * C)9330 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9331   // No need to rebuild this clause, no template-dependent parameters.
9332   return C;
9333 }
9334 
9335 template <typename Derived>
9336 OMPClause *
TransformOMPAcqRelClause(OMPAcqRelClause * C)9337 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9338   // No need to rebuild this clause, no template-dependent parameters.
9339   return C;
9340 }
9341 
9342 template <typename Derived>
9343 OMPClause *
TransformOMPAcquireClause(OMPAcquireClause * C)9344 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9345   // No need to rebuild this clause, no template-dependent parameters.
9346   return C;
9347 }
9348 
9349 template <typename Derived>
9350 OMPClause *
TransformOMPReleaseClause(OMPReleaseClause * C)9351 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9352   // No need to rebuild this clause, no template-dependent parameters.
9353   return C;
9354 }
9355 
9356 template <typename Derived>
9357 OMPClause *
TransformOMPRelaxedClause(OMPRelaxedClause * C)9358 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9359   // No need to rebuild this clause, no template-dependent parameters.
9360   return C;
9361 }
9362 
9363 template <typename Derived>
9364 OMPClause *
TransformOMPThreadsClause(OMPThreadsClause * C)9365 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9366   // No need to rebuild this clause, no template-dependent parameters.
9367   return C;
9368 }
9369 
9370 template <typename Derived>
TransformOMPSIMDClause(OMPSIMDClause * C)9371 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9372   // No need to rebuild this clause, no template-dependent parameters.
9373   return C;
9374 }
9375 
9376 template <typename Derived>
9377 OMPClause *
TransformOMPNogroupClause(OMPNogroupClause * C)9378 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9379   // No need to rebuild this clause, no template-dependent parameters.
9380   return C;
9381 }
9382 
9383 template <typename Derived>
TransformOMPInitClause(OMPInitClause * C)9384 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9385   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9386   if (IVR.isInvalid())
9387     return nullptr;
9388 
9389   llvm::SmallVector<Expr *, 8> PrefExprs;
9390   PrefExprs.reserve(C->varlist_size() - 1);
9391   for (Expr *E : llvm::drop_begin(C->varlists())) {
9392     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9393     if (ER.isInvalid())
9394       return nullptr;
9395     PrefExprs.push_back(ER.get());
9396   }
9397   return getDerived().RebuildOMPInitClause(
9398       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9399       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9400 }
9401 
9402 template <typename Derived>
TransformOMPUseClause(OMPUseClause * C)9403 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9404   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9405   if (ER.isInvalid())
9406     return nullptr;
9407   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9408                                           C->getLParenLoc(), C->getVarLoc(),
9409                                           C->getEndLoc());
9410 }
9411 
9412 template <typename Derived>
9413 OMPClause *
TransformOMPDestroyClause(OMPDestroyClause * C)9414 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9415   ExprResult ER;
9416   if (Expr *IV = C->getInteropVar()) {
9417     ER = getDerived().TransformExpr(IV);
9418     if (ER.isInvalid())
9419       return nullptr;
9420   }
9421   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9422                                               C->getLParenLoc(), C->getVarLoc(),
9423                                               C->getEndLoc());
9424 }
9425 
9426 template <typename Derived>
9427 OMPClause *
TransformOMPNovariantsClause(OMPNovariantsClause * C)9428 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9429   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9430   if (Cond.isInvalid())
9431     return nullptr;
9432   return getDerived().RebuildOMPNovariantsClause(
9433       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9434 }
9435 
9436 template <typename Derived>
9437 OMPClause *
TransformOMPNocontextClause(OMPNocontextClause * C)9438 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9439   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9440   if (Cond.isInvalid())
9441     return nullptr;
9442   return getDerived().RebuildOMPNocontextClause(
9443       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9444 }
9445 
9446 template <typename Derived>
9447 OMPClause *
TransformOMPFilterClause(OMPFilterClause * C)9448 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9449   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9450   if (ThreadID.isInvalid())
9451     return nullptr;
9452   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9453                                              C->getLParenLoc(), C->getEndLoc());
9454 }
9455 
9456 template <typename Derived>
TransformOMPUnifiedAddressClause(OMPUnifiedAddressClause * C)9457 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9458     OMPUnifiedAddressClause *C) {
9459   llvm_unreachable("unified_address clause cannot appear in dependent context");
9460 }
9461 
9462 template <typename Derived>
TransformOMPUnifiedSharedMemoryClause(OMPUnifiedSharedMemoryClause * C)9463 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9464     OMPUnifiedSharedMemoryClause *C) {
9465   llvm_unreachable(
9466       "unified_shared_memory clause cannot appear in dependent context");
9467 }
9468 
9469 template <typename Derived>
TransformOMPReverseOffloadClause(OMPReverseOffloadClause * C)9470 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9471     OMPReverseOffloadClause *C) {
9472   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9473 }
9474 
9475 template <typename Derived>
TransformOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause * C)9476 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9477     OMPDynamicAllocatorsClause *C) {
9478   llvm_unreachable(
9479       "dynamic_allocators clause cannot appear in dependent context");
9480 }
9481 
9482 template <typename Derived>
TransformOMPAtomicDefaultMemOrderClause(OMPAtomicDefaultMemOrderClause * C)9483 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9484     OMPAtomicDefaultMemOrderClause *C) {
9485   llvm_unreachable(
9486       "atomic_default_mem_order clause cannot appear in dependent context");
9487 }
9488 
9489 template <typename Derived>
9490 OMPClause *
TransformOMPPrivateClause(OMPPrivateClause * C)9491 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9492   llvm::SmallVector<Expr *, 16> Vars;
9493   Vars.reserve(C->varlist_size());
9494   for (auto *VE : C->varlists()) {
9495     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9496     if (EVar.isInvalid())
9497       return nullptr;
9498     Vars.push_back(EVar.get());
9499   }
9500   return getDerived().RebuildOMPPrivateClause(
9501       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9502 }
9503 
9504 template <typename Derived>
TransformOMPFirstprivateClause(OMPFirstprivateClause * C)9505 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9506     OMPFirstprivateClause *C) {
9507   llvm::SmallVector<Expr *, 16> Vars;
9508   Vars.reserve(C->varlist_size());
9509   for (auto *VE : C->varlists()) {
9510     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9511     if (EVar.isInvalid())
9512       return nullptr;
9513     Vars.push_back(EVar.get());
9514   }
9515   return getDerived().RebuildOMPFirstprivateClause(
9516       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9517 }
9518 
9519 template <typename Derived>
9520 OMPClause *
TransformOMPLastprivateClause(OMPLastprivateClause * C)9521 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9522   llvm::SmallVector<Expr *, 16> Vars;
9523   Vars.reserve(C->varlist_size());
9524   for (auto *VE : C->varlists()) {
9525     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9526     if (EVar.isInvalid())
9527       return nullptr;
9528     Vars.push_back(EVar.get());
9529   }
9530   return getDerived().RebuildOMPLastprivateClause(
9531       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9532       C->getLParenLoc(), C->getEndLoc());
9533 }
9534 
9535 template <typename Derived>
9536 OMPClause *
TransformOMPSharedClause(OMPSharedClause * C)9537 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9538   llvm::SmallVector<Expr *, 16> Vars;
9539   Vars.reserve(C->varlist_size());
9540   for (auto *VE : C->varlists()) {
9541     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9542     if (EVar.isInvalid())
9543       return nullptr;
9544     Vars.push_back(EVar.get());
9545   }
9546   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9547                                              C->getLParenLoc(), C->getEndLoc());
9548 }
9549 
9550 template <typename Derived>
9551 OMPClause *
TransformOMPReductionClause(OMPReductionClause * C)9552 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9553   llvm::SmallVector<Expr *, 16> Vars;
9554   Vars.reserve(C->varlist_size());
9555   for (auto *VE : C->varlists()) {
9556     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9557     if (EVar.isInvalid())
9558       return nullptr;
9559     Vars.push_back(EVar.get());
9560   }
9561   CXXScopeSpec ReductionIdScopeSpec;
9562   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9563 
9564   DeclarationNameInfo NameInfo = C->getNameInfo();
9565   if (NameInfo.getName()) {
9566     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9567     if (!NameInfo.getName())
9568       return nullptr;
9569   }
9570   // Build a list of all UDR decls with the same names ranged by the Scopes.
9571   // The Scope boundary is a duplication of the previous decl.
9572   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9573   for (auto *E : C->reduction_ops()) {
9574     // Transform all the decls.
9575     if (E) {
9576       auto *ULE = cast<UnresolvedLookupExpr>(E);
9577       UnresolvedSet<8> Decls;
9578       for (auto *D : ULE->decls()) {
9579         NamedDecl *InstD =
9580             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9581         Decls.addDecl(InstD, InstD->getAccess());
9582       }
9583       UnresolvedReductions.push_back(
9584        UnresolvedLookupExpr::Create(
9585           SemaRef.Context, /*NamingClass=*/nullptr,
9586           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9587           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9588           Decls.begin(), Decls.end()));
9589     } else
9590       UnresolvedReductions.push_back(nullptr);
9591   }
9592   return getDerived().RebuildOMPReductionClause(
9593       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9594       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9595       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9596 }
9597 
9598 template <typename Derived>
TransformOMPTaskReductionClause(OMPTaskReductionClause * C)9599 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9600     OMPTaskReductionClause *C) {
9601   llvm::SmallVector<Expr *, 16> Vars;
9602   Vars.reserve(C->varlist_size());
9603   for (auto *VE : C->varlists()) {
9604     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9605     if (EVar.isInvalid())
9606       return nullptr;
9607     Vars.push_back(EVar.get());
9608   }
9609   CXXScopeSpec ReductionIdScopeSpec;
9610   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9611 
9612   DeclarationNameInfo NameInfo = C->getNameInfo();
9613   if (NameInfo.getName()) {
9614     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9615     if (!NameInfo.getName())
9616       return nullptr;
9617   }
9618   // Build a list of all UDR decls with the same names ranged by the Scopes.
9619   // The Scope boundary is a duplication of the previous decl.
9620   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9621   for (auto *E : C->reduction_ops()) {
9622     // Transform all the decls.
9623     if (E) {
9624       auto *ULE = cast<UnresolvedLookupExpr>(E);
9625       UnresolvedSet<8> Decls;
9626       for (auto *D : ULE->decls()) {
9627         NamedDecl *InstD =
9628             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9629         Decls.addDecl(InstD, InstD->getAccess());
9630       }
9631       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9632           SemaRef.Context, /*NamingClass=*/nullptr,
9633           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9634           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9635     } else
9636       UnresolvedReductions.push_back(nullptr);
9637   }
9638   return getDerived().RebuildOMPTaskReductionClause(
9639       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9640       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9641 }
9642 
9643 template <typename Derived>
9644 OMPClause *
TransformOMPInReductionClause(OMPInReductionClause * C)9645 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9646   llvm::SmallVector<Expr *, 16> Vars;
9647   Vars.reserve(C->varlist_size());
9648   for (auto *VE : C->varlists()) {
9649     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9650     if (EVar.isInvalid())
9651       return nullptr;
9652     Vars.push_back(EVar.get());
9653   }
9654   CXXScopeSpec ReductionIdScopeSpec;
9655   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9656 
9657   DeclarationNameInfo NameInfo = C->getNameInfo();
9658   if (NameInfo.getName()) {
9659     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9660     if (!NameInfo.getName())
9661       return nullptr;
9662   }
9663   // Build a list of all UDR decls with the same names ranged by the Scopes.
9664   // The Scope boundary is a duplication of the previous decl.
9665   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9666   for (auto *E : C->reduction_ops()) {
9667     // Transform all the decls.
9668     if (E) {
9669       auto *ULE = cast<UnresolvedLookupExpr>(E);
9670       UnresolvedSet<8> Decls;
9671       for (auto *D : ULE->decls()) {
9672         NamedDecl *InstD =
9673             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9674         Decls.addDecl(InstD, InstD->getAccess());
9675       }
9676       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9677           SemaRef.Context, /*NamingClass=*/nullptr,
9678           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9679           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9680     } else
9681       UnresolvedReductions.push_back(nullptr);
9682   }
9683   return getDerived().RebuildOMPInReductionClause(
9684       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9685       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9686 }
9687 
9688 template <typename Derived>
9689 OMPClause *
TransformOMPLinearClause(OMPLinearClause * C)9690 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9691   llvm::SmallVector<Expr *, 16> Vars;
9692   Vars.reserve(C->varlist_size());
9693   for (auto *VE : C->varlists()) {
9694     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9695     if (EVar.isInvalid())
9696       return nullptr;
9697     Vars.push_back(EVar.get());
9698   }
9699   ExprResult Step = getDerived().TransformExpr(C->getStep());
9700   if (Step.isInvalid())
9701     return nullptr;
9702   return getDerived().RebuildOMPLinearClause(
9703       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9704       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9705 }
9706 
9707 template <typename Derived>
9708 OMPClause *
TransformOMPAlignedClause(OMPAlignedClause * C)9709 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9710   llvm::SmallVector<Expr *, 16> Vars;
9711   Vars.reserve(C->varlist_size());
9712   for (auto *VE : C->varlists()) {
9713     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9714     if (EVar.isInvalid())
9715       return nullptr;
9716     Vars.push_back(EVar.get());
9717   }
9718   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9719   if (Alignment.isInvalid())
9720     return nullptr;
9721   return getDerived().RebuildOMPAlignedClause(
9722       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9723       C->getColonLoc(), C->getEndLoc());
9724 }
9725 
9726 template <typename Derived>
9727 OMPClause *
TransformOMPCopyinClause(OMPCopyinClause * C)9728 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9729   llvm::SmallVector<Expr *, 16> Vars;
9730   Vars.reserve(C->varlist_size());
9731   for (auto *VE : C->varlists()) {
9732     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9733     if (EVar.isInvalid())
9734       return nullptr;
9735     Vars.push_back(EVar.get());
9736   }
9737   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9738                                              C->getLParenLoc(), C->getEndLoc());
9739 }
9740 
9741 template <typename Derived>
9742 OMPClause *
TransformOMPCopyprivateClause(OMPCopyprivateClause * C)9743 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9744   llvm::SmallVector<Expr *, 16> Vars;
9745   Vars.reserve(C->varlist_size());
9746   for (auto *VE : C->varlists()) {
9747     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9748     if (EVar.isInvalid())
9749       return nullptr;
9750     Vars.push_back(EVar.get());
9751   }
9752   return getDerived().RebuildOMPCopyprivateClause(
9753       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9754 }
9755 
9756 template <typename Derived>
TransformOMPFlushClause(OMPFlushClause * C)9757 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9758   llvm::SmallVector<Expr *, 16> Vars;
9759   Vars.reserve(C->varlist_size());
9760   for (auto *VE : C->varlists()) {
9761     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9762     if (EVar.isInvalid())
9763       return nullptr;
9764     Vars.push_back(EVar.get());
9765   }
9766   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9767                                             C->getLParenLoc(), C->getEndLoc());
9768 }
9769 
9770 template <typename Derived>
9771 OMPClause *
TransformOMPDepobjClause(OMPDepobjClause * C)9772 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9773   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9774   if (E.isInvalid())
9775     return nullptr;
9776   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9777                                              C->getLParenLoc(), C->getEndLoc());
9778 }
9779 
9780 template <typename Derived>
9781 OMPClause *
TransformOMPDependClause(OMPDependClause * C)9782 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9783   llvm::SmallVector<Expr *, 16> Vars;
9784   Expr *DepModifier = C->getModifier();
9785   if (DepModifier) {
9786     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9787     if (DepModRes.isInvalid())
9788       return nullptr;
9789     DepModifier = DepModRes.get();
9790   }
9791   Vars.reserve(C->varlist_size());
9792   for (auto *VE : C->varlists()) {
9793     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9794     if (EVar.isInvalid())
9795       return nullptr;
9796     Vars.push_back(EVar.get());
9797   }
9798   return getDerived().RebuildOMPDependClause(
9799       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9800       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9801       C->getEndLoc());
9802 }
9803 
9804 template <typename Derived>
9805 OMPClause *
TransformOMPDeviceClause(OMPDeviceClause * C)9806 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9807   ExprResult E = getDerived().TransformExpr(C->getDevice());
9808   if (E.isInvalid())
9809     return nullptr;
9810   return getDerived().RebuildOMPDeviceClause(
9811       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9812       C->getModifierLoc(), C->getEndLoc());
9813 }
9814 
9815 template <typename Derived, class T>
transformOMPMappableExprListClause(TreeTransform<Derived> & TT,OMPMappableExprListClause<T> * C,llvm::SmallVectorImpl<Expr * > & Vars,CXXScopeSpec & MapperIdScopeSpec,DeclarationNameInfo & MapperIdInfo,llvm::SmallVectorImpl<Expr * > & UnresolvedMappers)9816 bool transformOMPMappableExprListClause(
9817     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9818     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9819     DeclarationNameInfo &MapperIdInfo,
9820     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9821   // Transform expressions in the list.
9822   Vars.reserve(C->varlist_size());
9823   for (auto *VE : C->varlists()) {
9824     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9825     if (EVar.isInvalid())
9826       return true;
9827     Vars.push_back(EVar.get());
9828   }
9829   // Transform mapper scope specifier and identifier.
9830   NestedNameSpecifierLoc QualifierLoc;
9831   if (C->getMapperQualifierLoc()) {
9832     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9833         C->getMapperQualifierLoc());
9834     if (!QualifierLoc)
9835       return true;
9836   }
9837   MapperIdScopeSpec.Adopt(QualifierLoc);
9838   MapperIdInfo = C->getMapperIdInfo();
9839   if (MapperIdInfo.getName()) {
9840     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9841     if (!MapperIdInfo.getName())
9842       return true;
9843   }
9844   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9845   // the previous user-defined mapper lookup in dependent environment.
9846   for (auto *E : C->mapperlists()) {
9847     // Transform all the decls.
9848     if (E) {
9849       auto *ULE = cast<UnresolvedLookupExpr>(E);
9850       UnresolvedSet<8> Decls;
9851       for (auto *D : ULE->decls()) {
9852         NamedDecl *InstD =
9853             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9854         Decls.addDecl(InstD, InstD->getAccess());
9855       }
9856       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9857           TT.getSema().Context, /*NamingClass=*/nullptr,
9858           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9859           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9860           Decls.end()));
9861     } else {
9862       UnresolvedMappers.push_back(nullptr);
9863     }
9864   }
9865   return false;
9866 }
9867 
9868 template <typename Derived>
TransformOMPMapClause(OMPMapClause * C)9869 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9870   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9871   llvm::SmallVector<Expr *, 16> Vars;
9872   CXXScopeSpec MapperIdScopeSpec;
9873   DeclarationNameInfo MapperIdInfo;
9874   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9875   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9876           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9877     return nullptr;
9878   return getDerived().RebuildOMPMapClause(
9879       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9880       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9881       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9882 }
9883 
9884 template <typename Derived>
9885 OMPClause *
TransformOMPAllocateClause(OMPAllocateClause * C)9886 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9887   Expr *Allocator = C->getAllocator();
9888   if (Allocator) {
9889     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9890     if (AllocatorRes.isInvalid())
9891       return nullptr;
9892     Allocator = AllocatorRes.get();
9893   }
9894   llvm::SmallVector<Expr *, 16> Vars;
9895   Vars.reserve(C->varlist_size());
9896   for (auto *VE : C->varlists()) {
9897     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9898     if (EVar.isInvalid())
9899       return nullptr;
9900     Vars.push_back(EVar.get());
9901   }
9902   return getDerived().RebuildOMPAllocateClause(
9903       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9904       C->getEndLoc());
9905 }
9906 
9907 template <typename Derived>
9908 OMPClause *
TransformOMPNumTeamsClause(OMPNumTeamsClause * C)9909 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9910   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9911   if (E.isInvalid())
9912     return nullptr;
9913   return getDerived().RebuildOMPNumTeamsClause(
9914       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9915 }
9916 
9917 template <typename Derived>
9918 OMPClause *
TransformOMPThreadLimitClause(OMPThreadLimitClause * C)9919 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9920   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9921   if (E.isInvalid())
9922     return nullptr;
9923   return getDerived().RebuildOMPThreadLimitClause(
9924       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9925 }
9926 
9927 template <typename Derived>
9928 OMPClause *
TransformOMPPriorityClause(OMPPriorityClause * C)9929 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9930   ExprResult E = getDerived().TransformExpr(C->getPriority());
9931   if (E.isInvalid())
9932     return nullptr;
9933   return getDerived().RebuildOMPPriorityClause(
9934       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9935 }
9936 
9937 template <typename Derived>
9938 OMPClause *
TransformOMPGrainsizeClause(OMPGrainsizeClause * C)9939 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9940   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9941   if (E.isInvalid())
9942     return nullptr;
9943   return getDerived().RebuildOMPGrainsizeClause(
9944       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9945 }
9946 
9947 template <typename Derived>
9948 OMPClause *
TransformOMPNumTasksClause(OMPNumTasksClause * C)9949 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9950   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9951   if (E.isInvalid())
9952     return nullptr;
9953   return getDerived().RebuildOMPNumTasksClause(
9954       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9955 }
9956 
9957 template <typename Derived>
TransformOMPHintClause(OMPHintClause * C)9958 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9959   ExprResult E = getDerived().TransformExpr(C->getHint());
9960   if (E.isInvalid())
9961     return nullptr;
9962   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9963                                            C->getLParenLoc(), C->getEndLoc());
9964 }
9965 
9966 template <typename Derived>
TransformOMPDistScheduleClause(OMPDistScheduleClause * C)9967 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9968     OMPDistScheduleClause *C) {
9969   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9970   if (E.isInvalid())
9971     return nullptr;
9972   return getDerived().RebuildOMPDistScheduleClause(
9973       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9974       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9975 }
9976 
9977 template <typename Derived>
9978 OMPClause *
TransformOMPDefaultmapClause(OMPDefaultmapClause * C)9979 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9980   // Rebuild Defaultmap Clause since we need to invoke the checking of
9981   // defaultmap(none:variable-category) after template initialization.
9982   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9983                                                  C->getDefaultmapKind(),
9984                                                  C->getBeginLoc(),
9985                                                  C->getLParenLoc(),
9986                                                  C->getDefaultmapModifierLoc(),
9987                                                  C->getDefaultmapKindLoc(),
9988                                                  C->getEndLoc());
9989 }
9990 
9991 template <typename Derived>
TransformOMPToClause(OMPToClause * C)9992 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9993   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9994   llvm::SmallVector<Expr *, 16> Vars;
9995   CXXScopeSpec MapperIdScopeSpec;
9996   DeclarationNameInfo MapperIdInfo;
9997   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9998   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9999           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10000     return nullptr;
10001   return getDerived().RebuildOMPToClause(
10002       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10003       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10004 }
10005 
10006 template <typename Derived>
TransformOMPFromClause(OMPFromClause * C)10007 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10008   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10009   llvm::SmallVector<Expr *, 16> Vars;
10010   CXXScopeSpec MapperIdScopeSpec;
10011   DeclarationNameInfo MapperIdInfo;
10012   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10013   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10014           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10015     return nullptr;
10016   return getDerived().RebuildOMPFromClause(
10017       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10018       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10019 }
10020 
10021 template <typename Derived>
TransformOMPUseDevicePtrClause(OMPUseDevicePtrClause * C)10022 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10023     OMPUseDevicePtrClause *C) {
10024   llvm::SmallVector<Expr *, 16> Vars;
10025   Vars.reserve(C->varlist_size());
10026   for (auto *VE : C->varlists()) {
10027     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10028     if (EVar.isInvalid())
10029       return nullptr;
10030     Vars.push_back(EVar.get());
10031   }
10032   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10033   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10034 }
10035 
10036 template <typename Derived>
TransformOMPUseDeviceAddrClause(OMPUseDeviceAddrClause * C)10037 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10038     OMPUseDeviceAddrClause *C) {
10039   llvm::SmallVector<Expr *, 16> Vars;
10040   Vars.reserve(C->varlist_size());
10041   for (auto *VE : C->varlists()) {
10042     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10043     if (EVar.isInvalid())
10044       return nullptr;
10045     Vars.push_back(EVar.get());
10046   }
10047   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10048   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10049 }
10050 
10051 template <typename Derived>
10052 OMPClause *
TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause * C)10053 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10054   llvm::SmallVector<Expr *, 16> Vars;
10055   Vars.reserve(C->varlist_size());
10056   for (auto *VE : C->varlists()) {
10057     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10058     if (EVar.isInvalid())
10059       return nullptr;
10060     Vars.push_back(EVar.get());
10061   }
10062   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10063   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10064 }
10065 
10066 template <typename Derived>
10067 OMPClause *
TransformOMPNontemporalClause(OMPNontemporalClause * C)10068 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10069   llvm::SmallVector<Expr *, 16> Vars;
10070   Vars.reserve(C->varlist_size());
10071   for (auto *VE : C->varlists()) {
10072     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10073     if (EVar.isInvalid())
10074       return nullptr;
10075     Vars.push_back(EVar.get());
10076   }
10077   return getDerived().RebuildOMPNontemporalClause(
10078       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10079 }
10080 
10081 template <typename Derived>
10082 OMPClause *
TransformOMPInclusiveClause(OMPInclusiveClause * C)10083 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10084   llvm::SmallVector<Expr *, 16> Vars;
10085   Vars.reserve(C->varlist_size());
10086   for (auto *VE : C->varlists()) {
10087     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10088     if (EVar.isInvalid())
10089       return nullptr;
10090     Vars.push_back(EVar.get());
10091   }
10092   return getDerived().RebuildOMPInclusiveClause(
10093       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10094 }
10095 
10096 template <typename Derived>
10097 OMPClause *
TransformOMPExclusiveClause(OMPExclusiveClause * C)10098 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10099   llvm::SmallVector<Expr *, 16> Vars;
10100   Vars.reserve(C->varlist_size());
10101   for (auto *VE : C->varlists()) {
10102     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10103     if (EVar.isInvalid())
10104       return nullptr;
10105     Vars.push_back(EVar.get());
10106   }
10107   return getDerived().RebuildOMPExclusiveClause(
10108       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10109 }
10110 
10111 template <typename Derived>
TransformOMPUsesAllocatorsClause(OMPUsesAllocatorsClause * C)10112 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10113     OMPUsesAllocatorsClause *C) {
10114   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10115   Data.reserve(C->getNumberOfAllocators());
10116   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10117     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10118     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10119     if (Allocator.isInvalid())
10120       continue;
10121     ExprResult AllocatorTraits;
10122     if (Expr *AT = D.AllocatorTraits) {
10123       AllocatorTraits = getDerived().TransformExpr(AT);
10124       if (AllocatorTraits.isInvalid())
10125         continue;
10126     }
10127     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10128     NewD.Allocator = Allocator.get();
10129     NewD.AllocatorTraits = AllocatorTraits.get();
10130     NewD.LParenLoc = D.LParenLoc;
10131     NewD.RParenLoc = D.RParenLoc;
10132   }
10133   return getDerived().RebuildOMPUsesAllocatorsClause(
10134       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10135 }
10136 
10137 template <typename Derived>
10138 OMPClause *
TransformOMPAffinityClause(OMPAffinityClause * C)10139 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10140   SmallVector<Expr *, 4> Locators;
10141   Locators.reserve(C->varlist_size());
10142   ExprResult ModifierRes;
10143   if (Expr *Modifier = C->getModifier()) {
10144     ModifierRes = getDerived().TransformExpr(Modifier);
10145     if (ModifierRes.isInvalid())
10146       return nullptr;
10147   }
10148   for (Expr *E : C->varlists()) {
10149     ExprResult Locator = getDerived().TransformExpr(E);
10150     if (Locator.isInvalid())
10151       continue;
10152     Locators.push_back(Locator.get());
10153   }
10154   return getDerived().RebuildOMPAffinityClause(
10155       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10156       ModifierRes.get(), Locators);
10157 }
10158 
10159 template <typename Derived>
TransformOMPOrderClause(OMPOrderClause * C)10160 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10161   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10162                                             C->getBeginLoc(), C->getLParenLoc(),
10163                                             C->getEndLoc());
10164 }
10165 
10166 //===----------------------------------------------------------------------===//
10167 // Expression transformation
10168 //===----------------------------------------------------------------------===//
10169 template<typename Derived>
10170 ExprResult
TransformConstantExpr(ConstantExpr * E)10171 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10172   return TransformExpr(E->getSubExpr());
10173 }
10174 
10175 template<typename Derived>
10176 ExprResult
TransformPredefinedExpr(PredefinedExpr * E)10177 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10178   if (!E->isTypeDependent())
10179     return E;
10180 
10181   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10182                                             E->getIdentKind());
10183 }
10184 
10185 template<typename Derived>
10186 ExprResult
TransformDeclRefExpr(DeclRefExpr * E)10187 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10188   NestedNameSpecifierLoc QualifierLoc;
10189   if (E->getQualifierLoc()) {
10190     QualifierLoc
10191       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10192     if (!QualifierLoc)
10193       return ExprError();
10194   }
10195 
10196   ValueDecl *ND
10197     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10198                                                          E->getDecl()));
10199   if (!ND)
10200     return ExprError();
10201 
10202   NamedDecl *Found = ND;
10203   if (E->getFoundDecl() != E->getDecl()) {
10204     Found = cast_or_null<NamedDecl>(
10205         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10206     if (!Found)
10207       return ExprError();
10208   }
10209 
10210   DeclarationNameInfo NameInfo = E->getNameInfo();
10211   if (NameInfo.getName()) {
10212     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10213     if (!NameInfo.getName())
10214       return ExprError();
10215   }
10216 
10217   if (!getDerived().AlwaysRebuild() &&
10218       QualifierLoc == E->getQualifierLoc() &&
10219       ND == E->getDecl() &&
10220       Found == E->getFoundDecl() &&
10221       NameInfo.getName() == E->getDecl()->getDeclName() &&
10222       !E->hasExplicitTemplateArgs()) {
10223 
10224     // Mark it referenced in the new context regardless.
10225     // FIXME: this is a bit instantiation-specific.
10226     SemaRef.MarkDeclRefReferenced(E);
10227 
10228     return E;
10229   }
10230 
10231   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10232   if (E->hasExplicitTemplateArgs()) {
10233     TemplateArgs = &TransArgs;
10234     TransArgs.setLAngleLoc(E->getLAngleLoc());
10235     TransArgs.setRAngleLoc(E->getRAngleLoc());
10236     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10237                                                 E->getNumTemplateArgs(),
10238                                                 TransArgs))
10239       return ExprError();
10240   }
10241 
10242   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10243                                          Found, TemplateArgs);
10244 }
10245 
10246 template<typename Derived>
10247 ExprResult
TransformIntegerLiteral(IntegerLiteral * E)10248 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10249   return E;
10250 }
10251 
10252 template <typename Derived>
TransformFixedPointLiteral(FixedPointLiteral * E)10253 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10254     FixedPointLiteral *E) {
10255   return E;
10256 }
10257 
10258 template<typename Derived>
10259 ExprResult
TransformFloatingLiteral(FloatingLiteral * E)10260 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10261   return E;
10262 }
10263 
10264 template<typename Derived>
10265 ExprResult
TransformImaginaryLiteral(ImaginaryLiteral * E)10266 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10267   return E;
10268 }
10269 
10270 template<typename Derived>
10271 ExprResult
TransformStringLiteral(StringLiteral * E)10272 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10273   return E;
10274 }
10275 
10276 template<typename Derived>
10277 ExprResult
TransformCharacterLiteral(CharacterLiteral * E)10278 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10279   return E;
10280 }
10281 
10282 template<typename Derived>
10283 ExprResult
TransformUserDefinedLiteral(UserDefinedLiteral * E)10284 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10285   if (FunctionDecl *FD = E->getDirectCallee())
10286     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10287   return SemaRef.MaybeBindToTemporary(E);
10288 }
10289 
10290 template<typename Derived>
10291 ExprResult
TransformGenericSelectionExpr(GenericSelectionExpr * E)10292 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10293   ExprResult ControllingExpr =
10294     getDerived().TransformExpr(E->getControllingExpr());
10295   if (ControllingExpr.isInvalid())
10296     return ExprError();
10297 
10298   SmallVector<Expr *, 4> AssocExprs;
10299   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10300   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10301     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10302     if (TSI) {
10303       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10304       if (!AssocType)
10305         return ExprError();
10306       AssocTypes.push_back(AssocType);
10307     } else {
10308       AssocTypes.push_back(nullptr);
10309     }
10310 
10311     ExprResult AssocExpr =
10312         getDerived().TransformExpr(Assoc.getAssociationExpr());
10313     if (AssocExpr.isInvalid())
10314       return ExprError();
10315     AssocExprs.push_back(AssocExpr.get());
10316   }
10317 
10318   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10319                                                   E->getDefaultLoc(),
10320                                                   E->getRParenLoc(),
10321                                                   ControllingExpr.get(),
10322                                                   AssocTypes,
10323                                                   AssocExprs);
10324 }
10325 
10326 template<typename Derived>
10327 ExprResult
TransformParenExpr(ParenExpr * E)10328 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10329   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10330   if (SubExpr.isInvalid())
10331     return ExprError();
10332 
10333   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10334     return E;
10335 
10336   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10337                                        E->getRParen());
10338 }
10339 
10340 /// The operand of a unary address-of operator has special rules: it's
10341 /// allowed to refer to a non-static member of a class even if there's no 'this'
10342 /// object available.
10343 template<typename Derived>
10344 ExprResult
TransformAddressOfOperand(Expr * E)10345 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10346   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10347     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10348   else
10349     return getDerived().TransformExpr(E);
10350 }
10351 
10352 template<typename Derived>
10353 ExprResult
TransformUnaryOperator(UnaryOperator * E)10354 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10355   ExprResult SubExpr;
10356   if (E->getOpcode() == UO_AddrOf)
10357     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10358   else
10359     SubExpr = TransformExpr(E->getSubExpr());
10360   if (SubExpr.isInvalid())
10361     return ExprError();
10362 
10363   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10364     return E;
10365 
10366   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10367                                            E->getOpcode(),
10368                                            SubExpr.get());
10369 }
10370 
10371 template<typename Derived>
10372 ExprResult
TransformOffsetOfExpr(OffsetOfExpr * E)10373 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10374   // Transform the type.
10375   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10376   if (!Type)
10377     return ExprError();
10378 
10379   // Transform all of the components into components similar to what the
10380   // parser uses.
10381   // FIXME: It would be slightly more efficient in the non-dependent case to
10382   // just map FieldDecls, rather than requiring the rebuilder to look for
10383   // the fields again. However, __builtin_offsetof is rare enough in
10384   // template code that we don't care.
10385   bool ExprChanged = false;
10386   typedef Sema::OffsetOfComponent Component;
10387   SmallVector<Component, 4> Components;
10388   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10389     const OffsetOfNode &ON = E->getComponent(I);
10390     Component Comp;
10391     Comp.isBrackets = true;
10392     Comp.LocStart = ON.getSourceRange().getBegin();
10393     Comp.LocEnd = ON.getSourceRange().getEnd();
10394     switch (ON.getKind()) {
10395     case OffsetOfNode::Array: {
10396       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10397       ExprResult Index = getDerived().TransformExpr(FromIndex);
10398       if (Index.isInvalid())
10399         return ExprError();
10400 
10401       ExprChanged = ExprChanged || Index.get() != FromIndex;
10402       Comp.isBrackets = true;
10403       Comp.U.E = Index.get();
10404       break;
10405     }
10406 
10407     case OffsetOfNode::Field:
10408     case OffsetOfNode::Identifier:
10409       Comp.isBrackets = false;
10410       Comp.U.IdentInfo = ON.getFieldName();
10411       if (!Comp.U.IdentInfo)
10412         continue;
10413 
10414       break;
10415 
10416     case OffsetOfNode::Base:
10417       // Will be recomputed during the rebuild.
10418       continue;
10419     }
10420 
10421     Components.push_back(Comp);
10422   }
10423 
10424   // If nothing changed, retain the existing expression.
10425   if (!getDerived().AlwaysRebuild() &&
10426       Type == E->getTypeSourceInfo() &&
10427       !ExprChanged)
10428     return E;
10429 
10430   // Build a new offsetof expression.
10431   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10432                                           Components, E->getRParenLoc());
10433 }
10434 
10435 template<typename Derived>
10436 ExprResult
TransformOpaqueValueExpr(OpaqueValueExpr * E)10437 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10438   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10439          "opaque value expression requires transformation");
10440   return E;
10441 }
10442 
10443 template<typename Derived>
10444 ExprResult
TransformTypoExpr(TypoExpr * E)10445 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10446   return E;
10447 }
10448 
10449 template <typename Derived>
TransformRecoveryExpr(RecoveryExpr * E)10450 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10451   llvm::SmallVector<Expr *, 8> Children;
10452   bool Changed = false;
10453   for (Expr *C : E->subExpressions()) {
10454     ExprResult NewC = getDerived().TransformExpr(C);
10455     if (NewC.isInvalid())
10456       return ExprError();
10457     Children.push_back(NewC.get());
10458 
10459     Changed |= NewC.get() != C;
10460   }
10461   if (!getDerived().AlwaysRebuild() && !Changed)
10462     return E;
10463   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10464                                           Children, E->getType());
10465 }
10466 
10467 template<typename Derived>
10468 ExprResult
TransformPseudoObjectExpr(PseudoObjectExpr * E)10469 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10470   // Rebuild the syntactic form.  The original syntactic form has
10471   // opaque-value expressions in it, so strip those away and rebuild
10472   // the result.  This is a really awful way of doing this, but the
10473   // better solution (rebuilding the semantic expressions and
10474   // rebinding OVEs as necessary) doesn't work; we'd need
10475   // TreeTransform to not strip away implicit conversions.
10476   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10477   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10478   if (result.isInvalid()) return ExprError();
10479 
10480   // If that gives us a pseudo-object result back, the pseudo-object
10481   // expression must have been an lvalue-to-rvalue conversion which we
10482   // should reapply.
10483   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10484     result = SemaRef.checkPseudoObjectRValue(result.get());
10485 
10486   return result;
10487 }
10488 
10489 template<typename Derived>
10490 ExprResult
TransformUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)10491 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10492                                                 UnaryExprOrTypeTraitExpr *E) {
10493   if (E->isArgumentType()) {
10494     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10495 
10496     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10497     if (!NewT)
10498       return ExprError();
10499 
10500     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10501       return E;
10502 
10503     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10504                                                     E->getKind(),
10505                                                     E->getSourceRange());
10506   }
10507 
10508   // C++0x [expr.sizeof]p1:
10509   //   The operand is either an expression, which is an unevaluated operand
10510   //   [...]
10511   EnterExpressionEvaluationContext Unevaluated(
10512       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10513       Sema::ReuseLambdaContextDecl);
10514 
10515   // Try to recover if we have something like sizeof(T::X) where X is a type.
10516   // Notably, there must be *exactly* one set of parens if X is a type.
10517   TypeSourceInfo *RecoveryTSI = nullptr;
10518   ExprResult SubExpr;
10519   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10520   if (auto *DRE =
10521           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10522     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10523         PE, DRE, false, &RecoveryTSI);
10524   else
10525     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10526 
10527   if (RecoveryTSI) {
10528     return getDerived().RebuildUnaryExprOrTypeTrait(
10529         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10530   } else if (SubExpr.isInvalid())
10531     return ExprError();
10532 
10533   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10534     return E;
10535 
10536   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10537                                                   E->getOperatorLoc(),
10538                                                   E->getKind(),
10539                                                   E->getSourceRange());
10540 }
10541 
10542 template<typename Derived>
10543 ExprResult
TransformArraySubscriptExpr(ArraySubscriptExpr * E)10544 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10545   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10546   if (LHS.isInvalid())
10547     return ExprError();
10548 
10549   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10550   if (RHS.isInvalid())
10551     return ExprError();
10552 
10553 
10554   if (!getDerived().AlwaysRebuild() &&
10555       LHS.get() == E->getLHS() &&
10556       RHS.get() == E->getRHS())
10557     return E;
10558 
10559   return getDerived().RebuildArraySubscriptExpr(
10560       LHS.get(),
10561       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10562 }
10563 
10564 template <typename Derived>
10565 ExprResult
TransformMatrixSubscriptExpr(MatrixSubscriptExpr * E)10566 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10567   ExprResult Base = getDerived().TransformExpr(E->getBase());
10568   if (Base.isInvalid())
10569     return ExprError();
10570 
10571   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10572   if (RowIdx.isInvalid())
10573     return ExprError();
10574 
10575   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10576   if (ColumnIdx.isInvalid())
10577     return ExprError();
10578 
10579   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10580       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10581     return E;
10582 
10583   return getDerived().RebuildMatrixSubscriptExpr(
10584       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10585 }
10586 
10587 template <typename Derived>
10588 ExprResult
TransformOMPArraySectionExpr(OMPArraySectionExpr * E)10589 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10590   ExprResult Base = getDerived().TransformExpr(E->getBase());
10591   if (Base.isInvalid())
10592     return ExprError();
10593 
10594   ExprResult LowerBound;
10595   if (E->getLowerBound()) {
10596     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10597     if (LowerBound.isInvalid())
10598       return ExprError();
10599   }
10600 
10601   ExprResult Length;
10602   if (E->getLength()) {
10603     Length = getDerived().TransformExpr(E->getLength());
10604     if (Length.isInvalid())
10605       return ExprError();
10606   }
10607 
10608   ExprResult Stride;
10609   if (Expr *Str = E->getStride()) {
10610     Stride = getDerived().TransformExpr(Str);
10611     if (Stride.isInvalid())
10612       return ExprError();
10613   }
10614 
10615   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10616       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10617     return E;
10618 
10619   return getDerived().RebuildOMPArraySectionExpr(
10620       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10621       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10622       E->getRBracketLoc());
10623 }
10624 
10625 template <typename Derived>
10626 ExprResult
TransformOMPArrayShapingExpr(OMPArrayShapingExpr * E)10627 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10628   ExprResult Base = getDerived().TransformExpr(E->getBase());
10629   if (Base.isInvalid())
10630     return ExprError();
10631 
10632   SmallVector<Expr *, 4> Dims;
10633   bool ErrorFound = false;
10634   for (Expr *Dim : E->getDimensions()) {
10635     ExprResult DimRes = getDerived().TransformExpr(Dim);
10636     if (DimRes.isInvalid()) {
10637       ErrorFound = true;
10638       continue;
10639     }
10640     Dims.push_back(DimRes.get());
10641   }
10642 
10643   if (ErrorFound)
10644     return ExprError();
10645   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10646                                                  E->getRParenLoc(), Dims,
10647                                                  E->getBracketsRanges());
10648 }
10649 
10650 template <typename Derived>
10651 ExprResult
TransformOMPIteratorExpr(OMPIteratorExpr * E)10652 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10653   unsigned NumIterators = E->numOfIterators();
10654   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10655 
10656   bool ErrorFound = false;
10657   bool NeedToRebuild = getDerived().AlwaysRebuild();
10658   for (unsigned I = 0; I < NumIterators; ++I) {
10659     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10660     Data[I].DeclIdent = D->getIdentifier();
10661     Data[I].DeclIdentLoc = D->getLocation();
10662     if (D->getLocation() == D->getBeginLoc()) {
10663       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10664              "Implicit type must be int.");
10665     } else {
10666       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10667       QualType DeclTy = getDerived().TransformType(D->getType());
10668       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10669     }
10670     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10671     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10672     ExprResult End = getDerived().TransformExpr(Range.End);
10673     ExprResult Step = getDerived().TransformExpr(Range.Step);
10674     ErrorFound = ErrorFound ||
10675                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10676                                                !Data[I].Type.get().isNull())) ||
10677                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10678     if (ErrorFound)
10679       continue;
10680     Data[I].Range.Begin = Begin.get();
10681     Data[I].Range.End = End.get();
10682     Data[I].Range.Step = Step.get();
10683     Data[I].AssignLoc = E->getAssignLoc(I);
10684     Data[I].ColonLoc = E->getColonLoc(I);
10685     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10686     NeedToRebuild =
10687         NeedToRebuild ||
10688         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10689                                        D->getType().getTypePtrOrNull()) ||
10690         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10691         Range.Step != Data[I].Range.Step;
10692   }
10693   if (ErrorFound)
10694     return ExprError();
10695   if (!NeedToRebuild)
10696     return E;
10697 
10698   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10699       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10700   if (!Res.isUsable())
10701     return Res;
10702   auto *IE = cast<OMPIteratorExpr>(Res.get());
10703   for (unsigned I = 0; I < NumIterators; ++I)
10704     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10705                                       IE->getIteratorDecl(I));
10706   return Res;
10707 }
10708 
10709 template<typename Derived>
10710 ExprResult
TransformCallExpr(CallExpr * E)10711 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10712   // Transform the callee.
10713   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10714   if (Callee.isInvalid())
10715     return ExprError();
10716 
10717   // Transform arguments.
10718   bool ArgChanged = false;
10719   SmallVector<Expr*, 8> Args;
10720   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10721                                   &ArgChanged))
10722     return ExprError();
10723 
10724   if (!getDerived().AlwaysRebuild() &&
10725       Callee.get() == E->getCallee() &&
10726       !ArgChanged)
10727     return SemaRef.MaybeBindToTemporary(E);
10728 
10729   // FIXME: Wrong source location information for the '('.
10730   SourceLocation FakeLParenLoc
10731     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10732 
10733   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10734   if (E->hasStoredFPFeatures()) {
10735     FPOptionsOverride NewOverrides = E->getFPFeatures();
10736     getSema().CurFPFeatures =
10737         NewOverrides.applyOverrides(getSema().getLangOpts());
10738     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10739   }
10740 
10741   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10742                                       Args,
10743                                       E->getRParenLoc());
10744 }
10745 
10746 template<typename Derived>
10747 ExprResult
TransformMemberExpr(MemberExpr * E)10748 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10749   ExprResult Base = getDerived().TransformExpr(E->getBase());
10750   if (Base.isInvalid())
10751     return ExprError();
10752 
10753   NestedNameSpecifierLoc QualifierLoc;
10754   if (E->hasQualifier()) {
10755     QualifierLoc
10756       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10757 
10758     if (!QualifierLoc)
10759       return ExprError();
10760   }
10761   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10762 
10763   ValueDecl *Member
10764     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10765                                                          E->getMemberDecl()));
10766   if (!Member)
10767     return ExprError();
10768 
10769   NamedDecl *FoundDecl = E->getFoundDecl();
10770   if (FoundDecl == E->getMemberDecl()) {
10771     FoundDecl = Member;
10772   } else {
10773     FoundDecl = cast_or_null<NamedDecl>(
10774                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10775     if (!FoundDecl)
10776       return ExprError();
10777   }
10778 
10779   if (!getDerived().AlwaysRebuild() &&
10780       Base.get() == E->getBase() &&
10781       QualifierLoc == E->getQualifierLoc() &&
10782       Member == E->getMemberDecl() &&
10783       FoundDecl == E->getFoundDecl() &&
10784       !E->hasExplicitTemplateArgs()) {
10785 
10786     // Mark it referenced in the new context regardless.
10787     // FIXME: this is a bit instantiation-specific.
10788     SemaRef.MarkMemberReferenced(E);
10789 
10790     return E;
10791   }
10792 
10793   TemplateArgumentListInfo TransArgs;
10794   if (E->hasExplicitTemplateArgs()) {
10795     TransArgs.setLAngleLoc(E->getLAngleLoc());
10796     TransArgs.setRAngleLoc(E->getRAngleLoc());
10797     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10798                                                 E->getNumTemplateArgs(),
10799                                                 TransArgs))
10800       return ExprError();
10801   }
10802 
10803   // FIXME: Bogus source location for the operator
10804   SourceLocation FakeOperatorLoc =
10805       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10806 
10807   // FIXME: to do this check properly, we will need to preserve the
10808   // first-qualifier-in-scope here, just in case we had a dependent
10809   // base (and therefore couldn't do the check) and a
10810   // nested-name-qualifier (and therefore could do the lookup).
10811   NamedDecl *FirstQualifierInScope = nullptr;
10812   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10813   if (MemberNameInfo.getName()) {
10814     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10815     if (!MemberNameInfo.getName())
10816       return ExprError();
10817   }
10818 
10819   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10820                                         E->isArrow(),
10821                                         QualifierLoc,
10822                                         TemplateKWLoc,
10823                                         MemberNameInfo,
10824                                         Member,
10825                                         FoundDecl,
10826                                         (E->hasExplicitTemplateArgs()
10827                                            ? &TransArgs : nullptr),
10828                                         FirstQualifierInScope);
10829 }
10830 
10831 template<typename Derived>
10832 ExprResult
TransformBinaryOperator(BinaryOperator * E)10833 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10834   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10835   if (LHS.isInvalid())
10836     return ExprError();
10837 
10838   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10839   if (RHS.isInvalid())
10840     return ExprError();
10841 
10842   if (!getDerived().AlwaysRebuild() &&
10843       LHS.get() == E->getLHS() &&
10844       RHS.get() == E->getRHS())
10845     return E;
10846 
10847   if (E->isCompoundAssignmentOp())
10848     // FPFeatures has already been established from trailing storage
10849     return getDerived().RebuildBinaryOperator(
10850         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10851   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10852   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10853   getSema().CurFPFeatures =
10854       NewOverrides.applyOverrides(getSema().getLangOpts());
10855   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10856   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10857                                             LHS.get(), RHS.get());
10858 }
10859 
10860 template <typename Derived>
TransformCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator * E)10861 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10862     CXXRewrittenBinaryOperator *E) {
10863   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10864 
10865   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10866   if (LHS.isInvalid())
10867     return ExprError();
10868 
10869   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10870   if (RHS.isInvalid())
10871     return ExprError();
10872 
10873   if (!getDerived().AlwaysRebuild() &&
10874       LHS.get() == Decomp.LHS &&
10875       RHS.get() == Decomp.RHS)
10876     return E;
10877 
10878   // Extract the already-resolved callee declarations so that we can restrict
10879   // ourselves to using them as the unqualified lookup results when rebuilding.
10880   UnresolvedSet<2> UnqualLookups;
10881   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10882                             const_cast<Expr *>(Decomp.InnerBinOp)};
10883   for (Expr *PossibleBinOp : PossibleBinOps) {
10884     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10885     if (!Op)
10886       continue;
10887     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10888     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10889       continue;
10890 
10891     // Transform the callee in case we built a call to a local extern
10892     // declaration.
10893     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10894         E->getOperatorLoc(), Callee->getFoundDecl()));
10895     if (!Found)
10896       return ExprError();
10897     UnqualLookups.addDecl(Found);
10898   }
10899 
10900   return getDerived().RebuildCXXRewrittenBinaryOperator(
10901       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10902 }
10903 
10904 template<typename Derived>
10905 ExprResult
TransformCompoundAssignOperator(CompoundAssignOperator * E)10906 TreeTransform<Derived>::TransformCompoundAssignOperator(
10907                                                       CompoundAssignOperator *E) {
10908   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10909   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10910   getSema().CurFPFeatures =
10911       NewOverrides.applyOverrides(getSema().getLangOpts());
10912   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10913   return getDerived().TransformBinaryOperator(E);
10914 }
10915 
10916 template<typename Derived>
10917 ExprResult TreeTransform<Derived>::
TransformBinaryConditionalOperator(BinaryConditionalOperator * e)10918 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10919   // Just rebuild the common and RHS expressions and see whether we
10920   // get any changes.
10921 
10922   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10923   if (commonExpr.isInvalid())
10924     return ExprError();
10925 
10926   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10927   if (rhs.isInvalid())
10928     return ExprError();
10929 
10930   if (!getDerived().AlwaysRebuild() &&
10931       commonExpr.get() == e->getCommon() &&
10932       rhs.get() == e->getFalseExpr())
10933     return e;
10934 
10935   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10936                                                  e->getQuestionLoc(),
10937                                                  nullptr,
10938                                                  e->getColonLoc(),
10939                                                  rhs.get());
10940 }
10941 
10942 template<typename Derived>
10943 ExprResult
TransformConditionalOperator(ConditionalOperator * E)10944 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10945   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10946   if (Cond.isInvalid())
10947     return ExprError();
10948 
10949   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10950   if (LHS.isInvalid())
10951     return ExprError();
10952 
10953   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10954   if (RHS.isInvalid())
10955     return ExprError();
10956 
10957   if (!getDerived().AlwaysRebuild() &&
10958       Cond.get() == E->getCond() &&
10959       LHS.get() == E->getLHS() &&
10960       RHS.get() == E->getRHS())
10961     return E;
10962 
10963   return getDerived().RebuildConditionalOperator(Cond.get(),
10964                                                  E->getQuestionLoc(),
10965                                                  LHS.get(),
10966                                                  E->getColonLoc(),
10967                                                  RHS.get());
10968 }
10969 
10970 template<typename Derived>
10971 ExprResult
TransformImplicitCastExpr(ImplicitCastExpr * E)10972 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10973   // Implicit casts are eliminated during transformation, since they
10974   // will be recomputed by semantic analysis after transformation.
10975   return getDerived().TransformExpr(E->getSubExprAsWritten());
10976 }
10977 
10978 template<typename Derived>
10979 ExprResult
TransformCStyleCastExpr(CStyleCastExpr * E)10980 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10981   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10982   if (!Type)
10983     return ExprError();
10984 
10985   ExprResult SubExpr
10986     = getDerived().TransformExpr(E->getSubExprAsWritten());
10987   if (SubExpr.isInvalid())
10988     return ExprError();
10989 
10990   if (!getDerived().AlwaysRebuild() &&
10991       Type == E->getTypeInfoAsWritten() &&
10992       SubExpr.get() == E->getSubExpr())
10993     return E;
10994 
10995   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10996                                             Type,
10997                                             E->getRParenLoc(),
10998                                             SubExpr.get());
10999 }
11000 
11001 template<typename Derived>
11002 ExprResult
TransformCompoundLiteralExpr(CompoundLiteralExpr * E)11003 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11004   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11005   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11006   if (!NewT)
11007     return ExprError();
11008 
11009   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11010   if (Init.isInvalid())
11011     return ExprError();
11012 
11013   if (!getDerived().AlwaysRebuild() &&
11014       OldT == NewT &&
11015       Init.get() == E->getInitializer())
11016     return SemaRef.MaybeBindToTemporary(E);
11017 
11018   // Note: the expression type doesn't necessarily match the
11019   // type-as-written, but that's okay, because it should always be
11020   // derivable from the initializer.
11021 
11022   return getDerived().RebuildCompoundLiteralExpr(
11023       E->getLParenLoc(), NewT,
11024       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11025 }
11026 
11027 template<typename Derived>
11028 ExprResult
TransformExtVectorElementExpr(ExtVectorElementExpr * E)11029 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11030   ExprResult Base = getDerived().TransformExpr(E->getBase());
11031   if (Base.isInvalid())
11032     return ExprError();
11033 
11034   if (!getDerived().AlwaysRebuild() &&
11035       Base.get() == E->getBase())
11036     return E;
11037 
11038   // FIXME: Bad source location
11039   SourceLocation FakeOperatorLoc =
11040       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11041   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11042                                                   E->getAccessorLoc(),
11043                                                   E->getAccessor());
11044 }
11045 
11046 template<typename Derived>
11047 ExprResult
TransformInitListExpr(InitListExpr * E)11048 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11049   if (InitListExpr *Syntactic = E->getSyntacticForm())
11050     E = Syntactic;
11051 
11052   bool InitChanged = false;
11053 
11054   EnterExpressionEvaluationContext Context(
11055       getSema(), EnterExpressionEvaluationContext::InitList);
11056 
11057   SmallVector<Expr*, 4> Inits;
11058   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11059                                   Inits, &InitChanged))
11060     return ExprError();
11061 
11062   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11063     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11064     // in some cases. We can't reuse it in general, because the syntactic and
11065     // semantic forms are linked, and we can't know that semantic form will
11066     // match even if the syntactic form does.
11067   }
11068 
11069   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11070                                       E->getRBraceLoc());
11071 }
11072 
11073 template<typename Derived>
11074 ExprResult
TransformDesignatedInitExpr(DesignatedInitExpr * E)11075 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11076   Designation Desig;
11077 
11078   // transform the initializer value
11079   ExprResult Init = getDerived().TransformExpr(E->getInit());
11080   if (Init.isInvalid())
11081     return ExprError();
11082 
11083   // transform the designators.
11084   SmallVector<Expr*, 4> ArrayExprs;
11085   bool ExprChanged = false;
11086   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11087     if (D.isFieldDesignator()) {
11088       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11089                                                D.getDotLoc(),
11090                                                D.getFieldLoc()));
11091       if (D.getField()) {
11092         FieldDecl *Field = cast_or_null<FieldDecl>(
11093             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11094         if (Field != D.getField())
11095           // Rebuild the expression when the transformed FieldDecl is
11096           // different to the already assigned FieldDecl.
11097           ExprChanged = true;
11098       } else {
11099         // Ensure that the designator expression is rebuilt when there isn't
11100         // a resolved FieldDecl in the designator as we don't want to assign
11101         // a FieldDecl to a pattern designator that will be instantiated again.
11102         ExprChanged = true;
11103       }
11104       continue;
11105     }
11106 
11107     if (D.isArrayDesignator()) {
11108       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11109       if (Index.isInvalid())
11110         return ExprError();
11111 
11112       Desig.AddDesignator(
11113           Designator::getArray(Index.get(), D.getLBracketLoc()));
11114 
11115       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11116       ArrayExprs.push_back(Index.get());
11117       continue;
11118     }
11119 
11120     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11121     ExprResult Start
11122       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11123     if (Start.isInvalid())
11124       return ExprError();
11125 
11126     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11127     if (End.isInvalid())
11128       return ExprError();
11129 
11130     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11131                                                   End.get(),
11132                                                   D.getLBracketLoc(),
11133                                                   D.getEllipsisLoc()));
11134 
11135     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11136                   End.get() != E->getArrayRangeEnd(D);
11137 
11138     ArrayExprs.push_back(Start.get());
11139     ArrayExprs.push_back(End.get());
11140   }
11141 
11142   if (!getDerived().AlwaysRebuild() &&
11143       Init.get() == E->getInit() &&
11144       !ExprChanged)
11145     return E;
11146 
11147   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11148                                                 E->getEqualOrColonLoc(),
11149                                                 E->usesGNUSyntax(), Init.get());
11150 }
11151 
11152 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11153 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11154 template<typename Derived>
11155 ExprResult
TransformDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)11156 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11157     DesignatedInitUpdateExpr *E) {
11158   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11159                    "initializer");
11160   return ExprError();
11161 }
11162 
11163 template<typename Derived>
11164 ExprResult
TransformNoInitExpr(NoInitExpr * E)11165 TreeTransform<Derived>::TransformNoInitExpr(
11166     NoInitExpr *E) {
11167   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11168   return ExprError();
11169 }
11170 
11171 template<typename Derived>
11172 ExprResult
TransformArrayInitLoopExpr(ArrayInitLoopExpr * E)11173 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11174   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11175   return ExprError();
11176 }
11177 
11178 template<typename Derived>
11179 ExprResult
TransformArrayInitIndexExpr(ArrayInitIndexExpr * E)11180 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11181   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11182   return ExprError();
11183 }
11184 
11185 template<typename Derived>
11186 ExprResult
TransformImplicitValueInitExpr(ImplicitValueInitExpr * E)11187 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11188                                                      ImplicitValueInitExpr *E) {
11189   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11190 
11191   // FIXME: Will we ever have proper type location here? Will we actually
11192   // need to transform the type?
11193   QualType T = getDerived().TransformType(E->getType());
11194   if (T.isNull())
11195     return ExprError();
11196 
11197   if (!getDerived().AlwaysRebuild() &&
11198       T == E->getType())
11199     return E;
11200 
11201   return getDerived().RebuildImplicitValueInitExpr(T);
11202 }
11203 
11204 template<typename Derived>
11205 ExprResult
TransformVAArgExpr(VAArgExpr * E)11206 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11207   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11208   if (!TInfo)
11209     return ExprError();
11210 
11211   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11212   if (SubExpr.isInvalid())
11213     return ExprError();
11214 
11215   if (!getDerived().AlwaysRebuild() &&
11216       TInfo == E->getWrittenTypeInfo() &&
11217       SubExpr.get() == E->getSubExpr())
11218     return E;
11219 
11220   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11221                                        TInfo, E->getRParenLoc());
11222 }
11223 
11224 template<typename Derived>
11225 ExprResult
TransformParenListExpr(ParenListExpr * E)11226 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11227   bool ArgumentChanged = false;
11228   SmallVector<Expr*, 4> Inits;
11229   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11230                      &ArgumentChanged))
11231     return ExprError();
11232 
11233   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11234                                            Inits,
11235                                            E->getRParenLoc());
11236 }
11237 
11238 /// Transform an address-of-label expression.
11239 ///
11240 /// By default, the transformation of an address-of-label expression always
11241 /// rebuilds the expression, so that the label identifier can be resolved to
11242 /// the corresponding label statement by semantic analysis.
11243 template<typename Derived>
11244 ExprResult
TransformAddrLabelExpr(AddrLabelExpr * E)11245 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11246   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11247                                         E->getLabel());
11248   if (!LD)
11249     return ExprError();
11250 
11251   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11252                                            cast<LabelDecl>(LD));
11253 }
11254 
11255 template<typename Derived>
11256 ExprResult
TransformStmtExpr(StmtExpr * E)11257 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11258   SemaRef.ActOnStartStmtExpr();
11259   StmtResult SubStmt
11260     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11261   if (SubStmt.isInvalid()) {
11262     SemaRef.ActOnStmtExprError();
11263     return ExprError();
11264   }
11265 
11266   unsigned OldDepth = E->getTemplateDepth();
11267   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11268 
11269   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11270       SubStmt.get() == E->getSubStmt()) {
11271     // Calling this an 'error' is unintuitive, but it does the right thing.
11272     SemaRef.ActOnStmtExprError();
11273     return SemaRef.MaybeBindToTemporary(E);
11274   }
11275 
11276   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11277                                       E->getRParenLoc(), NewDepth);
11278 }
11279 
11280 template<typename Derived>
11281 ExprResult
TransformChooseExpr(ChooseExpr * E)11282 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11283   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11284   if (Cond.isInvalid())
11285     return ExprError();
11286 
11287   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11288   if (LHS.isInvalid())
11289     return ExprError();
11290 
11291   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11292   if (RHS.isInvalid())
11293     return ExprError();
11294 
11295   if (!getDerived().AlwaysRebuild() &&
11296       Cond.get() == E->getCond() &&
11297       LHS.get() == E->getLHS() &&
11298       RHS.get() == E->getRHS())
11299     return E;
11300 
11301   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11302                                         Cond.get(), LHS.get(), RHS.get(),
11303                                         E->getRParenLoc());
11304 }
11305 
11306 template<typename Derived>
11307 ExprResult
TransformGNUNullExpr(GNUNullExpr * E)11308 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11309   return E;
11310 }
11311 
11312 template<typename Derived>
11313 ExprResult
TransformCXXOperatorCallExpr(CXXOperatorCallExpr * E)11314 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11315   switch (E->getOperator()) {
11316   case OO_New:
11317   case OO_Delete:
11318   case OO_Array_New:
11319   case OO_Array_Delete:
11320     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11321 
11322   case OO_Call: {
11323     // This is a call to an object's operator().
11324     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11325 
11326     // Transform the object itself.
11327     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11328     if (Object.isInvalid())
11329       return ExprError();
11330 
11331     // FIXME: Poor location information
11332     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11333         static_cast<Expr *>(Object.get())->getEndLoc());
11334 
11335     // Transform the call arguments.
11336     SmallVector<Expr*, 8> Args;
11337     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11338                                     Args))
11339       return ExprError();
11340 
11341     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11342                                         E->getEndLoc());
11343   }
11344 
11345 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11346   case OO_##Name:
11347 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11348 #include "clang/Basic/OperatorKinds.def"
11349   case OO_Subscript:
11350     // Handled below.
11351     break;
11352 
11353   case OO_Conditional:
11354     llvm_unreachable("conditional operator is not actually overloadable");
11355 
11356   case OO_None:
11357   case NUM_OVERLOADED_OPERATORS:
11358     llvm_unreachable("not an overloaded operator?");
11359   }
11360 
11361   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11362   if (Callee.isInvalid())
11363     return ExprError();
11364 
11365   ExprResult First;
11366   if (E->getOperator() == OO_Amp)
11367     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11368   else
11369     First = getDerived().TransformExpr(E->getArg(0));
11370   if (First.isInvalid())
11371     return ExprError();
11372 
11373   ExprResult Second;
11374   if (E->getNumArgs() == 2) {
11375     Second = getDerived().TransformExpr(E->getArg(1));
11376     if (Second.isInvalid())
11377       return ExprError();
11378   }
11379 
11380   if (!getDerived().AlwaysRebuild() &&
11381       Callee.get() == E->getCallee() &&
11382       First.get() == E->getArg(0) &&
11383       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11384     return SemaRef.MaybeBindToTemporary(E);
11385 
11386   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11387   FPOptionsOverride NewOverrides(E->getFPFeatures());
11388   getSema().CurFPFeatures =
11389       NewOverrides.applyOverrides(getSema().getLangOpts());
11390   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11391 
11392   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11393                                                  E->getOperatorLoc(),
11394                                                  Callee.get(),
11395                                                  First.get(),
11396                                                  Second.get());
11397 }
11398 
11399 template<typename Derived>
11400 ExprResult
TransformCXXMemberCallExpr(CXXMemberCallExpr * E)11401 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11402   return getDerived().TransformCallExpr(E);
11403 }
11404 
11405 template <typename Derived>
TransformSourceLocExpr(SourceLocExpr * E)11406 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11407   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11408                          getSema().CurContext != E->getParentContext();
11409 
11410   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11411     return E;
11412 
11413   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11414                                            E->getEndLoc(),
11415                                            getSema().CurContext);
11416 }
11417 
11418 template<typename Derived>
11419 ExprResult
TransformCUDAKernelCallExpr(CUDAKernelCallExpr * E)11420 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11421   // Transform the callee.
11422   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11423   if (Callee.isInvalid())
11424     return ExprError();
11425 
11426   // Transform exec config.
11427   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11428   if (EC.isInvalid())
11429     return ExprError();
11430 
11431   // Transform arguments.
11432   bool ArgChanged = false;
11433   SmallVector<Expr*, 8> Args;
11434   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11435                                   &ArgChanged))
11436     return ExprError();
11437 
11438   if (!getDerived().AlwaysRebuild() &&
11439       Callee.get() == E->getCallee() &&
11440       !ArgChanged)
11441     return SemaRef.MaybeBindToTemporary(E);
11442 
11443   // FIXME: Wrong source location information for the '('.
11444   SourceLocation FakeLParenLoc
11445     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11446   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11447                                       Args,
11448                                       E->getRParenLoc(), EC.get());
11449 }
11450 
11451 template<typename Derived>
11452 ExprResult
TransformCXXNamedCastExpr(CXXNamedCastExpr * E)11453 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11454   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11455   if (!Type)
11456     return ExprError();
11457 
11458   ExprResult SubExpr
11459     = getDerived().TransformExpr(E->getSubExprAsWritten());
11460   if (SubExpr.isInvalid())
11461     return ExprError();
11462 
11463   if (!getDerived().AlwaysRebuild() &&
11464       Type == E->getTypeInfoAsWritten() &&
11465       SubExpr.get() == E->getSubExpr())
11466     return E;
11467   return getDerived().RebuildCXXNamedCastExpr(
11468       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11469       Type, E->getAngleBrackets().getEnd(),
11470       // FIXME. this should be '(' location
11471       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11472 }
11473 
11474 template<typename Derived>
11475 ExprResult
TransformBuiltinBitCastExpr(BuiltinBitCastExpr * BCE)11476 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11477   TypeSourceInfo *TSI =
11478       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11479   if (!TSI)
11480     return ExprError();
11481 
11482   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11483   if (Sub.isInvalid())
11484     return ExprError();
11485 
11486   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11487                                                 Sub.get(), BCE->getEndLoc());
11488 }
11489 
11490 template<typename Derived>
11491 ExprResult
TransformCXXStaticCastExpr(CXXStaticCastExpr * E)11492 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11493   return getDerived().TransformCXXNamedCastExpr(E);
11494 }
11495 
11496 template<typename Derived>
11497 ExprResult
TransformCXXDynamicCastExpr(CXXDynamicCastExpr * E)11498 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11499   return getDerived().TransformCXXNamedCastExpr(E);
11500 }
11501 
11502 template<typename Derived>
11503 ExprResult
TransformCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)11504 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11505                                                       CXXReinterpretCastExpr *E) {
11506   return getDerived().TransformCXXNamedCastExpr(E);
11507 }
11508 
11509 template<typename Derived>
11510 ExprResult
TransformCXXConstCastExpr(CXXConstCastExpr * E)11511 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11512   return getDerived().TransformCXXNamedCastExpr(E);
11513 }
11514 
11515 template<typename Derived>
11516 ExprResult
TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr * E)11517 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11518   return getDerived().TransformCXXNamedCastExpr(E);
11519 }
11520 
11521 template<typename Derived>
11522 ExprResult
TransformCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)11523 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11524                                                      CXXFunctionalCastExpr *E) {
11525   TypeSourceInfo *Type =
11526       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11527   if (!Type)
11528     return ExprError();
11529 
11530   ExprResult SubExpr
11531     = getDerived().TransformExpr(E->getSubExprAsWritten());
11532   if (SubExpr.isInvalid())
11533     return ExprError();
11534 
11535   if (!getDerived().AlwaysRebuild() &&
11536       Type == E->getTypeInfoAsWritten() &&
11537       SubExpr.get() == E->getSubExpr())
11538     return E;
11539 
11540   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11541                                                    E->getLParenLoc(),
11542                                                    SubExpr.get(),
11543                                                    E->getRParenLoc(),
11544                                                    E->isListInitialization());
11545 }
11546 
11547 template<typename Derived>
11548 ExprResult
TransformCXXTypeidExpr(CXXTypeidExpr * E)11549 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11550   if (E->isTypeOperand()) {
11551     TypeSourceInfo *TInfo
11552       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11553     if (!TInfo)
11554       return ExprError();
11555 
11556     if (!getDerived().AlwaysRebuild() &&
11557         TInfo == E->getTypeOperandSourceInfo())
11558       return E;
11559 
11560     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11561                                              TInfo, E->getEndLoc());
11562   }
11563 
11564   // We don't know whether the subexpression is potentially evaluated until
11565   // after we perform semantic analysis.  We speculatively assume it is
11566   // unevaluated; it will get fixed later if the subexpression is in fact
11567   // potentially evaluated.
11568   EnterExpressionEvaluationContext Unevaluated(
11569       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11570       Sema::ReuseLambdaContextDecl);
11571 
11572   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11573   if (SubExpr.isInvalid())
11574     return ExprError();
11575 
11576   if (!getDerived().AlwaysRebuild() &&
11577       SubExpr.get() == E->getExprOperand())
11578     return E;
11579 
11580   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11581                                            SubExpr.get(), E->getEndLoc());
11582 }
11583 
11584 template<typename Derived>
11585 ExprResult
TransformCXXUuidofExpr(CXXUuidofExpr * E)11586 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11587   if (E->isTypeOperand()) {
11588     TypeSourceInfo *TInfo
11589       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11590     if (!TInfo)
11591       return ExprError();
11592 
11593     if (!getDerived().AlwaysRebuild() &&
11594         TInfo == E->getTypeOperandSourceInfo())
11595       return E;
11596 
11597     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11598                                              TInfo, E->getEndLoc());
11599   }
11600 
11601   EnterExpressionEvaluationContext Unevaluated(
11602       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11603 
11604   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11605   if (SubExpr.isInvalid())
11606     return ExprError();
11607 
11608   if (!getDerived().AlwaysRebuild() &&
11609       SubExpr.get() == E->getExprOperand())
11610     return E;
11611 
11612   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11613                                            SubExpr.get(), E->getEndLoc());
11614 }
11615 
11616 template<typename Derived>
11617 ExprResult
TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)11618 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11619   return E;
11620 }
11621 
11622 template<typename Derived>
11623 ExprResult
TransformCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)11624 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11625                                                      CXXNullPtrLiteralExpr *E) {
11626   return E;
11627 }
11628 
11629 template<typename Derived>
11630 ExprResult
TransformCXXThisExpr(CXXThisExpr * E)11631 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11632   QualType T = getSema().getCurrentThisType();
11633 
11634   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11635     // Mark it referenced in the new context regardless.
11636     // FIXME: this is a bit instantiation-specific.
11637     getSema().MarkThisReferenced(E);
11638     return E;
11639   }
11640 
11641   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11642 }
11643 
11644 template<typename Derived>
11645 ExprResult
TransformCXXThrowExpr(CXXThrowExpr * E)11646 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11647   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11648   if (SubExpr.isInvalid())
11649     return ExprError();
11650 
11651   if (!getDerived().AlwaysRebuild() &&
11652       SubExpr.get() == E->getSubExpr())
11653     return E;
11654 
11655   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11656                                           E->isThrownVariableInScope());
11657 }
11658 
11659 template<typename Derived>
11660 ExprResult
TransformCXXDefaultArgExpr(CXXDefaultArgExpr * E)11661 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11662   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11663       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11664   if (!Param)
11665     return ExprError();
11666 
11667   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11668       E->getUsedContext() == SemaRef.CurContext)
11669     return E;
11670 
11671   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11672 }
11673 
11674 template<typename Derived>
11675 ExprResult
TransformCXXDefaultInitExpr(CXXDefaultInitExpr * E)11676 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11677   FieldDecl *Field = cast_or_null<FieldDecl>(
11678       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11679   if (!Field)
11680     return ExprError();
11681 
11682   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11683       E->getUsedContext() == SemaRef.CurContext)
11684     return E;
11685 
11686   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11687 }
11688 
11689 template<typename Derived>
11690 ExprResult
TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)11691 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11692                                                     CXXScalarValueInitExpr *E) {
11693   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11694   if (!T)
11695     return ExprError();
11696 
11697   if (!getDerived().AlwaysRebuild() &&
11698       T == E->getTypeSourceInfo())
11699     return E;
11700 
11701   return getDerived().RebuildCXXScalarValueInitExpr(T,
11702                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11703                                                     E->getRParenLoc());
11704 }
11705 
11706 template<typename Derived>
11707 ExprResult
TransformCXXNewExpr(CXXNewExpr * E)11708 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11709   // Transform the type that we're allocating
11710   TypeSourceInfo *AllocTypeInfo =
11711       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11712   if (!AllocTypeInfo)
11713     return ExprError();
11714 
11715   // Transform the size of the array we're allocating (if any).
11716   Optional<Expr *> ArraySize;
11717   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11718     ExprResult NewArraySize;
11719     if (*OldArraySize) {
11720       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11721       if (NewArraySize.isInvalid())
11722         return ExprError();
11723     }
11724     ArraySize = NewArraySize.get();
11725   }
11726 
11727   // Transform the placement arguments (if any).
11728   bool ArgumentChanged = false;
11729   SmallVector<Expr*, 8> PlacementArgs;
11730   if (getDerived().TransformExprs(E->getPlacementArgs(),
11731                                   E->getNumPlacementArgs(), true,
11732                                   PlacementArgs, &ArgumentChanged))
11733     return ExprError();
11734 
11735   // Transform the initializer (if any).
11736   Expr *OldInit = E->getInitializer();
11737   ExprResult NewInit;
11738   if (OldInit)
11739     NewInit = getDerived().TransformInitializer(OldInit, true);
11740   if (NewInit.isInvalid())
11741     return ExprError();
11742 
11743   // Transform new operator and delete operator.
11744   FunctionDecl *OperatorNew = nullptr;
11745   if (E->getOperatorNew()) {
11746     OperatorNew = cast_or_null<FunctionDecl>(
11747         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11748     if (!OperatorNew)
11749       return ExprError();
11750   }
11751 
11752   FunctionDecl *OperatorDelete = nullptr;
11753   if (E->getOperatorDelete()) {
11754     OperatorDelete = cast_or_null<FunctionDecl>(
11755         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11756     if (!OperatorDelete)
11757       return ExprError();
11758   }
11759 
11760   if (!getDerived().AlwaysRebuild() &&
11761       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11762       ArraySize == E->getArraySize() &&
11763       NewInit.get() == OldInit &&
11764       OperatorNew == E->getOperatorNew() &&
11765       OperatorDelete == E->getOperatorDelete() &&
11766       !ArgumentChanged) {
11767     // Mark any declarations we need as referenced.
11768     // FIXME: instantiation-specific.
11769     if (OperatorNew)
11770       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11771     if (OperatorDelete)
11772       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11773 
11774     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11775       QualType ElementType
11776         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11777       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11778         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11779         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11780           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11781         }
11782       }
11783     }
11784 
11785     return E;
11786   }
11787 
11788   QualType AllocType = AllocTypeInfo->getType();
11789   if (!ArraySize) {
11790     // If no array size was specified, but the new expression was
11791     // instantiated with an array type (e.g., "new T" where T is
11792     // instantiated with "int[4]"), extract the outer bound from the
11793     // array type as our array size. We do this with constant and
11794     // dependently-sized array types.
11795     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11796     if (!ArrayT) {
11797       // Do nothing
11798     } else if (const ConstantArrayType *ConsArrayT
11799                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11800       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11801                                          SemaRef.Context.getSizeType(),
11802                                          /*FIXME:*/ E->getBeginLoc());
11803       AllocType = ConsArrayT->getElementType();
11804     } else if (const DependentSizedArrayType *DepArrayT
11805                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11806       if (DepArrayT->getSizeExpr()) {
11807         ArraySize = DepArrayT->getSizeExpr();
11808         AllocType = DepArrayT->getElementType();
11809       }
11810     }
11811   }
11812 
11813   return getDerived().RebuildCXXNewExpr(
11814       E->getBeginLoc(), E->isGlobalNew(),
11815       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11816       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11817       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11818 }
11819 
11820 template<typename Derived>
11821 ExprResult
TransformCXXDeleteExpr(CXXDeleteExpr * E)11822 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11823   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11824   if (Operand.isInvalid())
11825     return ExprError();
11826 
11827   // Transform the delete operator, if known.
11828   FunctionDecl *OperatorDelete = nullptr;
11829   if (E->getOperatorDelete()) {
11830     OperatorDelete = cast_or_null<FunctionDecl>(
11831         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11832     if (!OperatorDelete)
11833       return ExprError();
11834   }
11835 
11836   if (!getDerived().AlwaysRebuild() &&
11837       Operand.get() == E->getArgument() &&
11838       OperatorDelete == E->getOperatorDelete()) {
11839     // Mark any declarations we need as referenced.
11840     // FIXME: instantiation-specific.
11841     if (OperatorDelete)
11842       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11843 
11844     if (!E->getArgument()->isTypeDependent()) {
11845       QualType Destroyed = SemaRef.Context.getBaseElementType(
11846                                                          E->getDestroyedType());
11847       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11848         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11849         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11850                                        SemaRef.LookupDestructor(Record));
11851       }
11852     }
11853 
11854     return E;
11855   }
11856 
11857   return getDerived().RebuildCXXDeleteExpr(
11858       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11859 }
11860 
11861 template<typename Derived>
11862 ExprResult
TransformCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)11863 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11864                                                      CXXPseudoDestructorExpr *E) {
11865   ExprResult Base = getDerived().TransformExpr(E->getBase());
11866   if (Base.isInvalid())
11867     return ExprError();
11868 
11869   ParsedType ObjectTypePtr;
11870   bool MayBePseudoDestructor = false;
11871   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11872                                               E->getOperatorLoc(),
11873                                         E->isArrow()? tok::arrow : tok::period,
11874                                               ObjectTypePtr,
11875                                               MayBePseudoDestructor);
11876   if (Base.isInvalid())
11877     return ExprError();
11878 
11879   QualType ObjectType = ObjectTypePtr.get();
11880   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11881   if (QualifierLoc) {
11882     QualifierLoc
11883       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11884     if (!QualifierLoc)
11885       return ExprError();
11886   }
11887   CXXScopeSpec SS;
11888   SS.Adopt(QualifierLoc);
11889 
11890   PseudoDestructorTypeStorage Destroyed;
11891   if (E->getDestroyedTypeInfo()) {
11892     TypeSourceInfo *DestroyedTypeInfo
11893       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11894                                                 ObjectType, nullptr, SS);
11895     if (!DestroyedTypeInfo)
11896       return ExprError();
11897     Destroyed = DestroyedTypeInfo;
11898   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11899     // We aren't likely to be able to resolve the identifier down to a type
11900     // now anyway, so just retain the identifier.
11901     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11902                                             E->getDestroyedTypeLoc());
11903   } else {
11904     // Look for a destructor known with the given name.
11905     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11906                                               *E->getDestroyedTypeIdentifier(),
11907                                                 E->getDestroyedTypeLoc(),
11908                                                 /*Scope=*/nullptr,
11909                                                 SS, ObjectTypePtr,
11910                                                 false);
11911     if (!T)
11912       return ExprError();
11913 
11914     Destroyed
11915       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11916                                                  E->getDestroyedTypeLoc());
11917   }
11918 
11919   TypeSourceInfo *ScopeTypeInfo = nullptr;
11920   if (E->getScopeTypeInfo()) {
11921     CXXScopeSpec EmptySS;
11922     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11923                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11924     if (!ScopeTypeInfo)
11925       return ExprError();
11926   }
11927 
11928   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11929                                                      E->getOperatorLoc(),
11930                                                      E->isArrow(),
11931                                                      SS,
11932                                                      ScopeTypeInfo,
11933                                                      E->getColonColonLoc(),
11934                                                      E->getTildeLoc(),
11935                                                      Destroyed);
11936 }
11937 
11938 template <typename Derived>
TransformOverloadExprDecls(OverloadExpr * Old,bool RequiresADL,LookupResult & R)11939 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11940                                                         bool RequiresADL,
11941                                                         LookupResult &R) {
11942   // Transform all the decls.
11943   bool AllEmptyPacks = true;
11944   for (auto *OldD : Old->decls()) {
11945     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11946     if (!InstD) {
11947       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11948       // This can happen because of dependent hiding.
11949       if (isa<UsingShadowDecl>(OldD))
11950         continue;
11951       else {
11952         R.clear();
11953         return true;
11954       }
11955     }
11956 
11957     // Expand using pack declarations.
11958     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11959     ArrayRef<NamedDecl*> Decls = SingleDecl;
11960     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11961       Decls = UPD->expansions();
11962 
11963     // Expand using declarations.
11964     for (auto *D : Decls) {
11965       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11966         for (auto *SD : UD->shadows())
11967           R.addDecl(SD);
11968       } else {
11969         R.addDecl(D);
11970       }
11971     }
11972 
11973     AllEmptyPacks &= Decls.empty();
11974   };
11975 
11976   // C++ [temp.res]/8.4.2:
11977   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11978   //   a name in the template definition found a using-declaration, but the
11979   //   lookup in the corresponding scope in the instantiation odoes not find
11980   //   any declarations because the using-declaration was a pack expansion and
11981   //   the corresponding pack is empty
11982   if (AllEmptyPacks && !RequiresADL) {
11983     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11984         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11985     return true;
11986   }
11987 
11988   // Resolve a kind, but don't do any further analysis.  If it's
11989   // ambiguous, the callee needs to deal with it.
11990   R.resolveKind();
11991   return false;
11992 }
11993 
11994 template<typename Derived>
11995 ExprResult
TransformUnresolvedLookupExpr(UnresolvedLookupExpr * Old)11996 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11997                                                   UnresolvedLookupExpr *Old) {
11998   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11999                  Sema::LookupOrdinaryName);
12000 
12001   // Transform the declaration set.
12002   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12003     return ExprError();
12004 
12005   // Rebuild the nested-name qualifier, if present.
12006   CXXScopeSpec SS;
12007   if (Old->getQualifierLoc()) {
12008     NestedNameSpecifierLoc QualifierLoc
12009       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12010     if (!QualifierLoc)
12011       return ExprError();
12012 
12013     SS.Adopt(QualifierLoc);
12014   }
12015 
12016   if (Old->getNamingClass()) {
12017     CXXRecordDecl *NamingClass
12018       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12019                                                             Old->getNameLoc(),
12020                                                         Old->getNamingClass()));
12021     if (!NamingClass) {
12022       R.clear();
12023       return ExprError();
12024     }
12025 
12026     R.setNamingClass(NamingClass);
12027   }
12028 
12029   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12030 
12031   // If we have neither explicit template arguments, nor the template keyword,
12032   // it's a normal declaration name or member reference.
12033   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12034     NamedDecl *D = R.getAsSingle<NamedDecl>();
12035     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12036     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12037     // give a good diagnostic.
12038     if (D && D->isCXXInstanceMember()) {
12039       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12040                                                      /*TemplateArgs=*/nullptr,
12041                                                      /*Scope=*/nullptr);
12042     }
12043 
12044     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12045   }
12046 
12047   // If we have template arguments, rebuild them, then rebuild the
12048   // templateid expression.
12049   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12050   if (Old->hasExplicitTemplateArgs() &&
12051       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12052                                               Old->getNumTemplateArgs(),
12053                                               TransArgs)) {
12054     R.clear();
12055     return ExprError();
12056   }
12057 
12058   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12059                                             Old->requiresADL(), &TransArgs);
12060 }
12061 
12062 template<typename Derived>
12063 ExprResult
TransformTypeTraitExpr(TypeTraitExpr * E)12064 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12065   bool ArgChanged = false;
12066   SmallVector<TypeSourceInfo *, 4> Args;
12067   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12068     TypeSourceInfo *From = E->getArg(I);
12069     TypeLoc FromTL = From->getTypeLoc();
12070     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12071       TypeLocBuilder TLB;
12072       TLB.reserve(FromTL.getFullDataSize());
12073       QualType To = getDerived().TransformType(TLB, FromTL);
12074       if (To.isNull())
12075         return ExprError();
12076 
12077       if (To == From->getType())
12078         Args.push_back(From);
12079       else {
12080         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12081         ArgChanged = true;
12082       }
12083       continue;
12084     }
12085 
12086     ArgChanged = true;
12087 
12088     // We have a pack expansion. Instantiate it.
12089     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12090     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12091     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12092     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12093 
12094     // Determine whether the set of unexpanded parameter packs can and should
12095     // be expanded.
12096     bool Expand = true;
12097     bool RetainExpansion = false;
12098     Optional<unsigned> OrigNumExpansions =
12099         ExpansionTL.getTypePtr()->getNumExpansions();
12100     Optional<unsigned> NumExpansions = OrigNumExpansions;
12101     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12102                                              PatternTL.getSourceRange(),
12103                                              Unexpanded,
12104                                              Expand, RetainExpansion,
12105                                              NumExpansions))
12106       return ExprError();
12107 
12108     if (!Expand) {
12109       // The transform has determined that we should perform a simple
12110       // transformation on the pack expansion, producing another pack
12111       // expansion.
12112       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12113 
12114       TypeLocBuilder TLB;
12115       TLB.reserve(From->getTypeLoc().getFullDataSize());
12116 
12117       QualType To = getDerived().TransformType(TLB, PatternTL);
12118       if (To.isNull())
12119         return ExprError();
12120 
12121       To = getDerived().RebuildPackExpansionType(To,
12122                                                  PatternTL.getSourceRange(),
12123                                                  ExpansionTL.getEllipsisLoc(),
12124                                                  NumExpansions);
12125       if (To.isNull())
12126         return ExprError();
12127 
12128       PackExpansionTypeLoc ToExpansionTL
12129         = TLB.push<PackExpansionTypeLoc>(To);
12130       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12131       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12132       continue;
12133     }
12134 
12135     // Expand the pack expansion by substituting for each argument in the
12136     // pack(s).
12137     for (unsigned I = 0; I != *NumExpansions; ++I) {
12138       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12139       TypeLocBuilder TLB;
12140       TLB.reserve(PatternTL.getFullDataSize());
12141       QualType To = getDerived().TransformType(TLB, PatternTL);
12142       if (To.isNull())
12143         return ExprError();
12144 
12145       if (To->containsUnexpandedParameterPack()) {
12146         To = getDerived().RebuildPackExpansionType(To,
12147                                                    PatternTL.getSourceRange(),
12148                                                    ExpansionTL.getEllipsisLoc(),
12149                                                    NumExpansions);
12150         if (To.isNull())
12151           return ExprError();
12152 
12153         PackExpansionTypeLoc ToExpansionTL
12154           = TLB.push<PackExpansionTypeLoc>(To);
12155         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12156       }
12157 
12158       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12159     }
12160 
12161     if (!RetainExpansion)
12162       continue;
12163 
12164     // If we're supposed to retain a pack expansion, do so by temporarily
12165     // forgetting the partially-substituted parameter pack.
12166     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12167 
12168     TypeLocBuilder TLB;
12169     TLB.reserve(From->getTypeLoc().getFullDataSize());
12170 
12171     QualType To = getDerived().TransformType(TLB, PatternTL);
12172     if (To.isNull())
12173       return ExprError();
12174 
12175     To = getDerived().RebuildPackExpansionType(To,
12176                                                PatternTL.getSourceRange(),
12177                                                ExpansionTL.getEllipsisLoc(),
12178                                                NumExpansions);
12179     if (To.isNull())
12180       return ExprError();
12181 
12182     PackExpansionTypeLoc ToExpansionTL
12183       = TLB.push<PackExpansionTypeLoc>(To);
12184     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12185     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12186   }
12187 
12188   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12189     return E;
12190 
12191   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12192                                        E->getEndLoc());
12193 }
12194 
12195 template<typename Derived>
12196 ExprResult
TransformConceptSpecializationExpr(ConceptSpecializationExpr * E)12197 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12198                                                  ConceptSpecializationExpr *E) {
12199   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12200   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12201   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12202                                               Old->NumTemplateArgs, TransArgs))
12203     return ExprError();
12204 
12205   return getDerived().RebuildConceptSpecializationExpr(
12206       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12207       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12208       &TransArgs);
12209 }
12210 
12211 template<typename Derived>
12212 ExprResult
TransformRequiresExpr(RequiresExpr * E)12213 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12214   SmallVector<ParmVarDecl*, 4> TransParams;
12215   SmallVector<QualType, 4> TransParamTypes;
12216   Sema::ExtParameterInfoBuilder ExtParamInfos;
12217 
12218   // C++2a [expr.prim.req]p2
12219   // Expressions appearing within a requirement-body are unevaluated operands.
12220   EnterExpressionEvaluationContext Ctx(
12221       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12222 
12223   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12224       getSema().Context, getSema().CurContext,
12225       E->getBody()->getBeginLoc());
12226 
12227   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12228 
12229   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12230                                                E->getLocalParameters(),
12231                                                /*ParamTypes=*/nullptr,
12232                                                /*ParamInfos=*/nullptr,
12233                                                TransParamTypes, &TransParams,
12234                                                ExtParamInfos))
12235     return ExprError();
12236 
12237   for (ParmVarDecl *Param : TransParams)
12238     Param->setDeclContext(Body);
12239 
12240   SmallVector<concepts::Requirement *, 4> TransReqs;
12241   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12242                                                      TransReqs))
12243     return ExprError();
12244 
12245   for (concepts::Requirement *Req : TransReqs) {
12246     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12247       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12248         ER->getReturnTypeRequirement()
12249                 .getTypeConstraintTemplateParameterList()->getParam(0)
12250                 ->setDeclContext(Body);
12251       }
12252     }
12253   }
12254 
12255   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12256                                           TransParams, TransReqs,
12257                                           E->getRBraceLoc());
12258 }
12259 
12260 template<typename Derived>
TransformRequiresExprRequirements(ArrayRef<concepts::Requirement * > Reqs,SmallVectorImpl<concepts::Requirement * > & Transformed)12261 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12262     ArrayRef<concepts::Requirement *> Reqs,
12263     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12264   for (concepts::Requirement *Req : Reqs) {
12265     concepts::Requirement *TransReq = nullptr;
12266     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12267       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12268     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12269       TransReq = getDerived().TransformExprRequirement(ExprReq);
12270     else
12271       TransReq = getDerived().TransformNestedRequirement(
12272                      cast<concepts::NestedRequirement>(Req));
12273     if (!TransReq)
12274       return true;
12275     Transformed.push_back(TransReq);
12276   }
12277   return false;
12278 }
12279 
12280 template<typename Derived>
12281 concepts::TypeRequirement *
TransformTypeRequirement(concepts::TypeRequirement * Req)12282 TreeTransform<Derived>::TransformTypeRequirement(
12283     concepts::TypeRequirement *Req) {
12284   if (Req->isSubstitutionFailure()) {
12285     if (getDerived().AlwaysRebuild())
12286       return getDerived().RebuildTypeRequirement(
12287               Req->getSubstitutionDiagnostic());
12288     return Req;
12289   }
12290   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12291   if (!TransType)
12292     return nullptr;
12293   return getDerived().RebuildTypeRequirement(TransType);
12294 }
12295 
12296 template<typename Derived>
12297 concepts::ExprRequirement *
TransformExprRequirement(concepts::ExprRequirement * Req)12298 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12299   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12300   if (Req->isExprSubstitutionFailure())
12301     TransExpr = Req->getExprSubstitutionDiagnostic();
12302   else {
12303     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12304     if (TransExprRes.isInvalid())
12305       return nullptr;
12306     TransExpr = TransExprRes.get();
12307   }
12308 
12309   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12310   const auto &RetReq = Req->getReturnTypeRequirement();
12311   if (RetReq.isEmpty())
12312     TransRetReq.emplace();
12313   else if (RetReq.isSubstitutionFailure())
12314     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12315   else if (RetReq.isTypeConstraint()) {
12316     TemplateParameterList *OrigTPL =
12317         RetReq.getTypeConstraintTemplateParameterList();
12318     TemplateParameterList *TPL =
12319         getDerived().TransformTemplateParameterList(OrigTPL);
12320     if (!TPL)
12321       return nullptr;
12322     TransRetReq.emplace(TPL);
12323   }
12324   assert(TransRetReq.hasValue() &&
12325          "All code paths leading here must set TransRetReq");
12326   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12327     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12328                                                Req->getNoexceptLoc(),
12329                                                std::move(*TransRetReq));
12330   return getDerived().RebuildExprRequirement(
12331       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12332       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12333 }
12334 
12335 template<typename Derived>
12336 concepts::NestedRequirement *
TransformNestedRequirement(concepts::NestedRequirement * Req)12337 TreeTransform<Derived>::TransformNestedRequirement(
12338     concepts::NestedRequirement *Req) {
12339   if (Req->isSubstitutionFailure()) {
12340     if (getDerived().AlwaysRebuild())
12341       return getDerived().RebuildNestedRequirement(
12342           Req->getSubstitutionDiagnostic());
12343     return Req;
12344   }
12345   ExprResult TransConstraint =
12346       getDerived().TransformExpr(Req->getConstraintExpr());
12347   if (TransConstraint.isInvalid())
12348     return nullptr;
12349   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12350 }
12351 
12352 template<typename Derived>
12353 ExprResult
TransformArrayTypeTraitExpr(ArrayTypeTraitExpr * E)12354 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12355   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12356   if (!T)
12357     return ExprError();
12358 
12359   if (!getDerived().AlwaysRebuild() &&
12360       T == E->getQueriedTypeSourceInfo())
12361     return E;
12362 
12363   ExprResult SubExpr;
12364   {
12365     EnterExpressionEvaluationContext Unevaluated(
12366         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12367     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12368     if (SubExpr.isInvalid())
12369       return ExprError();
12370 
12371     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12372       return E;
12373   }
12374 
12375   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12376                                             SubExpr.get(), E->getEndLoc());
12377 }
12378 
12379 template<typename Derived>
12380 ExprResult
TransformExpressionTraitExpr(ExpressionTraitExpr * E)12381 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12382   ExprResult SubExpr;
12383   {
12384     EnterExpressionEvaluationContext Unevaluated(
12385         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12386     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12387     if (SubExpr.isInvalid())
12388       return ExprError();
12389 
12390     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12391       return E;
12392   }
12393 
12394   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12395                                              SubExpr.get(), E->getEndLoc());
12396 }
12397 
12398 template <typename Derived>
TransformParenDependentScopeDeclRefExpr(ParenExpr * PE,DependentScopeDeclRefExpr * DRE,bool AddrTaken,TypeSourceInfo ** RecoveryTSI)12399 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12400     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12401     TypeSourceInfo **RecoveryTSI) {
12402   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12403       DRE, AddrTaken, RecoveryTSI);
12404 
12405   // Propagate both errors and recovered types, which return ExprEmpty.
12406   if (!NewDRE.isUsable())
12407     return NewDRE;
12408 
12409   // We got an expr, wrap it up in parens.
12410   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12411     return PE;
12412   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12413                                        PE->getRParen());
12414 }
12415 
12416 template <typename Derived>
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)12417 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12418     DependentScopeDeclRefExpr *E) {
12419   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12420                                             nullptr);
12421 }
12422 
12423 template<typename Derived>
12424 ExprResult
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)12425 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12426                                                DependentScopeDeclRefExpr *E,
12427                                                bool IsAddressOfOperand,
12428                                                TypeSourceInfo **RecoveryTSI) {
12429   assert(E->getQualifierLoc());
12430   NestedNameSpecifierLoc QualifierLoc
12431   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12432   if (!QualifierLoc)
12433     return ExprError();
12434   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12435 
12436   // TODO: If this is a conversion-function-id, verify that the
12437   // destination type name (if present) resolves the same way after
12438   // instantiation as it did in the local scope.
12439 
12440   DeclarationNameInfo NameInfo
12441     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12442   if (!NameInfo.getName())
12443     return ExprError();
12444 
12445   if (!E->hasExplicitTemplateArgs()) {
12446     if (!getDerived().AlwaysRebuild() &&
12447         QualifierLoc == E->getQualifierLoc() &&
12448         // Note: it is sufficient to compare the Name component of NameInfo:
12449         // if name has not changed, DNLoc has not changed either.
12450         NameInfo.getName() == E->getDeclName())
12451       return E;
12452 
12453     return getDerived().RebuildDependentScopeDeclRefExpr(
12454         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12455         IsAddressOfOperand, RecoveryTSI);
12456   }
12457 
12458   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12459   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12460                                               E->getNumTemplateArgs(),
12461                                               TransArgs))
12462     return ExprError();
12463 
12464   return getDerived().RebuildDependentScopeDeclRefExpr(
12465       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12466       RecoveryTSI);
12467 }
12468 
12469 template<typename Derived>
12470 ExprResult
TransformCXXConstructExpr(CXXConstructExpr * E)12471 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12472   // CXXConstructExprs other than for list-initialization and
12473   // CXXTemporaryObjectExpr are always implicit, so when we have
12474   // a 1-argument construction we just transform that argument.
12475   if (getDerived().AllowSkippingCXXConstructExpr() &&
12476       ((E->getNumArgs() == 1 ||
12477         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12478        (!getDerived().DropCallArgument(E->getArg(0))) &&
12479        !E->isListInitialization()))
12480     return getDerived().TransformInitializer(E->getArg(0),
12481                                              /*DirectInit*/ false);
12482 
12483   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12484 
12485   QualType T = getDerived().TransformType(E->getType());
12486   if (T.isNull())
12487     return ExprError();
12488 
12489   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12490       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12491   if (!Constructor)
12492     return ExprError();
12493 
12494   bool ArgumentChanged = false;
12495   SmallVector<Expr*, 8> Args;
12496   {
12497     EnterExpressionEvaluationContext Context(
12498         getSema(), EnterExpressionEvaluationContext::InitList,
12499         E->isListInitialization());
12500     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12501                                     &ArgumentChanged))
12502       return ExprError();
12503   }
12504 
12505   if (!getDerived().AlwaysRebuild() &&
12506       T == E->getType() &&
12507       Constructor == E->getConstructor() &&
12508       !ArgumentChanged) {
12509     // Mark the constructor as referenced.
12510     // FIXME: Instantiation-specific
12511     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12512     return E;
12513   }
12514 
12515   return getDerived().RebuildCXXConstructExpr(
12516       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12517       E->hadMultipleCandidates(), E->isListInitialization(),
12518       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12519       E->getConstructionKind(), E->getParenOrBraceRange());
12520 }
12521 
12522 template<typename Derived>
TransformCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)12523 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12524     CXXInheritedCtorInitExpr *E) {
12525   QualType T = getDerived().TransformType(E->getType());
12526   if (T.isNull())
12527     return ExprError();
12528 
12529   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12530       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12531   if (!Constructor)
12532     return ExprError();
12533 
12534   if (!getDerived().AlwaysRebuild() &&
12535       T == E->getType() &&
12536       Constructor == E->getConstructor()) {
12537     // Mark the constructor as referenced.
12538     // FIXME: Instantiation-specific
12539     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12540     return E;
12541   }
12542 
12543   return getDerived().RebuildCXXInheritedCtorInitExpr(
12544       T, E->getLocation(), Constructor,
12545       E->constructsVBase(), E->inheritedFromVBase());
12546 }
12547 
12548 /// Transform a C++ temporary-binding expression.
12549 ///
12550 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12551 /// transform the subexpression and return that.
12552 template<typename Derived>
12553 ExprResult
TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)12554 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12555   return getDerived().TransformExpr(E->getSubExpr());
12556 }
12557 
12558 /// Transform a C++ expression that contains cleanups that should
12559 /// be run after the expression is evaluated.
12560 ///
12561 /// Since ExprWithCleanups nodes are implicitly generated, we
12562 /// just transform the subexpression and return that.
12563 template<typename Derived>
12564 ExprResult
TransformExprWithCleanups(ExprWithCleanups * E)12565 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12566   return getDerived().TransformExpr(E->getSubExpr());
12567 }
12568 
12569 template<typename Derived>
12570 ExprResult
TransformCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)12571 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12572                                                     CXXTemporaryObjectExpr *E) {
12573   TypeSourceInfo *T =
12574       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12575   if (!T)
12576     return ExprError();
12577 
12578   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12579       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12580   if (!Constructor)
12581     return ExprError();
12582 
12583   bool ArgumentChanged = false;
12584   SmallVector<Expr*, 8> Args;
12585   Args.reserve(E->getNumArgs());
12586   {
12587     EnterExpressionEvaluationContext Context(
12588         getSema(), EnterExpressionEvaluationContext::InitList,
12589         E->isListInitialization());
12590     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12591                        &ArgumentChanged))
12592       return ExprError();
12593   }
12594 
12595   if (!getDerived().AlwaysRebuild() &&
12596       T == E->getTypeSourceInfo() &&
12597       Constructor == E->getConstructor() &&
12598       !ArgumentChanged) {
12599     // FIXME: Instantiation-specific
12600     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12601     return SemaRef.MaybeBindToTemporary(E);
12602   }
12603 
12604   // FIXME: We should just pass E->isListInitialization(), but we're not
12605   // prepared to handle list-initialization without a child InitListExpr.
12606   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12607   return getDerived().RebuildCXXTemporaryObjectExpr(
12608       T, LParenLoc, Args, E->getEndLoc(),
12609       /*ListInitialization=*/LParenLoc.isInvalid());
12610 }
12611 
12612 template<typename Derived>
12613 ExprResult
TransformLambdaExpr(LambdaExpr * E)12614 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12615   // Transform any init-capture expressions before entering the scope of the
12616   // lambda body, because they are not semantically within that scope.
12617   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12618   struct TransformedInitCapture {
12619     // The location of the ... if the result is retaining a pack expansion.
12620     SourceLocation EllipsisLoc;
12621     // Zero or more expansions of the init-capture.
12622     SmallVector<InitCaptureInfoTy, 4> Expansions;
12623   };
12624   SmallVector<TransformedInitCapture, 4> InitCaptures;
12625   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12626   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12627                                     CEnd = E->capture_end();
12628        C != CEnd; ++C) {
12629     if (!E->isInitCapture(C))
12630       continue;
12631 
12632     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12633     VarDecl *OldVD = C->getCapturedVar();
12634 
12635     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12636                                 Optional<unsigned> NumExpansions) {
12637       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12638           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12639 
12640       if (NewExprInitResult.isInvalid()) {
12641         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12642         return;
12643       }
12644       Expr *NewExprInit = NewExprInitResult.get();
12645 
12646       QualType NewInitCaptureType =
12647           getSema().buildLambdaInitCaptureInitialization(
12648               C->getLocation(), OldVD->getType()->isReferenceType(),
12649               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12650               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12651               NewExprInit);
12652       Result.Expansions.push_back(
12653           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12654     };
12655 
12656     // If this is an init-capture pack, consider expanding the pack now.
12657     if (OldVD->isParameterPack()) {
12658       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12659                                              ->getTypeLoc()
12660                                              .castAs<PackExpansionTypeLoc>();
12661       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12662       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12663 
12664       // Determine whether the set of unexpanded parameter packs can and should
12665       // be expanded.
12666       bool Expand = true;
12667       bool RetainExpansion = false;
12668       Optional<unsigned> OrigNumExpansions =
12669           ExpansionTL.getTypePtr()->getNumExpansions();
12670       Optional<unsigned> NumExpansions = OrigNumExpansions;
12671       if (getDerived().TryExpandParameterPacks(
12672               ExpansionTL.getEllipsisLoc(),
12673               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12674               RetainExpansion, NumExpansions))
12675         return ExprError();
12676       if (Expand) {
12677         for (unsigned I = 0; I != *NumExpansions; ++I) {
12678           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12679           SubstInitCapture(SourceLocation(), None);
12680         }
12681       }
12682       if (!Expand || RetainExpansion) {
12683         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12684         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12685         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12686       }
12687     } else {
12688       SubstInitCapture(SourceLocation(), None);
12689     }
12690   }
12691 
12692   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12693   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12694 
12695   // Transform the template parameters, and add them to the current
12696   // instantiation scope. The null case is handled correctly.
12697   auto TPL = getDerived().TransformTemplateParameterList(
12698       E->getTemplateParameterList());
12699   LSI->GLTemplateParameterList = TPL;
12700 
12701   // Transform the type of the original lambda's call operator.
12702   // The transformation MUST be done in the CurrentInstantiationScope since
12703   // it introduces a mapping of the original to the newly created
12704   // transformed parameters.
12705   TypeSourceInfo *NewCallOpTSI = nullptr;
12706   {
12707     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12708     FunctionProtoTypeLoc OldCallOpFPTL =
12709         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12710 
12711     TypeLocBuilder NewCallOpTLBuilder;
12712     SmallVector<QualType, 4> ExceptionStorage;
12713     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12714     QualType NewCallOpType = TransformFunctionProtoType(
12715         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12716         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12717           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12718                                               ExceptionStorage, Changed);
12719         });
12720     if (NewCallOpType.isNull())
12721       return ExprError();
12722     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12723                                                         NewCallOpType);
12724   }
12725 
12726   // Transform the trailing requires clause
12727   ExprResult NewTrailingRequiresClause;
12728   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12729     // FIXME: Concepts: Substitution into requires clause should only happen
12730     //                  when checking satisfaction.
12731     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12732 
12733   // Create the local class that will describe the lambda.
12734   // FIXME: KnownDependent below is wrong when substituting inside a templated
12735   // context that isn't a DeclContext (such as a variable template).
12736   CXXRecordDecl *OldClass = E->getLambdaClass();
12737   CXXRecordDecl *Class
12738     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12739                                         NewCallOpTSI,
12740                                         /*KnownDependent=*/false,
12741                                         E->getCaptureDefault());
12742   getDerived().transformedLocalDecl(OldClass, {Class});
12743 
12744   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12745   if (getDerived().ReplacingOriginal())
12746     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12747                                OldClass->getLambdaManglingNumber(),
12748                                OldClass->getDeviceLambdaManglingNumber(),
12749                                OldClass->getLambdaContextDecl());
12750 
12751   // Build the call operator.
12752   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12753       Class, E->getIntroducerRange(), NewCallOpTSI,
12754       E->getCallOperator()->getEndLoc(),
12755       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12756       E->getCallOperator()->getConstexprKind(),
12757       NewTrailingRequiresClause.get());
12758 
12759   LSI->CallOperator = NewCallOperator;
12760 
12761   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12762   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12763 
12764   // Number the lambda for linkage purposes if necessary.
12765   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12766 
12767   // Introduce the context of the call operator.
12768   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12769                                  /*NewThisContext*/false);
12770 
12771   // Enter the scope of the lambda.
12772   getSema().buildLambdaScope(LSI, NewCallOperator,
12773                              E->getIntroducerRange(),
12774                              E->getCaptureDefault(),
12775                              E->getCaptureDefaultLoc(),
12776                              E->hasExplicitParameters(),
12777                              E->hasExplicitResultType(),
12778                              E->isMutable());
12779 
12780   bool Invalid = false;
12781 
12782   // Transform captures.
12783   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12784                                  CEnd = E->capture_end();
12785        C != CEnd; ++C) {
12786     // When we hit the first implicit capture, tell Sema that we've finished
12787     // the list of explicit captures.
12788     if (C->isImplicit())
12789       break;
12790 
12791     // Capturing 'this' is trivial.
12792     if (C->capturesThis()) {
12793       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12794                                     /*BuildAndDiagnose*/ true, nullptr,
12795                                     C->getCaptureKind() == LCK_StarThis);
12796       continue;
12797     }
12798     // Captured expression will be recaptured during captured variables
12799     // rebuilding.
12800     if (C->capturesVLAType())
12801       continue;
12802 
12803     // Rebuild init-captures, including the implied field declaration.
12804     if (E->isInitCapture(C)) {
12805       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12806 
12807       VarDecl *OldVD = C->getCapturedVar();
12808       llvm::SmallVector<Decl*, 4> NewVDs;
12809 
12810       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12811         ExprResult Init = Info.first;
12812         QualType InitQualType = Info.second;
12813         if (Init.isInvalid() || InitQualType.isNull()) {
12814           Invalid = true;
12815           break;
12816         }
12817         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12818             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12819             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12820         if (!NewVD) {
12821           Invalid = true;
12822           break;
12823         }
12824         NewVDs.push_back(NewVD);
12825         getSema().addInitCapture(LSI, NewVD);
12826       }
12827 
12828       if (Invalid)
12829         break;
12830 
12831       getDerived().transformedLocalDecl(OldVD, NewVDs);
12832       continue;
12833     }
12834 
12835     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12836 
12837     // Determine the capture kind for Sema.
12838     Sema::TryCaptureKind Kind
12839       = C->isImplicit()? Sema::TryCapture_Implicit
12840                        : C->getCaptureKind() == LCK_ByCopy
12841                            ? Sema::TryCapture_ExplicitByVal
12842                            : Sema::TryCapture_ExplicitByRef;
12843     SourceLocation EllipsisLoc;
12844     if (C->isPackExpansion()) {
12845       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12846       bool ShouldExpand = false;
12847       bool RetainExpansion = false;
12848       Optional<unsigned> NumExpansions;
12849       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12850                                                C->getLocation(),
12851                                                Unexpanded,
12852                                                ShouldExpand, RetainExpansion,
12853                                                NumExpansions)) {
12854         Invalid = true;
12855         continue;
12856       }
12857 
12858       if (ShouldExpand) {
12859         // The transform has determined that we should perform an expansion;
12860         // transform and capture each of the arguments.
12861         // expansion of the pattern. Do so.
12862         VarDecl *Pack = C->getCapturedVar();
12863         for (unsigned I = 0; I != *NumExpansions; ++I) {
12864           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12865           VarDecl *CapturedVar
12866             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12867                                                                Pack));
12868           if (!CapturedVar) {
12869             Invalid = true;
12870             continue;
12871           }
12872 
12873           // Capture the transformed variable.
12874           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12875         }
12876 
12877         // FIXME: Retain a pack expansion if RetainExpansion is true.
12878 
12879         continue;
12880       }
12881 
12882       EllipsisLoc = C->getEllipsisLoc();
12883     }
12884 
12885     // Transform the captured variable.
12886     VarDecl *CapturedVar
12887       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12888                                                          C->getCapturedVar()));
12889     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12890       Invalid = true;
12891       continue;
12892     }
12893 
12894     // Capture the transformed variable.
12895     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12896                                  EllipsisLoc);
12897   }
12898   getSema().finishLambdaExplicitCaptures(LSI);
12899 
12900   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12901   // evaluation context even if we're not transforming the function body.
12902   getSema().PushExpressionEvaluationContext(
12903       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12904 
12905   // Instantiate the body of the lambda expression.
12906   StmtResult Body =
12907       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12908 
12909   // ActOnLambda* will pop the function scope for us.
12910   FuncScopeCleanup.disable();
12911 
12912   if (Body.isInvalid()) {
12913     SavedContext.pop();
12914     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12915                                /*IsInstantiation=*/true);
12916     return ExprError();
12917   }
12918 
12919   // Copy the LSI before ActOnFinishFunctionBody removes it.
12920   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12921   // the call operator.
12922   auto LSICopy = *LSI;
12923   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12924                                     /*IsInstantiation*/ true);
12925   SavedContext.pop();
12926 
12927   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12928                                    &LSICopy);
12929 }
12930 
12931 template<typename Derived>
12932 StmtResult
TransformLambdaBody(LambdaExpr * E,Stmt * S)12933 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12934   return TransformStmt(S);
12935 }
12936 
12937 template<typename Derived>
12938 StmtResult
SkipLambdaBody(LambdaExpr * E,Stmt * S)12939 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12940   // Transform captures.
12941   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12942                                  CEnd = E->capture_end();
12943        C != CEnd; ++C) {
12944     // When we hit the first implicit capture, tell Sema that we've finished
12945     // the list of explicit captures.
12946     if (!C->isImplicit())
12947       continue;
12948 
12949     // Capturing 'this' is trivial.
12950     if (C->capturesThis()) {
12951       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12952                                     /*BuildAndDiagnose*/ true, nullptr,
12953                                     C->getCaptureKind() == LCK_StarThis);
12954       continue;
12955     }
12956     // Captured expression will be recaptured during captured variables
12957     // rebuilding.
12958     if (C->capturesVLAType())
12959       continue;
12960 
12961     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12962     assert(!E->isInitCapture(C) && "implicit init-capture?");
12963 
12964     // Transform the captured variable.
12965     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12966         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12967     if (!CapturedVar || CapturedVar->isInvalidDecl())
12968       return StmtError();
12969 
12970     // Capture the transformed variable.
12971     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12972   }
12973 
12974   return S;
12975 }
12976 
12977 template<typename Derived>
12978 ExprResult
TransformCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)12979 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12980                                                   CXXUnresolvedConstructExpr *E) {
12981   TypeSourceInfo *T =
12982       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12983   if (!T)
12984     return ExprError();
12985 
12986   bool ArgumentChanged = false;
12987   SmallVector<Expr*, 8> Args;
12988   Args.reserve(E->getNumArgs());
12989   {
12990     EnterExpressionEvaluationContext Context(
12991         getSema(), EnterExpressionEvaluationContext::InitList,
12992         E->isListInitialization());
12993     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
12994                                     &ArgumentChanged))
12995       return ExprError();
12996   }
12997 
12998   if (!getDerived().AlwaysRebuild() &&
12999       T == E->getTypeSourceInfo() &&
13000       !ArgumentChanged)
13001     return E;
13002 
13003   // FIXME: we're faking the locations of the commas
13004   return getDerived().RebuildCXXUnresolvedConstructExpr(
13005       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13006 }
13007 
13008 template<typename Derived>
13009 ExprResult
TransformCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)13010 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13011                                              CXXDependentScopeMemberExpr *E) {
13012   // Transform the base of the expression.
13013   ExprResult Base((Expr*) nullptr);
13014   Expr *OldBase;
13015   QualType BaseType;
13016   QualType ObjectType;
13017   if (!E->isImplicitAccess()) {
13018     OldBase = E->getBase();
13019     Base = getDerived().TransformExpr(OldBase);
13020     if (Base.isInvalid())
13021       return ExprError();
13022 
13023     // Start the member reference and compute the object's type.
13024     ParsedType ObjectTy;
13025     bool MayBePseudoDestructor = false;
13026     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13027                                                 E->getOperatorLoc(),
13028                                       E->isArrow()? tok::arrow : tok::period,
13029                                                 ObjectTy,
13030                                                 MayBePseudoDestructor);
13031     if (Base.isInvalid())
13032       return ExprError();
13033 
13034     ObjectType = ObjectTy.get();
13035     BaseType = ((Expr*) Base.get())->getType();
13036   } else {
13037     OldBase = nullptr;
13038     BaseType = getDerived().TransformType(E->getBaseType());
13039     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13040   }
13041 
13042   // Transform the first part of the nested-name-specifier that qualifies
13043   // the member name.
13044   NamedDecl *FirstQualifierInScope
13045     = getDerived().TransformFirstQualifierInScope(
13046                                             E->getFirstQualifierFoundInScope(),
13047                                             E->getQualifierLoc().getBeginLoc());
13048 
13049   NestedNameSpecifierLoc QualifierLoc;
13050   if (E->getQualifier()) {
13051     QualifierLoc
13052       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13053                                                      ObjectType,
13054                                                      FirstQualifierInScope);
13055     if (!QualifierLoc)
13056       return ExprError();
13057   }
13058 
13059   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13060 
13061   // TODO: If this is a conversion-function-id, verify that the
13062   // destination type name (if present) resolves the same way after
13063   // instantiation as it did in the local scope.
13064 
13065   DeclarationNameInfo NameInfo
13066     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13067   if (!NameInfo.getName())
13068     return ExprError();
13069 
13070   if (!E->hasExplicitTemplateArgs()) {
13071     // This is a reference to a member without an explicitly-specified
13072     // template argument list. Optimize for this common case.
13073     if (!getDerived().AlwaysRebuild() &&
13074         Base.get() == OldBase &&
13075         BaseType == E->getBaseType() &&
13076         QualifierLoc == E->getQualifierLoc() &&
13077         NameInfo.getName() == E->getMember() &&
13078         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13079       return E;
13080 
13081     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13082                                                        BaseType,
13083                                                        E->isArrow(),
13084                                                        E->getOperatorLoc(),
13085                                                        QualifierLoc,
13086                                                        TemplateKWLoc,
13087                                                        FirstQualifierInScope,
13088                                                        NameInfo,
13089                                                        /*TemplateArgs*/nullptr);
13090   }
13091 
13092   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13093   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13094                                               E->getNumTemplateArgs(),
13095                                               TransArgs))
13096     return ExprError();
13097 
13098   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13099                                                      BaseType,
13100                                                      E->isArrow(),
13101                                                      E->getOperatorLoc(),
13102                                                      QualifierLoc,
13103                                                      TemplateKWLoc,
13104                                                      FirstQualifierInScope,
13105                                                      NameInfo,
13106                                                      &TransArgs);
13107 }
13108 
13109 template<typename Derived>
13110 ExprResult
TransformUnresolvedMemberExpr(UnresolvedMemberExpr * Old)13111 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
13112   // Transform the base of the expression.
13113   ExprResult Base((Expr*) nullptr);
13114   QualType BaseType;
13115   if (!Old->isImplicitAccess()) {
13116     Base = getDerived().TransformExpr(Old->getBase());
13117     if (Base.isInvalid())
13118       return ExprError();
13119     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
13120                                                      Old->isArrow());
13121     if (Base.isInvalid())
13122       return ExprError();
13123     BaseType = Base.get()->getType();
13124   } else {
13125     BaseType = getDerived().TransformType(Old->getBaseType());
13126   }
13127 
13128   NestedNameSpecifierLoc QualifierLoc;
13129   if (Old->getQualifierLoc()) {
13130     QualifierLoc
13131     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13132     if (!QualifierLoc)
13133       return ExprError();
13134   }
13135 
13136   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13137 
13138   LookupResult R(SemaRef, Old->getMemberNameInfo(),
13139                  Sema::LookupOrdinaryName);
13140 
13141   // Transform the declaration set.
13142   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
13143     return ExprError();
13144 
13145   // Determine the naming class.
13146   if (Old->getNamingClass()) {
13147     CXXRecordDecl *NamingClass
13148       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
13149                                                           Old->getMemberLoc(),
13150                                                         Old->getNamingClass()));
13151     if (!NamingClass)
13152       return ExprError();
13153 
13154     R.setNamingClass(NamingClass);
13155   }
13156 
13157   TemplateArgumentListInfo TransArgs;
13158   if (Old->hasExplicitTemplateArgs()) {
13159     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13160     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13161     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
13162                                                 Old->getNumTemplateArgs(),
13163                                                 TransArgs))
13164       return ExprError();
13165   }
13166 
13167   // FIXME: to do this check properly, we will need to preserve the
13168   // first-qualifier-in-scope here, just in case we had a dependent
13169   // base (and therefore couldn't do the check) and a
13170   // nested-name-qualifier (and therefore could do the lookup).
13171   NamedDecl *FirstQualifierInScope = nullptr;
13172 
13173   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
13174                                                   BaseType,
13175                                                   Old->getOperatorLoc(),
13176                                                   Old->isArrow(),
13177                                                   QualifierLoc,
13178                                                   TemplateKWLoc,
13179                                                   FirstQualifierInScope,
13180                                                   R,
13181                                               (Old->hasExplicitTemplateArgs()
13182                                                   ? &TransArgs : nullptr));
13183 }
13184 
13185 template<typename Derived>
13186 ExprResult
TransformCXXNoexceptExpr(CXXNoexceptExpr * E)13187 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13188   EnterExpressionEvaluationContext Unevaluated(
13189       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13190   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13191   if (SubExpr.isInvalid())
13192     return ExprError();
13193 
13194   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13195     return E;
13196 
13197   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13198 }
13199 
13200 template<typename Derived>
13201 ExprResult
TransformPackExpansionExpr(PackExpansionExpr * E)13202 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13203   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13204   if (Pattern.isInvalid())
13205     return ExprError();
13206 
13207   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13208     return E;
13209 
13210   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13211                                            E->getNumExpansions());
13212 }
13213 
13214 template<typename Derived>
13215 ExprResult
TransformSizeOfPackExpr(SizeOfPackExpr * E)13216 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13217   // If E is not value-dependent, then nothing will change when we transform it.
13218   // Note: This is an instantiation-centric view.
13219   if (!E->isValueDependent())
13220     return E;
13221 
13222   EnterExpressionEvaluationContext Unevaluated(
13223       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13224 
13225   ArrayRef<TemplateArgument> PackArgs;
13226   TemplateArgument ArgStorage;
13227 
13228   // Find the argument list to transform.
13229   if (E->isPartiallySubstituted()) {
13230     PackArgs = E->getPartialArguments();
13231   } else if (E->isValueDependent()) {
13232     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13233     bool ShouldExpand = false;
13234     bool RetainExpansion = false;
13235     Optional<unsigned> NumExpansions;
13236     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13237                                              Unexpanded,
13238                                              ShouldExpand, RetainExpansion,
13239                                              NumExpansions))
13240       return ExprError();
13241 
13242     // If we need to expand the pack, build a template argument from it and
13243     // expand that.
13244     if (ShouldExpand) {
13245       auto *Pack = E->getPack();
13246       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13247         ArgStorage = getSema().Context.getPackExpansionType(
13248             getSema().Context.getTypeDeclType(TTPD), None);
13249       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13250         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13251       } else {
13252         auto *VD = cast<ValueDecl>(Pack);
13253         ExprResult DRE = getSema().BuildDeclRefExpr(
13254             VD, VD->getType().getNonLValueExprType(getSema().Context),
13255             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13256             E->getPackLoc());
13257         if (DRE.isInvalid())
13258           return ExprError();
13259         ArgStorage = new (getSema().Context) PackExpansionExpr(
13260             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13261       }
13262       PackArgs = ArgStorage;
13263     }
13264   }
13265 
13266   // If we're not expanding the pack, just transform the decl.
13267   if (!PackArgs.size()) {
13268     auto *Pack = cast_or_null<NamedDecl>(
13269         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13270     if (!Pack)
13271       return ExprError();
13272     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13273                                               E->getPackLoc(),
13274                                               E->getRParenLoc(), None, None);
13275   }
13276 
13277   // Try to compute the result without performing a partial substitution.
13278   Optional<unsigned> Result = 0;
13279   for (const TemplateArgument &Arg : PackArgs) {
13280     if (!Arg.isPackExpansion()) {
13281       Result = *Result + 1;
13282       continue;
13283     }
13284 
13285     TemplateArgumentLoc ArgLoc;
13286     InventTemplateArgumentLoc(Arg, ArgLoc);
13287 
13288     // Find the pattern of the pack expansion.
13289     SourceLocation Ellipsis;
13290     Optional<unsigned> OrigNumExpansions;
13291     TemplateArgumentLoc Pattern =
13292         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13293                                                           OrigNumExpansions);
13294 
13295     // Substitute under the pack expansion. Do not expand the pack (yet).
13296     TemplateArgumentLoc OutPattern;
13297     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13298     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13299                                                /*Uneval*/ true))
13300       return true;
13301 
13302     // See if we can determine the number of arguments from the result.
13303     Optional<unsigned> NumExpansions =
13304         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13305     if (!NumExpansions) {
13306       // No: we must be in an alias template expansion, and we're going to need
13307       // to actually expand the packs.
13308       Result = None;
13309       break;
13310     }
13311 
13312     Result = *Result + *NumExpansions;
13313   }
13314 
13315   // Common case: we could determine the number of expansions without
13316   // substituting.
13317   if (Result)
13318     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13319                                               E->getPackLoc(),
13320                                               E->getRParenLoc(), *Result, None);
13321 
13322   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13323                                                E->getPackLoc());
13324   {
13325     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13326     typedef TemplateArgumentLocInventIterator<
13327         Derived, const TemplateArgument*> PackLocIterator;
13328     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13329                                    PackLocIterator(*this, PackArgs.end()),
13330                                    TransformedPackArgs, /*Uneval*/true))
13331       return ExprError();
13332   }
13333 
13334   // Check whether we managed to fully-expand the pack.
13335   // FIXME: Is it possible for us to do so and not hit the early exit path?
13336   SmallVector<TemplateArgument, 8> Args;
13337   bool PartialSubstitution = false;
13338   for (auto &Loc : TransformedPackArgs.arguments()) {
13339     Args.push_back(Loc.getArgument());
13340     if (Loc.getArgument().isPackExpansion())
13341       PartialSubstitution = true;
13342   }
13343 
13344   if (PartialSubstitution)
13345     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13346                                               E->getPackLoc(),
13347                                               E->getRParenLoc(), None, Args);
13348 
13349   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13350                                             E->getPackLoc(), E->getRParenLoc(),
13351                                             Args.size(), None);
13352 }
13353 
13354 template<typename Derived>
13355 ExprResult
TransformSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)13356 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13357                                           SubstNonTypeTemplateParmPackExpr *E) {
13358   // Default behavior is to do nothing with this transformation.
13359   return E;
13360 }
13361 
13362 template<typename Derived>
13363 ExprResult
TransformSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)13364 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13365                                           SubstNonTypeTemplateParmExpr *E) {
13366   // Default behavior is to do nothing with this transformation.
13367   return E;
13368 }
13369 
13370 template<typename Derived>
13371 ExprResult
TransformFunctionParmPackExpr(FunctionParmPackExpr * E)13372 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13373   // Default behavior is to do nothing with this transformation.
13374   return E;
13375 }
13376 
13377 template<typename Derived>
13378 ExprResult
TransformMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)13379 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13380                                                   MaterializeTemporaryExpr *E) {
13381   return getDerived().TransformExpr(E->getSubExpr());
13382 }
13383 
13384 template<typename Derived>
13385 ExprResult
TransformCXXFoldExpr(CXXFoldExpr * E)13386 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13387   UnresolvedLookupExpr *Callee = nullptr;
13388   if (Expr *OldCallee = E->getCallee()) {
13389     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13390     if (CalleeResult.isInvalid())
13391       return ExprError();
13392     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13393   }
13394 
13395   Expr *Pattern = E->getPattern();
13396 
13397   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13398   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13399   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13400 
13401   // Determine whether the set of unexpanded parameter packs can and should
13402   // be expanded.
13403   bool Expand = true;
13404   bool RetainExpansion = false;
13405   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13406                      NumExpansions = OrigNumExpansions;
13407   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13408                                            Pattern->getSourceRange(),
13409                                            Unexpanded,
13410                                            Expand, RetainExpansion,
13411                                            NumExpansions))
13412     return true;
13413 
13414   if (!Expand) {
13415     // Do not expand any packs here, just transform and rebuild a fold
13416     // expression.
13417     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13418 
13419     ExprResult LHS =
13420         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13421     if (LHS.isInvalid())
13422       return true;
13423 
13424     ExprResult RHS =
13425         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13426     if (RHS.isInvalid())
13427       return true;
13428 
13429     if (!getDerived().AlwaysRebuild() &&
13430         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13431       return E;
13432 
13433     return getDerived().RebuildCXXFoldExpr(
13434         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13435         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13436   }
13437 
13438   // Formally a fold expression expands to nested parenthesized expressions.
13439   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13440   // them.
13441   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13442     SemaRef.Diag(E->getEllipsisLoc(),
13443                  clang::diag::err_fold_expression_limit_exceeded)
13444         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13445         << E->getSourceRange();
13446     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13447     return ExprError();
13448   }
13449 
13450   // The transform has determined that we should perform an elementwise
13451   // expansion of the pattern. Do so.
13452   ExprResult Result = getDerived().TransformExpr(E->getInit());
13453   if (Result.isInvalid())
13454     return true;
13455   bool LeftFold = E->isLeftFold();
13456 
13457   // If we're retaining an expansion for a right fold, it is the innermost
13458   // component and takes the init (if any).
13459   if (!LeftFold && RetainExpansion) {
13460     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13461 
13462     ExprResult Out = getDerived().TransformExpr(Pattern);
13463     if (Out.isInvalid())
13464       return true;
13465 
13466     Result = getDerived().RebuildCXXFoldExpr(
13467         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13468         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13469     if (Result.isInvalid())
13470       return true;
13471   }
13472 
13473   for (unsigned I = 0; I != *NumExpansions; ++I) {
13474     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13475         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13476     ExprResult Out = getDerived().TransformExpr(Pattern);
13477     if (Out.isInvalid())
13478       return true;
13479 
13480     if (Out.get()->containsUnexpandedParameterPack()) {
13481       // We still have a pack; retain a pack expansion for this slice.
13482       Result = getDerived().RebuildCXXFoldExpr(
13483           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13484           E->getOperator(), E->getEllipsisLoc(),
13485           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13486           OrigNumExpansions);
13487     } else if (Result.isUsable()) {
13488       // We've got down to a single element; build a binary operator.
13489       Expr *LHS = LeftFold ? Result.get() : Out.get();
13490       Expr *RHS = LeftFold ? Out.get() : Result.get();
13491       if (Callee)
13492         Result = getDerived().RebuildCXXOperatorCallExpr(
13493             BinaryOperator::getOverloadedOperator(E->getOperator()),
13494             E->getEllipsisLoc(), Callee, LHS, RHS);
13495       else
13496         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13497                                                     E->getOperator(), LHS, RHS);
13498     } else
13499       Result = Out;
13500 
13501     if (Result.isInvalid())
13502       return true;
13503   }
13504 
13505   // If we're retaining an expansion for a left fold, it is the outermost
13506   // component and takes the complete expansion so far as its init (if any).
13507   if (LeftFold && RetainExpansion) {
13508     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13509 
13510     ExprResult Out = getDerived().TransformExpr(Pattern);
13511     if (Out.isInvalid())
13512       return true;
13513 
13514     Result = getDerived().RebuildCXXFoldExpr(
13515         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13516         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13517     if (Result.isInvalid())
13518       return true;
13519   }
13520 
13521   // If we had no init and an empty pack, and we're not retaining an expansion,
13522   // then produce a fallback value or error.
13523   if (Result.isUnset())
13524     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13525                                                 E->getOperator());
13526 
13527   return Result;
13528 }
13529 
13530 template<typename Derived>
13531 ExprResult
TransformCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)13532 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13533     CXXStdInitializerListExpr *E) {
13534   return getDerived().TransformExpr(E->getSubExpr());
13535 }
13536 
13537 template<typename Derived>
13538 ExprResult
TransformObjCStringLiteral(ObjCStringLiteral * E)13539 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13540   return SemaRef.MaybeBindToTemporary(E);
13541 }
13542 
13543 template<typename Derived>
13544 ExprResult
TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)13545 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13546   return E;
13547 }
13548 
13549 template<typename Derived>
13550 ExprResult
TransformObjCBoxedExpr(ObjCBoxedExpr * E)13551 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13552   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13553   if (SubExpr.isInvalid())
13554     return ExprError();
13555 
13556   if (!getDerived().AlwaysRebuild() &&
13557       SubExpr.get() == E->getSubExpr())
13558     return E;
13559 
13560   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13561 }
13562 
13563 template<typename Derived>
13564 ExprResult
TransformObjCArrayLiteral(ObjCArrayLiteral * E)13565 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13566   // Transform each of the elements.
13567   SmallVector<Expr *, 8> Elements;
13568   bool ArgChanged = false;
13569   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13570                                   /*IsCall=*/false, Elements, &ArgChanged))
13571     return ExprError();
13572 
13573   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13574     return SemaRef.MaybeBindToTemporary(E);
13575 
13576   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13577                                               Elements.data(),
13578                                               Elements.size());
13579 }
13580 
13581 template<typename Derived>
13582 ExprResult
TransformObjCDictionaryLiteral(ObjCDictionaryLiteral * E)13583 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13584                                                     ObjCDictionaryLiteral *E) {
13585   // Transform each of the elements.
13586   SmallVector<ObjCDictionaryElement, 8> Elements;
13587   bool ArgChanged = false;
13588   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13589     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13590 
13591     if (OrigElement.isPackExpansion()) {
13592       // This key/value element is a pack expansion.
13593       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13594       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13595       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13596       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13597 
13598       // Determine whether the set of unexpanded parameter packs can
13599       // and should be expanded.
13600       bool Expand = true;
13601       bool RetainExpansion = false;
13602       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13603       Optional<unsigned> NumExpansions = OrigNumExpansions;
13604       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13605                                OrigElement.Value->getEndLoc());
13606       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13607                                                PatternRange, Unexpanded, Expand,
13608                                                RetainExpansion, NumExpansions))
13609         return ExprError();
13610 
13611       if (!Expand) {
13612         // The transform has determined that we should perform a simple
13613         // transformation on the pack expansion, producing another pack
13614         // expansion.
13615         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13616         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13617         if (Key.isInvalid())
13618           return ExprError();
13619 
13620         if (Key.get() != OrigElement.Key)
13621           ArgChanged = true;
13622 
13623         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13624         if (Value.isInvalid())
13625           return ExprError();
13626 
13627         if (Value.get() != OrigElement.Value)
13628           ArgChanged = true;
13629 
13630         ObjCDictionaryElement Expansion = {
13631           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13632         };
13633         Elements.push_back(Expansion);
13634         continue;
13635       }
13636 
13637       // Record right away that the argument was changed.  This needs
13638       // to happen even if the array expands to nothing.
13639       ArgChanged = true;
13640 
13641       // The transform has determined that we should perform an elementwise
13642       // expansion of the pattern. Do so.
13643       for (unsigned I = 0; I != *NumExpansions; ++I) {
13644         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13645         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13646         if (Key.isInvalid())
13647           return ExprError();
13648 
13649         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13650         if (Value.isInvalid())
13651           return ExprError();
13652 
13653         ObjCDictionaryElement Element = {
13654           Key.get(), Value.get(), SourceLocation(), NumExpansions
13655         };
13656 
13657         // If any unexpanded parameter packs remain, we still have a
13658         // pack expansion.
13659         // FIXME: Can this really happen?
13660         if (Key.get()->containsUnexpandedParameterPack() ||
13661             Value.get()->containsUnexpandedParameterPack())
13662           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13663 
13664         Elements.push_back(Element);
13665       }
13666 
13667       // FIXME: Retain a pack expansion if RetainExpansion is true.
13668 
13669       // We've finished with this pack expansion.
13670       continue;
13671     }
13672 
13673     // Transform and check key.
13674     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13675     if (Key.isInvalid())
13676       return ExprError();
13677 
13678     if (Key.get() != OrigElement.Key)
13679       ArgChanged = true;
13680 
13681     // Transform and check value.
13682     ExprResult Value
13683       = getDerived().TransformExpr(OrigElement.Value);
13684     if (Value.isInvalid())
13685       return ExprError();
13686 
13687     if (Value.get() != OrigElement.Value)
13688       ArgChanged = true;
13689 
13690     ObjCDictionaryElement Element = {
13691       Key.get(), Value.get(), SourceLocation(), None
13692     };
13693     Elements.push_back(Element);
13694   }
13695 
13696   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13697     return SemaRef.MaybeBindToTemporary(E);
13698 
13699   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13700                                                    Elements);
13701 }
13702 
13703 template<typename Derived>
13704 ExprResult
TransformObjCEncodeExpr(ObjCEncodeExpr * E)13705 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13706   TypeSourceInfo *EncodedTypeInfo
13707     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13708   if (!EncodedTypeInfo)
13709     return ExprError();
13710 
13711   if (!getDerived().AlwaysRebuild() &&
13712       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13713     return E;
13714 
13715   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13716                                             EncodedTypeInfo,
13717                                             E->getRParenLoc());
13718 }
13719 
13720 template<typename Derived>
13721 ExprResult TreeTransform<Derived>::
TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)13722 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13723   // This is a kind of implicit conversion, and it needs to get dropped
13724   // and recomputed for the same general reasons that ImplicitCastExprs
13725   // do, as well a more specific one: this expression is only valid when
13726   // it appears *immediately* as an argument expression.
13727   return getDerived().TransformExpr(E->getSubExpr());
13728 }
13729 
13730 template<typename Derived>
13731 ExprResult TreeTransform<Derived>::
TransformObjCBridgedCastExpr(ObjCBridgedCastExpr * E)13732 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13733   TypeSourceInfo *TSInfo
13734     = getDerived().TransformType(E->getTypeInfoAsWritten());
13735   if (!TSInfo)
13736     return ExprError();
13737 
13738   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13739   if (Result.isInvalid())
13740     return ExprError();
13741 
13742   if (!getDerived().AlwaysRebuild() &&
13743       TSInfo == E->getTypeInfoAsWritten() &&
13744       Result.get() == E->getSubExpr())
13745     return E;
13746 
13747   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13748                                       E->getBridgeKeywordLoc(), TSInfo,
13749                                       Result.get());
13750 }
13751 
13752 template <typename Derived>
TransformObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr * E)13753 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13754     ObjCAvailabilityCheckExpr *E) {
13755   return E;
13756 }
13757 
13758 template<typename Derived>
13759 ExprResult
TransformObjCMessageExpr(ObjCMessageExpr * E)13760 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13761   // Transform arguments.
13762   bool ArgChanged = false;
13763   SmallVector<Expr*, 8> Args;
13764   Args.reserve(E->getNumArgs());
13765   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13766                                   &ArgChanged))
13767     return ExprError();
13768 
13769   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13770     // Class message: transform the receiver type.
13771     TypeSourceInfo *ReceiverTypeInfo
13772       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13773     if (!ReceiverTypeInfo)
13774       return ExprError();
13775 
13776     // If nothing changed, just retain the existing message send.
13777     if (!getDerived().AlwaysRebuild() &&
13778         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13779       return SemaRef.MaybeBindToTemporary(E);
13780 
13781     // Build a new class message send.
13782     SmallVector<SourceLocation, 16> SelLocs;
13783     E->getSelectorLocs(SelLocs);
13784     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13785                                                E->getSelector(),
13786                                                SelLocs,
13787                                                E->getMethodDecl(),
13788                                                E->getLeftLoc(),
13789                                                Args,
13790                                                E->getRightLoc());
13791   }
13792   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13793            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13794     if (!E->getMethodDecl())
13795       return ExprError();
13796 
13797     // Build a new class message send to 'super'.
13798     SmallVector<SourceLocation, 16> SelLocs;
13799     E->getSelectorLocs(SelLocs);
13800     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13801                                                E->getSelector(),
13802                                                SelLocs,
13803                                                E->getReceiverType(),
13804                                                E->getMethodDecl(),
13805                                                E->getLeftLoc(),
13806                                                Args,
13807                                                E->getRightLoc());
13808   }
13809 
13810   // Instance message: transform the receiver
13811   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13812          "Only class and instance messages may be instantiated");
13813   ExprResult Receiver
13814     = getDerived().TransformExpr(E->getInstanceReceiver());
13815   if (Receiver.isInvalid())
13816     return ExprError();
13817 
13818   // If nothing changed, just retain the existing message send.
13819   if (!getDerived().AlwaysRebuild() &&
13820       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13821     return SemaRef.MaybeBindToTemporary(E);
13822 
13823   // Build a new instance message send.
13824   SmallVector<SourceLocation, 16> SelLocs;
13825   E->getSelectorLocs(SelLocs);
13826   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13827                                              E->getSelector(),
13828                                              SelLocs,
13829                                              E->getMethodDecl(),
13830                                              E->getLeftLoc(),
13831                                              Args,
13832                                              E->getRightLoc());
13833 }
13834 
13835 template<typename Derived>
13836 ExprResult
TransformObjCSelectorExpr(ObjCSelectorExpr * E)13837 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13838   return E;
13839 }
13840 
13841 template<typename Derived>
13842 ExprResult
TransformObjCProtocolExpr(ObjCProtocolExpr * E)13843 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13844   return E;
13845 }
13846 
13847 template<typename Derived>
13848 ExprResult
TransformObjCIvarRefExpr(ObjCIvarRefExpr * E)13849 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13850   // Transform the base expression.
13851   ExprResult Base = getDerived().TransformExpr(E->getBase());
13852   if (Base.isInvalid())
13853     return ExprError();
13854 
13855   // We don't need to transform the ivar; it will never change.
13856 
13857   // If nothing changed, just retain the existing expression.
13858   if (!getDerived().AlwaysRebuild() &&
13859       Base.get() == E->getBase())
13860     return E;
13861 
13862   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13863                                              E->getLocation(),
13864                                              E->isArrow(), E->isFreeIvar());
13865 }
13866 
13867 template<typename Derived>
13868 ExprResult
TransformObjCPropertyRefExpr(ObjCPropertyRefExpr * E)13869 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13870   // 'super' and types never change. Property never changes. Just
13871   // retain the existing expression.
13872   if (!E->isObjectReceiver())
13873     return E;
13874 
13875   // Transform the base expression.
13876   ExprResult Base = getDerived().TransformExpr(E->getBase());
13877   if (Base.isInvalid())
13878     return ExprError();
13879 
13880   // We don't need to transform the property; it will never change.
13881 
13882   // If nothing changed, just retain the existing expression.
13883   if (!getDerived().AlwaysRebuild() &&
13884       Base.get() == E->getBase())
13885     return E;
13886 
13887   if (E->isExplicitProperty())
13888     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13889                                                    E->getExplicitProperty(),
13890                                                    E->getLocation());
13891 
13892   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13893                                                  SemaRef.Context.PseudoObjectTy,
13894                                                  E->getImplicitPropertyGetter(),
13895                                                  E->getImplicitPropertySetter(),
13896                                                  E->getLocation());
13897 }
13898 
13899 template<typename Derived>
13900 ExprResult
TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)13901 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13902   // Transform the base expression.
13903   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13904   if (Base.isInvalid())
13905     return ExprError();
13906 
13907   // Transform the key expression.
13908   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13909   if (Key.isInvalid())
13910     return ExprError();
13911 
13912   // If nothing changed, just retain the existing expression.
13913   if (!getDerived().AlwaysRebuild() &&
13914       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13915     return E;
13916 
13917   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13918                                                   Base.get(), Key.get(),
13919                                                   E->getAtIndexMethodDecl(),
13920                                                   E->setAtIndexMethodDecl());
13921 }
13922 
13923 template<typename Derived>
13924 ExprResult
TransformObjCIsaExpr(ObjCIsaExpr * E)13925 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13926   // Transform the base expression.
13927   ExprResult Base = getDerived().TransformExpr(E->getBase());
13928   if (Base.isInvalid())
13929     return ExprError();
13930 
13931   // If nothing changed, just retain the existing expression.
13932   if (!getDerived().AlwaysRebuild() &&
13933       Base.get() == E->getBase())
13934     return E;
13935 
13936   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13937                                          E->getOpLoc(),
13938                                          E->isArrow());
13939 }
13940 
13941 template<typename Derived>
13942 ExprResult
TransformShuffleVectorExpr(ShuffleVectorExpr * E)13943 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13944   bool ArgumentChanged = false;
13945   SmallVector<Expr*, 8> SubExprs;
13946   SubExprs.reserve(E->getNumSubExprs());
13947   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13948                                   SubExprs, &ArgumentChanged))
13949     return ExprError();
13950 
13951   if (!getDerived().AlwaysRebuild() &&
13952       !ArgumentChanged)
13953     return E;
13954 
13955   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13956                                                SubExprs,
13957                                                E->getRParenLoc());
13958 }
13959 
13960 template<typename Derived>
13961 ExprResult
TransformConvertVectorExpr(ConvertVectorExpr * E)13962 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13963   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13964   if (SrcExpr.isInvalid())
13965     return ExprError();
13966 
13967   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13968   if (!Type)
13969     return ExprError();
13970 
13971   if (!getDerived().AlwaysRebuild() &&
13972       Type == E->getTypeSourceInfo() &&
13973       SrcExpr.get() == E->getSrcExpr())
13974     return E;
13975 
13976   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13977                                                SrcExpr.get(), Type,
13978                                                E->getRParenLoc());
13979 }
13980 
13981 template<typename Derived>
13982 ExprResult
TransformBlockExpr(BlockExpr * E)13983 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13984   BlockDecl *oldBlock = E->getBlockDecl();
13985 
13986   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13987   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13988 
13989   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13990   blockScope->TheDecl->setBlockMissingReturnType(
13991                          oldBlock->blockMissingReturnType());
13992 
13993   SmallVector<ParmVarDecl*, 4> params;
13994   SmallVector<QualType, 4> paramTypes;
13995 
13996   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13997 
13998   // Parameter substitution.
13999   Sema::ExtParameterInfoBuilder extParamInfos;
14000   if (getDerived().TransformFunctionTypeParams(
14001           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14002           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14003           extParamInfos)) {
14004     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14005     return ExprError();
14006   }
14007 
14008   QualType exprResultType =
14009       getDerived().TransformType(exprFunctionType->getReturnType());
14010 
14011   auto epi = exprFunctionType->getExtProtoInfo();
14012   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14013 
14014   QualType functionType =
14015     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14016   blockScope->FunctionType = functionType;
14017 
14018   // Set the parameters on the block decl.
14019   if (!params.empty())
14020     blockScope->TheDecl->setParams(params);
14021 
14022   if (!oldBlock->blockMissingReturnType()) {
14023     blockScope->HasImplicitReturnType = false;
14024     blockScope->ReturnType = exprResultType;
14025   }
14026 
14027   // Transform the body
14028   StmtResult body = getDerived().TransformStmt(E->getBody());
14029   if (body.isInvalid()) {
14030     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14031     return ExprError();
14032   }
14033 
14034 #ifndef NDEBUG
14035   // In builds with assertions, make sure that we captured everything we
14036   // captured before.
14037   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14038     for (const auto &I : oldBlock->captures()) {
14039       VarDecl *oldCapture = I.getVariable();
14040 
14041       // Ignore parameter packs.
14042       if (oldCapture->isParameterPack())
14043         continue;
14044 
14045       VarDecl *newCapture =
14046         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14047                                                  oldCapture));
14048       assert(blockScope->CaptureMap.count(newCapture));
14049     }
14050     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14051   }
14052 #endif
14053 
14054   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14055                                     /*Scope=*/nullptr);
14056 }
14057 
14058 template<typename Derived>
14059 ExprResult
TransformAsTypeExpr(AsTypeExpr * E)14060 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14061   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14062   if (SrcExpr.isInvalid())
14063     return ExprError();
14064 
14065   QualType Type = getDerived().TransformType(E->getType());
14066 
14067   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14068                                  E->getRParenLoc());
14069 }
14070 
14071 template<typename Derived>
14072 ExprResult
TransformAtomicExpr(AtomicExpr * E)14073 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14074   bool ArgumentChanged = false;
14075   SmallVector<Expr*, 8> SubExprs;
14076   SubExprs.reserve(E->getNumSubExprs());
14077   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14078                                   SubExprs, &ArgumentChanged))
14079     return ExprError();
14080 
14081   if (!getDerived().AlwaysRebuild() &&
14082       !ArgumentChanged)
14083     return E;
14084 
14085   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14086                                         E->getOp(), E->getRParenLoc());
14087 }
14088 
14089 //===----------------------------------------------------------------------===//
14090 // Type reconstruction
14091 //===----------------------------------------------------------------------===//
14092 
14093 template<typename Derived>
RebuildPointerType(QualType PointeeType,SourceLocation Star)14094 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14095                                                     SourceLocation Star) {
14096   return SemaRef.BuildPointerType(PointeeType, Star,
14097                                   getDerived().getBaseEntity());
14098 }
14099 
14100 template<typename Derived>
RebuildBlockPointerType(QualType PointeeType,SourceLocation Star)14101 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14102                                                          SourceLocation Star) {
14103   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14104                                        getDerived().getBaseEntity());
14105 }
14106 
14107 template<typename Derived>
14108 QualType
RebuildReferenceType(QualType ReferentType,bool WrittenAsLValue,SourceLocation Sigil)14109 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14110                                              bool WrittenAsLValue,
14111                                              SourceLocation Sigil) {
14112   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14113                                     Sigil, getDerived().getBaseEntity());
14114 }
14115 
14116 template<typename Derived>
14117 QualType
RebuildMemberPointerType(QualType PointeeType,QualType ClassType,SourceLocation Sigil)14118 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14119                                                  QualType ClassType,
14120                                                  SourceLocation Sigil) {
14121   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14122                                         getDerived().getBaseEntity());
14123 }
14124 
14125 template<typename Derived>
RebuildObjCTypeParamType(const ObjCTypeParamDecl * Decl,SourceLocation ProtocolLAngleLoc,ArrayRef<ObjCProtocolDecl * > Protocols,ArrayRef<SourceLocation> ProtocolLocs,SourceLocation ProtocolRAngleLoc)14126 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14127            const ObjCTypeParamDecl *Decl,
14128            SourceLocation ProtocolLAngleLoc,
14129            ArrayRef<ObjCProtocolDecl *> Protocols,
14130            ArrayRef<SourceLocation> ProtocolLocs,
14131            SourceLocation ProtocolRAngleLoc) {
14132   return SemaRef.BuildObjCTypeParamType(Decl,
14133                                         ProtocolLAngleLoc, Protocols,
14134                                         ProtocolLocs, ProtocolRAngleLoc,
14135                                         /*FailOnError=*/true);
14136 }
14137 
14138 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)14139 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14140            QualType BaseType,
14141            SourceLocation Loc,
14142            SourceLocation TypeArgsLAngleLoc,
14143            ArrayRef<TypeSourceInfo *> TypeArgs,
14144            SourceLocation TypeArgsRAngleLoc,
14145            SourceLocation ProtocolLAngleLoc,
14146            ArrayRef<ObjCProtocolDecl *> Protocols,
14147            ArrayRef<SourceLocation> ProtocolLocs,
14148            SourceLocation ProtocolRAngleLoc) {
14149   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14150                                      TypeArgs, TypeArgsRAngleLoc,
14151                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14152                                      ProtocolRAngleLoc,
14153                                      /*FailOnError=*/true);
14154 }
14155 
14156 template<typename Derived>
RebuildObjCObjectPointerType(QualType PointeeType,SourceLocation Star)14157 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14158            QualType PointeeType,
14159            SourceLocation Star) {
14160   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14161 }
14162 
14163 template<typename Derived>
14164 QualType
RebuildArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt * Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14165 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14166                                          ArrayType::ArraySizeModifier SizeMod,
14167                                          const llvm::APInt *Size,
14168                                          Expr *SizeExpr,
14169                                          unsigned IndexTypeQuals,
14170                                          SourceRange BracketsRange) {
14171   if (SizeExpr || !Size)
14172     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14173                                   IndexTypeQuals, BracketsRange,
14174                                   getDerived().getBaseEntity());
14175 
14176   QualType Types[] = {
14177     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14178     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14179     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14180   };
14181   const unsigned NumTypes = llvm::array_lengthof(Types);
14182   QualType SizeType;
14183   for (unsigned I = 0; I != NumTypes; ++I)
14184     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14185       SizeType = Types[I];
14186       break;
14187     }
14188 
14189   // Note that we can return a VariableArrayType here in the case where
14190   // the element type was a dependent VariableArrayType.
14191   IntegerLiteral *ArraySize
14192       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14193                                /*FIXME*/BracketsRange.getBegin());
14194   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14195                                 IndexTypeQuals, BracketsRange,
14196                                 getDerived().getBaseEntity());
14197 }
14198 
14199 template<typename Derived>
14200 QualType
RebuildConstantArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt & Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14201 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14202                                                  ArrayType::ArraySizeModifier SizeMod,
14203                                                  const llvm::APInt &Size,
14204                                                  Expr *SizeExpr,
14205                                                  unsigned IndexTypeQuals,
14206                                                  SourceRange BracketsRange) {
14207   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14208                                         IndexTypeQuals, BracketsRange);
14209 }
14210 
14211 template<typename Derived>
14212 QualType
RebuildIncompleteArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,unsigned IndexTypeQuals,SourceRange BracketsRange)14213 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14214                                           ArrayType::ArraySizeModifier SizeMod,
14215                                                  unsigned IndexTypeQuals,
14216                                                    SourceRange BracketsRange) {
14217   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14218                                        IndexTypeQuals, BracketsRange);
14219 }
14220 
14221 template<typename Derived>
14222 QualType
RebuildVariableArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14223 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14224                                           ArrayType::ArraySizeModifier SizeMod,
14225                                                  Expr *SizeExpr,
14226                                                  unsigned IndexTypeQuals,
14227                                                  SourceRange BracketsRange) {
14228   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14229                                        SizeExpr,
14230                                        IndexTypeQuals, BracketsRange);
14231 }
14232 
14233 template<typename Derived>
14234 QualType
RebuildDependentSizedArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)14235 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14236                                           ArrayType::ArraySizeModifier SizeMod,
14237                                                        Expr *SizeExpr,
14238                                                        unsigned IndexTypeQuals,
14239                                                    SourceRange BracketsRange) {
14240   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14241                                        SizeExpr,
14242                                        IndexTypeQuals, BracketsRange);
14243 }
14244 
14245 template <typename Derived>
RebuildDependentAddressSpaceType(QualType PointeeType,Expr * AddrSpaceExpr,SourceLocation AttributeLoc)14246 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14247     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14248   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14249                                           AttributeLoc);
14250 }
14251 
14252 template <typename Derived>
14253 QualType
RebuildVectorType(QualType ElementType,unsigned NumElements,VectorType::VectorKind VecKind)14254 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14255                                           unsigned NumElements,
14256                                           VectorType::VectorKind VecKind) {
14257   // FIXME: semantic checking!
14258   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14259 }
14260 
14261 template <typename Derived>
RebuildDependentVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc,VectorType::VectorKind VecKind)14262 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14263     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14264     VectorType::VectorKind VecKind) {
14265   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14266 }
14267 
14268 template<typename Derived>
RebuildExtVectorType(QualType ElementType,unsigned NumElements,SourceLocation AttributeLoc)14269 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14270                                                       unsigned NumElements,
14271                                                  SourceLocation AttributeLoc) {
14272   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14273                           NumElements, true);
14274   IntegerLiteral *VectorSize
14275     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14276                              AttributeLoc);
14277   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14278 }
14279 
14280 template<typename Derived>
14281 QualType
RebuildDependentSizedExtVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc)14282 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14283                                                            Expr *SizeExpr,
14284                                                   SourceLocation AttributeLoc) {
14285   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14286 }
14287 
14288 template <typename Derived>
RebuildConstantMatrixType(QualType ElementType,unsigned NumRows,unsigned NumColumns)14289 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14290     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14291   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14292                                                NumColumns);
14293 }
14294 
14295 template <typename Derived>
RebuildDependentSizedMatrixType(QualType ElementType,Expr * RowExpr,Expr * ColumnExpr,SourceLocation AttributeLoc)14296 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14297     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14298     SourceLocation AttributeLoc) {
14299   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14300                                  AttributeLoc);
14301 }
14302 
14303 template<typename Derived>
RebuildFunctionProtoType(QualType T,MutableArrayRef<QualType> ParamTypes,const FunctionProtoType::ExtProtoInfo & EPI)14304 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14305     QualType T,
14306     MutableArrayRef<QualType> ParamTypes,
14307     const FunctionProtoType::ExtProtoInfo &EPI) {
14308   return SemaRef.BuildFunctionType(T, ParamTypes,
14309                                    getDerived().getBaseLocation(),
14310                                    getDerived().getBaseEntity(),
14311                                    EPI);
14312 }
14313 
14314 template<typename Derived>
RebuildFunctionNoProtoType(QualType T)14315 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14316   return SemaRef.Context.getFunctionNoProtoType(T);
14317 }
14318 
14319 template<typename Derived>
RebuildUnresolvedUsingType(SourceLocation Loc,Decl * D)14320 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14321                                                             Decl *D) {
14322   assert(D && "no decl found");
14323   if (D->isInvalidDecl()) return QualType();
14324 
14325   // FIXME: Doesn't account for ObjCInterfaceDecl!
14326   TypeDecl *Ty;
14327   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14328     // A valid resolved using typename pack expansion decl can have multiple
14329     // UsingDecls, but they must each have exactly one type, and it must be
14330     // the same type in every case. But we must have at least one expansion!
14331     if (UPD->expansions().empty()) {
14332       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14333           << UPD->isCXXClassMember() << UPD;
14334       return QualType();
14335     }
14336 
14337     // We might still have some unresolved types. Try to pick a resolved type
14338     // if we can. The final instantiation will check that the remaining
14339     // unresolved types instantiate to the type we pick.
14340     QualType FallbackT;
14341     QualType T;
14342     for (auto *E : UPD->expansions()) {
14343       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14344       if (ThisT.isNull())
14345         continue;
14346       else if (ThisT->getAs<UnresolvedUsingType>())
14347         FallbackT = ThisT;
14348       else if (T.isNull())
14349         T = ThisT;
14350       else
14351         assert(getSema().Context.hasSameType(ThisT, T) &&
14352                "mismatched resolved types in using pack expansion");
14353     }
14354     return T.isNull() ? FallbackT : T;
14355   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14356     assert(Using->hasTypename() &&
14357            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14358 
14359     // A valid resolved using typename decl points to exactly one type decl.
14360     assert(++Using->shadow_begin() == Using->shadow_end());
14361     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14362   } else {
14363     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14364            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14365     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14366   }
14367 
14368   return SemaRef.Context.getTypeDeclType(Ty);
14369 }
14370 
14371 template<typename Derived>
RebuildTypeOfExprType(Expr * E,SourceLocation Loc)14372 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14373                                                        SourceLocation Loc) {
14374   return SemaRef.BuildTypeofExprType(E, Loc);
14375 }
14376 
14377 template<typename Derived>
RebuildTypeOfType(QualType Underlying)14378 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14379   return SemaRef.Context.getTypeOfType(Underlying);
14380 }
14381 
14382 template<typename Derived>
RebuildDecltypeType(Expr * E,SourceLocation Loc)14383 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14384                                                      SourceLocation Loc) {
14385   return SemaRef.BuildDecltypeType(E, Loc);
14386 }
14387 
14388 template<typename Derived>
RebuildUnaryTransformType(QualType BaseType,UnaryTransformType::UTTKind UKind,SourceLocation Loc)14389 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14390                                             UnaryTransformType::UTTKind UKind,
14391                                             SourceLocation Loc) {
14392   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14393 }
14394 
14395 template<typename Derived>
RebuildTemplateSpecializationType(TemplateName Template,SourceLocation TemplateNameLoc,TemplateArgumentListInfo & TemplateArgs)14396 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14397                                                       TemplateName Template,
14398                                              SourceLocation TemplateNameLoc,
14399                                      TemplateArgumentListInfo &TemplateArgs) {
14400   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14401 }
14402 
14403 template<typename Derived>
RebuildAtomicType(QualType ValueType,SourceLocation KWLoc)14404 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14405                                                    SourceLocation KWLoc) {
14406   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14407 }
14408 
14409 template<typename Derived>
RebuildPipeType(QualType ValueType,SourceLocation KWLoc,bool isReadPipe)14410 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14411                                                  SourceLocation KWLoc,
14412                                                  bool isReadPipe) {
14413   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14414                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14415 }
14416 
14417 template <typename Derived>
RebuildExtIntType(bool IsUnsigned,unsigned NumBits,SourceLocation Loc)14418 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14419                                                    unsigned NumBits,
14420                                                    SourceLocation Loc) {
14421   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14422                         NumBits, true);
14423   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14424                                                 SemaRef.Context.IntTy, Loc);
14425   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14426 }
14427 
14428 template <typename Derived>
RebuildDependentExtIntType(bool IsUnsigned,Expr * NumBitsExpr,SourceLocation Loc)14429 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14430     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14431   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14432 }
14433 
14434 template<typename Derived>
14435 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,bool TemplateKW,TemplateDecl * Template)14436 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14437                                             bool TemplateKW,
14438                                             TemplateDecl *Template) {
14439   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14440                                                   Template);
14441 }
14442 
14443 template<typename Derived>
14444 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,SourceLocation TemplateKWLoc,const IdentifierInfo & Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope,bool AllowInjectedClassName)14445 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14446                                             SourceLocation TemplateKWLoc,
14447                                             const IdentifierInfo &Name,
14448                                             SourceLocation NameLoc,
14449                                             QualType ObjectType,
14450                                             NamedDecl *FirstQualifierInScope,
14451                                             bool AllowInjectedClassName) {
14452   UnqualifiedId TemplateName;
14453   TemplateName.setIdentifier(&Name, NameLoc);
14454   Sema::TemplateTy Template;
14455   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14456                               TemplateName, ParsedType::make(ObjectType),
14457                               /*EnteringContext=*/false, Template,
14458                               AllowInjectedClassName);
14459   return Template.get();
14460 }
14461 
14462 template<typename Derived>
14463 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,SourceLocation TemplateKWLoc,OverloadedOperatorKind Operator,SourceLocation NameLoc,QualType ObjectType,bool AllowInjectedClassName)14464 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14465                                             SourceLocation TemplateKWLoc,
14466                                             OverloadedOperatorKind Operator,
14467                                             SourceLocation NameLoc,
14468                                             QualType ObjectType,
14469                                             bool AllowInjectedClassName) {
14470   UnqualifiedId Name;
14471   // FIXME: Bogus location information.
14472   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14473   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14474   Sema::TemplateTy Template;
14475   getSema().ActOnTemplateName(
14476       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14477       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14478   return Template.get();
14479 }
14480 
14481 template<typename Derived>
14482 ExprResult
RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,SourceLocation OpLoc,Expr * OrigCallee,Expr * First,Expr * Second)14483 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14484                                                    SourceLocation OpLoc,
14485                                                    Expr *OrigCallee,
14486                                                    Expr *First,
14487                                                    Expr *Second) {
14488   Expr *Callee = OrigCallee->IgnoreParenCasts();
14489   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14490 
14491   if (First->getObjectKind() == OK_ObjCProperty) {
14492     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14493     if (BinaryOperator::isAssignmentOp(Opc))
14494       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14495                                                  First, Second);
14496     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14497     if (Result.isInvalid())
14498       return ExprError();
14499     First = Result.get();
14500   }
14501 
14502   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14503     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14504     if (Result.isInvalid())
14505       return ExprError();
14506     Second = Result.get();
14507   }
14508 
14509   // Determine whether this should be a builtin operation.
14510   if (Op == OO_Subscript) {
14511     if (!First->getType()->isOverloadableType() &&
14512         !Second->getType()->isOverloadableType())
14513       return getSema().CreateBuiltinArraySubscriptExpr(
14514           First, Callee->getBeginLoc(), Second, OpLoc);
14515   } else if (Op == OO_Arrow) {
14516     // -> is never a builtin operation.
14517     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14518   } else if (Second == nullptr || isPostIncDec) {
14519     if (!First->getType()->isOverloadableType() ||
14520         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14521       // The argument is not of overloadable type, or this is an expression
14522       // of the form &Class::member, so try to create a built-in unary
14523       // operation.
14524       UnaryOperatorKind Opc
14525         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14526 
14527       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14528     }
14529   } else {
14530     if (!First->getType()->isOverloadableType() &&
14531         !Second->getType()->isOverloadableType()) {
14532       // Neither of the arguments is an overloadable type, so try to
14533       // create a built-in binary operation.
14534       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14535       ExprResult Result
14536         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14537       if (Result.isInvalid())
14538         return ExprError();
14539 
14540       return Result;
14541     }
14542   }
14543 
14544   // Compute the transformed set of functions (and function templates) to be
14545   // used during overload resolution.
14546   UnresolvedSet<16> Functions;
14547   bool RequiresADL;
14548 
14549   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14550     Functions.append(ULE->decls_begin(), ULE->decls_end());
14551     // If the overload could not be resolved in the template definition
14552     // (because we had a dependent argument), ADL is performed as part of
14553     // template instantiation.
14554     RequiresADL = ULE->requiresADL();
14555   } else {
14556     // If we've resolved this to a particular non-member function, just call
14557     // that function. If we resolved it to a member function,
14558     // CreateOverloaded* will find that function for us.
14559     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14560     if (!isa<CXXMethodDecl>(ND))
14561       Functions.addDecl(ND);
14562     RequiresADL = false;
14563   }
14564 
14565   // Add any functions found via argument-dependent lookup.
14566   Expr *Args[2] = { First, Second };
14567   unsigned NumArgs = 1 + (Second != nullptr);
14568 
14569   // Create the overloaded operator invocation for unary operators.
14570   if (NumArgs == 1 || isPostIncDec) {
14571     UnaryOperatorKind Opc
14572       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14573     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14574                                            RequiresADL);
14575   }
14576 
14577   if (Op == OO_Subscript) {
14578     SourceLocation LBrace;
14579     SourceLocation RBrace;
14580 
14581     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14582       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14583       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14584       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14585     } else {
14586       LBrace = Callee->getBeginLoc();
14587       RBrace = OpLoc;
14588     }
14589 
14590     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14591                                                       First, Second);
14592   }
14593 
14594   // Create the overloaded operator invocation for binary operators.
14595   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14596   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14597       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14598   if (Result.isInvalid())
14599     return ExprError();
14600 
14601   return Result;
14602 }
14603 
14604 template<typename Derived>
14605 ExprResult
RebuildCXXPseudoDestructorExpr(Expr * Base,SourceLocation OperatorLoc,bool isArrow,CXXScopeSpec & SS,TypeSourceInfo * ScopeType,SourceLocation CCLoc,SourceLocation TildeLoc,PseudoDestructorTypeStorage Destroyed)14606 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14607                                                      SourceLocation OperatorLoc,
14608                                                        bool isArrow,
14609                                                        CXXScopeSpec &SS,
14610                                                      TypeSourceInfo *ScopeType,
14611                                                        SourceLocation CCLoc,
14612                                                        SourceLocation TildeLoc,
14613                                         PseudoDestructorTypeStorage Destroyed) {
14614   QualType BaseType = Base->getType();
14615   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14616       (!isArrow && !BaseType->getAs<RecordType>()) ||
14617       (isArrow && BaseType->getAs<PointerType>() &&
14618        !BaseType->castAs<PointerType>()->getPointeeType()
14619                                               ->template getAs<RecordType>())){
14620     // This pseudo-destructor expression is still a pseudo-destructor.
14621     return SemaRef.BuildPseudoDestructorExpr(
14622         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14623         CCLoc, TildeLoc, Destroyed);
14624   }
14625 
14626   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14627   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14628                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14629   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14630   NameInfo.setNamedTypeInfo(DestroyedType);
14631 
14632   // The scope type is now known to be a valid nested name specifier
14633   // component. Tack it on to the end of the nested name specifier.
14634   if (ScopeType) {
14635     if (!ScopeType->getType()->getAs<TagType>()) {
14636       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14637                      diag::err_expected_class_or_namespace)
14638           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14639       return ExprError();
14640     }
14641     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14642               CCLoc);
14643   }
14644 
14645   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14646   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14647                                             OperatorLoc, isArrow,
14648                                             SS, TemplateKWLoc,
14649                                             /*FIXME: FirstQualifier*/ nullptr,
14650                                             NameInfo,
14651                                             /*TemplateArgs*/ nullptr,
14652                                             /*S*/nullptr);
14653 }
14654 
14655 template<typename Derived>
14656 StmtResult
TransformCapturedStmt(CapturedStmt * S)14657 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14658   SourceLocation Loc = S->getBeginLoc();
14659   CapturedDecl *CD = S->getCapturedDecl();
14660   unsigned NumParams = CD->getNumParams();
14661   unsigned ContextParamPos = CD->getContextParamPosition();
14662   SmallVector<Sema::CapturedParamNameType, 4> Params;
14663   for (unsigned I = 0; I < NumParams; ++I) {
14664     if (I != ContextParamPos) {
14665       Params.push_back(
14666              std::make_pair(
14667                   CD->getParam(I)->getName(),
14668                   getDerived().TransformType(CD->getParam(I)->getType())));
14669     } else {
14670       Params.push_back(std::make_pair(StringRef(), QualType()));
14671     }
14672   }
14673   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14674                                      S->getCapturedRegionKind(), Params);
14675   StmtResult Body;
14676   {
14677     Sema::CompoundScopeRAII CompoundScope(getSema());
14678     Body = getDerived().TransformStmt(S->getCapturedStmt());
14679   }
14680 
14681   if (Body.isInvalid()) {
14682     getSema().ActOnCapturedRegionError();
14683     return StmtError();
14684   }
14685 
14686   return getSema().ActOnCapturedRegionEnd(Body.get());
14687 }
14688 
14689 } // end namespace clang
14690 
14691 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14692