1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements a semantic tree transformation that takes a given
10 //  AST and rebuilds it, possibly transforming some nodes in the process.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
16 
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/ExprCXX.h"
23 #include "clang/AST/ExprObjC.h"
24 #include "clang/AST/Stmt.h"
25 #include "clang/AST/StmtCXX.h"
26 #include "clang/AST/StmtObjC.h"
27 #include "clang/AST/StmtOpenMP.h"
28 #include "clang/Sema/Designator.h"
29 #include "clang/Sema/Lookup.h"
30 #include "clang/Sema/Ownership.h"
31 #include "clang/Sema/ParsedTemplate.h"
32 #include "clang/Sema/ScopeInfo.h"
33 #include "clang/Sema/SemaDiagnostic.h"
34 #include "clang/Sema/SemaInternal.h"
35 #include "llvm/ADT/ArrayRef.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include <algorithm>
38 
39 namespace clang {
40 using namespace sema;
41 
42 /// \brief A semantic tree transformation that allows one to transform one
43 /// abstract syntax tree into another.
44 ///
45 /// A new tree transformation is defined by creating a new subclass \c X of
46 /// \c TreeTransform<X> and then overriding certain operations to provide
47 /// behavior specific to that transformation. For example, template
48 /// instantiation is implemented as a tree transformation where the
49 /// transformation of TemplateTypeParmType nodes involves substituting the
50 /// template arguments for their corresponding template parameters; a similar
51 /// transformation is performed for non-type template parameters and
52 /// template template parameters.
53 ///
54 /// This tree-transformation template uses static polymorphism to allow
55 /// subclasses to customize any of its operations. Thus, a subclass can
56 /// override any of the transformation or rebuild operators by providing an
57 /// operation with the same signature as the default implementation. The
58 /// overridding function should not be virtual.
59 ///
60 /// Semantic tree transformations are split into two stages, either of which
61 /// can be replaced by a subclass. The "transform" step transforms an AST node
62 /// or the parts of an AST node using the various transformation functions,
63 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
64 /// node of the appropriate kind from the pieces. The default transformation
65 /// routines recursively transform the operands to composite AST nodes (e.g.,
66 /// the pointee type of a PointerType node) and, if any of those operand nodes
67 /// were changed by the transformation, invokes the rebuild operation to create
68 /// a new AST node.
69 ///
70 /// Subclasses can customize the transformation at various levels. The
71 /// most coarse-grained transformations involve replacing TransformType(),
72 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
73 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
74 /// new implementations.
75 ///
76 /// For more fine-grained transformations, subclasses can replace any of the
77 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
78 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
79 /// replacing TransformTemplateTypeParmType() allows template instantiation
80 /// to substitute template arguments for their corresponding template
81 /// parameters. Additionally, subclasses can override the \c RebuildXXX
82 /// functions to control how AST nodes are rebuilt when their operands change.
83 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
84 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
85 /// be able to use more efficient rebuild steps.
86 ///
87 /// There are a handful of other functions that can be overridden, allowing one
88 /// to avoid traversing nodes that don't need any transformation
89 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
90 /// operands have not changed (\c AlwaysRebuild()), and customize the
91 /// default locations and entity names used for type-checking
92 /// (\c getBaseLocation(), \c getBaseEntity()).
93 template<typename Derived>
94 class TreeTransform {
95   /// \brief Private RAII object that helps us forget and then re-remember
96   /// the template argument corresponding to a partially-substituted parameter
97   /// pack.
98   class ForgetPartiallySubstitutedPackRAII {
99     Derived &Self;
100     TemplateArgument Old;
101 
102   public:
ForgetPartiallySubstitutedPackRAII(Derived & Self)103     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
104       Old = Self.ForgetPartiallySubstitutedPack();
105     }
106 
~ForgetPartiallySubstitutedPackRAII()107     ~ForgetPartiallySubstitutedPackRAII() {
108       Self.RememberPartiallySubstitutedPack(Old);
109     }
110   };
111 
112 protected:
113   Sema &SemaRef;
114 
115   /// \brief The set of local declarations that have been transformed, for
116   /// cases where we are forced to build new declarations within the transformer
117   /// rather than in the subclass (e.g., lambda closure types).
118   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
119 
120 public:
121   /// \brief Initializes a new tree transformer.
TreeTransform(Sema & SemaRef)122   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
123 
124   /// \brief Retrieves a reference to the derived class.
getDerived()125   Derived &getDerived() { return static_cast<Derived&>(*this); }
126 
127   /// \brief Retrieves a reference to the derived class.
getDerived()128   const Derived &getDerived() const {
129     return static_cast<const Derived&>(*this);
130   }
131 
Owned(Expr * E)132   static inline ExprResult Owned(Expr *E) { return E; }
Owned(Stmt * S)133   static inline StmtResult Owned(Stmt *S) { return S; }
134 
135   /// \brief Retrieves a reference to the semantic analysis object used for
136   /// this tree transform.
getSema()137   Sema &getSema() const { return SemaRef; }
138 
139   /// \brief Whether the transformation should always rebuild AST nodes, even
140   /// if none of the children have changed.
141   ///
142   /// Subclasses may override this function to specify when the transformation
143   /// should rebuild all AST nodes.
144   ///
145   /// We must always rebuild all AST nodes when performing variadic template
146   /// pack expansion, in order to avoid violating the AST invariant that each
147   /// statement node appears at most once in its containing declaration.
AlwaysRebuild()148   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
149 
150   /// \brief Returns the location of the entity being transformed, if that
151   /// information was not available elsewhere in the AST.
152   ///
153   /// By default, returns no source-location information. Subclasses can
154   /// provide an alternative implementation that provides better location
155   /// information.
getBaseLocation()156   SourceLocation getBaseLocation() { return SourceLocation(); }
157 
158   /// \brief Returns the name of the entity being transformed, if that
159   /// information was not available elsewhere in the AST.
160   ///
161   /// By default, returns an empty name. Subclasses can provide an alternative
162   /// implementation with a more precise name.
getBaseEntity()163   DeclarationName getBaseEntity() { return DeclarationName(); }
164 
165   /// \brief Sets the "base" location and entity when that
166   /// information is known based on another transformation.
167   ///
168   /// By default, the source location and entity are ignored. Subclasses can
169   /// override this function to provide a customized implementation.
setBase(SourceLocation Loc,DeclarationName Entity)170   void setBase(SourceLocation Loc, DeclarationName Entity) { }
171 
172   /// \brief RAII object that temporarily sets the base location and entity
173   /// used for reporting diagnostics in types.
174   class TemporaryBase {
175     TreeTransform &Self;
176     SourceLocation OldLocation;
177     DeclarationName OldEntity;
178 
179   public:
TemporaryBase(TreeTransform & Self,SourceLocation Location,DeclarationName Entity)180     TemporaryBase(TreeTransform &Self, SourceLocation Location,
181                   DeclarationName Entity) : Self(Self) {
182       OldLocation = Self.getDerived().getBaseLocation();
183       OldEntity = Self.getDerived().getBaseEntity();
184 
185       if (Location.isValid())
186         Self.getDerived().setBase(Location, Entity);
187     }
188 
~TemporaryBase()189     ~TemporaryBase() {
190       Self.getDerived().setBase(OldLocation, OldEntity);
191     }
192   };
193 
194   /// \brief Determine whether the given type \p T has already been
195   /// transformed.
196   ///
197   /// Subclasses can provide an alternative implementation of this routine
198   /// to short-circuit evaluation when it is known that a given type will
199   /// not change. For example, template instantiation need not traverse
200   /// non-dependent types.
AlreadyTransformed(QualType T)201   bool AlreadyTransformed(QualType T) {
202     return T.isNull();
203   }
204 
205   /// \brief Determine whether the given call argument should be dropped, e.g.,
206   /// because it is a default argument.
207   ///
208   /// Subclasses can provide an alternative implementation of this routine to
209   /// determine which kinds of call arguments get dropped. By default,
210   /// CXXDefaultArgument nodes are dropped (prior to transformation).
DropCallArgument(Expr * E)211   bool DropCallArgument(Expr *E) {
212     return E->isDefaultArgument();
213   }
214 
215   /// \brief Determine whether we should expand a pack expansion with the
216   /// given set of parameter packs into separate arguments by repeatedly
217   /// transforming the pattern.
218   ///
219   /// By default, the transformer never tries to expand pack expansions.
220   /// Subclasses can override this routine to provide different behavior.
221   ///
222   /// \param EllipsisLoc The location of the ellipsis that identifies the
223   /// pack expansion.
224   ///
225   /// \param PatternRange The source range that covers the entire pattern of
226   /// the pack expansion.
227   ///
228   /// \param Unexpanded The set of unexpanded parameter packs within the
229   /// pattern.
230   ///
231   /// \param ShouldExpand Will be set to \c true if the transformer should
232   /// expand the corresponding pack expansions into separate arguments. When
233   /// set, \c NumExpansions must also be set.
234   ///
235   /// \param RetainExpansion Whether the caller should add an unexpanded
236   /// pack expansion after all of the expanded arguments. This is used
237   /// when extending explicitly-specified template argument packs per
238   /// C++0x [temp.arg.explicit]p9.
239   ///
240   /// \param NumExpansions The number of separate arguments that will be in
241   /// the expanded form of the corresponding pack expansion. This is both an
242   /// input and an output parameter, which can be set by the caller if the
243   /// number of expansions is known a priori (e.g., due to a prior substitution)
244   /// and will be set by the callee when the number of expansions is known.
245   /// The callee must set this value when \c ShouldExpand is \c true; it may
246   /// set this value in other cases.
247   ///
248   /// \returns true if an error occurred (e.g., because the parameter packs
249   /// are to be instantiated with arguments of different lengths), false
250   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
251   /// must be set.
TryExpandParameterPacks(SourceLocation EllipsisLoc,SourceRange PatternRange,ArrayRef<UnexpandedParameterPack> Unexpanded,bool & ShouldExpand,bool & RetainExpansion,Optional<unsigned> & NumExpansions)252   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
253                                SourceRange PatternRange,
254                                ArrayRef<UnexpandedParameterPack> Unexpanded,
255                                bool &ShouldExpand,
256                                bool &RetainExpansion,
257                                Optional<unsigned> &NumExpansions) {
258     ShouldExpand = false;
259     return false;
260   }
261 
262   /// \brief "Forget" about the partially-substituted pack template argument,
263   /// when performing an instantiation that must preserve the parameter pack
264   /// use.
265   ///
266   /// This routine is meant to be overridden by the template instantiator.
ForgetPartiallySubstitutedPack()267   TemplateArgument ForgetPartiallySubstitutedPack() {
268     return TemplateArgument();
269   }
270 
271   /// \brief "Remember" the partially-substituted pack template argument
272   /// after performing an instantiation that must preserve the parameter pack
273   /// use.
274   ///
275   /// This routine is meant to be overridden by the template instantiator.
RememberPartiallySubstitutedPack(TemplateArgument Arg)276   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
277 
278   /// \brief Note to the derived class when a function parameter pack is
279   /// being expanded.
ExpandingFunctionParameterPack(ParmVarDecl * Pack)280   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
281 
282   /// \brief Transforms the given type into another type.
283   ///
284   /// By default, this routine transforms a type by creating a
285   /// TypeSourceInfo for it and delegating to the appropriate
286   /// function.  This is expensive, but we don't mind, because
287   /// this method is deprecated anyway;  all users should be
288   /// switched to storing TypeSourceInfos.
289   ///
290   /// \returns the transformed type.
291   QualType TransformType(QualType T);
292 
293   /// \brief Transforms the given type-with-location into a new
294   /// type-with-location.
295   ///
296   /// By default, this routine transforms a type by delegating to the
297   /// appropriate TransformXXXType to build a new type.  Subclasses
298   /// may override this function (to take over all type
299   /// transformations) or some set of the TransformXXXType functions
300   /// to alter the transformation.
301   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
302 
303   /// \brief Transform the given type-with-location into a new
304   /// type, collecting location information in the given builder
305   /// as necessary.
306   ///
307   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
308 
309   /// \brief Transform the given statement.
310   ///
311   /// By default, this routine transforms a statement by delegating to the
312   /// appropriate TransformXXXStmt function to transform a specific kind of
313   /// statement or the TransformExpr() function to transform an expression.
314   /// Subclasses may override this function to transform statements using some
315   /// other mechanism.
316   ///
317   /// \returns the transformed statement.
318   StmtResult TransformStmt(Stmt *S);
319 
320   /// \brief Transform the given statement.
321   ///
322   /// By default, this routine transforms a statement by delegating to the
323   /// appropriate TransformOMPXXXClause function to transform a specific kind
324   /// of clause. Subclasses may override this function to transform statements
325   /// using some other mechanism.
326   ///
327   /// \returns the transformed OpenMP clause.
328   OMPClause *TransformOMPClause(OMPClause *S);
329 
330   /// \brief Transform the given attribute.
331   ///
332   /// By default, this routine transforms a statement by delegating to the
333   /// appropriate TransformXXXAttr function to transform a specific kind
334   /// of attribute. Subclasses may override this function to transform
335   /// attributed statements using some other mechanism.
336   ///
337   /// \returns the transformed attribute
338   const Attr *TransformAttr(const Attr *S);
339 
340 /// \brief Transform the specified attribute.
341 ///
342 /// Subclasses should override the transformation of attributes with a pragma
343 /// spelling to transform expressions stored within the attribute.
344 ///
345 /// \returns the transformed attribute.
346 #define ATTR(X)
347 #define PRAGMA_SPELLING_ATTR(X)                                                \
348   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
349 #include "clang/Basic/AttrList.inc"
350 
351   /// \brief Transform the given expression.
352   ///
353   /// By default, this routine transforms an expression by delegating to the
354   /// appropriate TransformXXXExpr function to build a new expression.
355   /// Subclasses may override this function to transform expressions using some
356   /// other mechanism.
357   ///
358   /// \returns the transformed expression.
359   ExprResult TransformExpr(Expr *E);
360 
361   /// \brief Transform the given initializer.
362   ///
363   /// By default, this routine transforms an initializer by stripping off the
364   /// semantic nodes added by initialization, then passing the result to
365   /// TransformExpr or TransformExprs.
366   ///
367   /// \returns the transformed initializer.
368   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
369 
370   /// \brief Transform the given list of expressions.
371   ///
372   /// This routine transforms a list of expressions by invoking
373   /// \c TransformExpr() for each subexpression. However, it also provides
374   /// support for variadic templates by expanding any pack expansions (if the
375   /// derived class permits such expansion) along the way. When pack expansions
376   /// are present, the number of outputs may not equal the number of inputs.
377   ///
378   /// \param Inputs The set of expressions to be transformed.
379   ///
380   /// \param NumInputs The number of expressions in \c Inputs.
381   ///
382   /// \param IsCall If \c true, then this transform is being performed on
383   /// function-call arguments, and any arguments that should be dropped, will
384   /// be.
385   ///
386   /// \param Outputs The transformed input expressions will be added to this
387   /// vector.
388   ///
389   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
390   /// due to transformation.
391   ///
392   /// \returns true if an error occurred, false otherwise.
393   bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall,
394                       SmallVectorImpl<Expr *> &Outputs,
395                       bool *ArgChanged = nullptr);
396 
397   /// \brief Transform the given declaration, which is referenced from a type
398   /// or expression.
399   ///
400   /// By default, acts as the identity function on declarations, unless the
401   /// transformer has had to transform the declaration itself. Subclasses
402   /// may override this function to provide alternate behavior.
TransformDecl(SourceLocation Loc,Decl * D)403   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
404     llvm::DenseMap<Decl *, Decl *>::iterator Known
405       = TransformedLocalDecls.find(D);
406     if (Known != TransformedLocalDecls.end())
407       return Known->second;
408 
409     return D;
410   }
411 
412   /// \brief Transform the attributes associated with the given declaration and
413   /// place them on the new declaration.
414   ///
415   /// By default, this operation does nothing. Subclasses may override this
416   /// behavior to transform attributes.
transformAttrs(Decl * Old,Decl * New)417   void transformAttrs(Decl *Old, Decl *New) { }
418 
419   /// \brief Note that a local declaration has been transformed by this
420   /// transformer.
421   ///
422   /// Local declarations are typically transformed via a call to
423   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
424   /// the transformer itself has to transform the declarations. This routine
425   /// can be overridden by a subclass that keeps track of such mappings.
transformedLocalDecl(Decl * Old,Decl * New)426   void transformedLocalDecl(Decl *Old, Decl *New) {
427     TransformedLocalDecls[Old] = New;
428   }
429 
430   /// \brief Transform the definition of the given declaration.
431   ///
432   /// By default, invokes TransformDecl() to transform the declaration.
433   /// Subclasses may override this function to provide alternate behavior.
TransformDefinition(SourceLocation Loc,Decl * D)434   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
435     return getDerived().TransformDecl(Loc, D);
436   }
437 
438   /// \brief Transform the given declaration, which was the first part of a
439   /// nested-name-specifier in a member access expression.
440   ///
441   /// This specific declaration transformation only applies to the first
442   /// identifier in a nested-name-specifier of a member access expression, e.g.,
443   /// the \c T in \c x->T::member
444   ///
445   /// By default, invokes TransformDecl() to transform the declaration.
446   /// Subclasses may override this function to provide alternate behavior.
TransformFirstQualifierInScope(NamedDecl * D,SourceLocation Loc)447   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
448     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
449   }
450 
451   /// \brief Transform the given nested-name-specifier with source-location
452   /// information.
453   ///
454   /// By default, transforms all of the types and declarations within the
455   /// nested-name-specifier. Subclasses may override this function to provide
456   /// alternate behavior.
457   NestedNameSpecifierLoc
458   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
459                                   QualType ObjectType = QualType(),
460                                   NamedDecl *FirstQualifierInScope = nullptr);
461 
462   /// \brief Transform the given declaration name.
463   ///
464   /// By default, transforms the types of conversion function, constructor,
465   /// and destructor names and then (if needed) rebuilds the declaration name.
466   /// Identifiers and selectors are returned unmodified. Sublcasses may
467   /// override this function to provide alternate behavior.
468   DeclarationNameInfo
469   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
470 
471   /// \brief Transform the given template name.
472   ///
473   /// \param SS The nested-name-specifier that qualifies the template
474   /// name. This nested-name-specifier must already have been transformed.
475   ///
476   /// \param Name The template name to transform.
477   ///
478   /// \param NameLoc The source location of the template name.
479   ///
480   /// \param ObjectType If we're translating a template name within a member
481   /// access expression, this is the type of the object whose member template
482   /// is being referenced.
483   ///
484   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
485   /// also refers to a name within the current (lexical) scope, this is the
486   /// declaration it refers to.
487   ///
488   /// By default, transforms the template name by transforming the declarations
489   /// and nested-name-specifiers that occur within the template name.
490   /// Subclasses may override this function to provide alternate behavior.
491   TemplateName
492   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
493                         SourceLocation NameLoc,
494                         QualType ObjectType = QualType(),
495                         NamedDecl *FirstQualifierInScope = nullptr);
496 
497   /// \brief Transform the given template argument.
498   ///
499   /// By default, this operation transforms the type, expression, or
500   /// declaration stored within the template argument and constructs a
501   /// new template argument from the transformed result. Subclasses may
502   /// override this function to provide alternate behavior.
503   ///
504   /// Returns true if there was an error.
505   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
506                                  TemplateArgumentLoc &Output);
507 
508   /// \brief Transform the given set of template arguments.
509   ///
510   /// By default, this operation transforms all of the template arguments
511   /// in the input set using \c TransformTemplateArgument(), and appends
512   /// the transformed arguments to the output list.
513   ///
514   /// Note that this overload of \c TransformTemplateArguments() is merely
515   /// a convenience function. Subclasses that wish to override this behavior
516   /// should override the iterator-based member template version.
517   ///
518   /// \param Inputs The set of template arguments to be transformed.
519   ///
520   /// \param NumInputs The number of template arguments in \p Inputs.
521   ///
522   /// \param Outputs The set of transformed template arguments output by this
523   /// routine.
524   ///
525   /// Returns true if an error occurred.
TransformTemplateArguments(const TemplateArgumentLoc * Inputs,unsigned NumInputs,TemplateArgumentListInfo & Outputs)526   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
527                                   unsigned NumInputs,
528                                   TemplateArgumentListInfo &Outputs) {
529     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
530   }
531 
532   /// \brief Transform the given set of template arguments.
533   ///
534   /// By default, this operation transforms all of the template arguments
535   /// in the input set using \c TransformTemplateArgument(), and appends
536   /// the transformed arguments to the output list.
537   ///
538   /// \param First An iterator to the first template argument.
539   ///
540   /// \param Last An iterator one step past the last template argument.
541   ///
542   /// \param Outputs The set of transformed template arguments output by this
543   /// routine.
544   ///
545   /// Returns true if an error occurred.
546   template<typename InputIterator>
547   bool TransformTemplateArguments(InputIterator First,
548                                   InputIterator Last,
549                                   TemplateArgumentListInfo &Outputs);
550 
551   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
552   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
553                                  TemplateArgumentLoc &ArgLoc);
554 
555   /// \brief Fakes up a TypeSourceInfo for a type.
InventTypeSourceInfo(QualType T)556   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
557     return SemaRef.Context.getTrivialTypeSourceInfo(T,
558                        getDerived().getBaseLocation());
559   }
560 
561 #define ABSTRACT_TYPELOC(CLASS, PARENT)
562 #define TYPELOC(CLASS, PARENT)                                   \
563   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
564 #include "clang/AST/TypeLocNodes.def"
565 
566   template<typename Fn>
567   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
568                                       FunctionProtoTypeLoc TL,
569                                       CXXRecordDecl *ThisContext,
570                                       unsigned ThisTypeQuals,
571                                       Fn TransformExceptionSpec);
572 
573   bool TransformExceptionSpec(SourceLocation Loc,
574                               FunctionProtoType::ExceptionSpecInfo &ESI,
575                               SmallVectorImpl<QualType> &Exceptions,
576                               bool &Changed);
577 
578   StmtResult TransformSEHHandler(Stmt *Handler);
579 
580   QualType
581   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
582                                       TemplateSpecializationTypeLoc TL,
583                                       TemplateName Template);
584 
585   QualType
586   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
587                                       DependentTemplateSpecializationTypeLoc TL,
588                                                TemplateName Template,
589                                                CXXScopeSpec &SS);
590 
591   QualType TransformDependentTemplateSpecializationType(
592       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
593       NestedNameSpecifierLoc QualifierLoc);
594 
595   /// \brief Transforms the parameters of a function type into the
596   /// given vectors.
597   ///
598   /// The result vectors should be kept in sync; null entries in the
599   /// variables vector are acceptable.
600   ///
601   /// Return true on error.
602   bool TransformFunctionTypeParams(SourceLocation Loc,
603                                    ParmVarDecl **Params, unsigned NumParams,
604                                    const QualType *ParamTypes,
605                                    SmallVectorImpl<QualType> &PTypes,
606                                    SmallVectorImpl<ParmVarDecl*> *PVars);
607 
608   /// \brief Transforms a single function-type parameter.  Return null
609   /// on error.
610   ///
611   /// \param indexAdjustment - A number to add to the parameter's
612   ///   scope index;  can be negative
613   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
614                                           int indexAdjustment,
615                                           Optional<unsigned> NumExpansions,
616                                           bool ExpectParameterPack);
617 
618   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
619 
620   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
621   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
622 
623   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
624   /// \brief Transform the captures and body of a lambda expression.
625   ExprResult TransformLambdaScope(LambdaExpr *E, CXXMethodDecl *CallOperator,
626        ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes);
627 
TransformTemplateParameterList(TemplateParameterList * TPL)628   TemplateParameterList *TransformTemplateParameterList(
629         TemplateParameterList *TPL) {
630     return TPL;
631   }
632 
633   ExprResult TransformAddressOfOperand(Expr *E);
634 
635   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
636                                                 bool IsAddressOfOperand,
637                                                 TypeSourceInfo **RecoveryTSI);
638 
639   ExprResult TransformParenDependentScopeDeclRefExpr(
640       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
641       TypeSourceInfo **RecoveryTSI);
642 
643   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
644 
645 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
646 // amount of stack usage with clang.
647 #define STMT(Node, Parent)                        \
648   LLVM_ATTRIBUTE_NOINLINE \
649   StmtResult Transform##Node(Node *S);
650 #define EXPR(Node, Parent)                        \
651   LLVM_ATTRIBUTE_NOINLINE \
652   ExprResult Transform##Node(Node *E);
653 #define ABSTRACT_STMT(Stmt)
654 #include "clang/AST/StmtNodes.inc"
655 
656 #define OPENMP_CLAUSE(Name, Class)                        \
657   LLVM_ATTRIBUTE_NOINLINE \
658   OMPClause *Transform ## Class(Class *S);
659 #include "clang/Basic/OpenMPKinds.def"
660 
661   /// \brief Build a new pointer type given its pointee type.
662   ///
663   /// By default, performs semantic analysis when building the pointer type.
664   /// Subclasses may override this routine to provide different behavior.
665   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
666 
667   /// \brief Build a new block pointer type given its pointee type.
668   ///
669   /// By default, performs semantic analysis when building the block pointer
670   /// type. Subclasses may override this routine to provide different behavior.
671   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
672 
673   /// \brief Build a new reference type given the type it references.
674   ///
675   /// By default, performs semantic analysis when building the
676   /// reference type. Subclasses may override this routine to provide
677   /// different behavior.
678   ///
679   /// \param LValue whether the type was written with an lvalue sigil
680   /// or an rvalue sigil.
681   QualType RebuildReferenceType(QualType ReferentType,
682                                 bool LValue,
683                                 SourceLocation Sigil);
684 
685   /// \brief Build a new member pointer type given the pointee type and the
686   /// class type it refers into.
687   ///
688   /// By default, performs semantic analysis when building the member pointer
689   /// type. Subclasses may override this routine to provide different behavior.
690   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
691                                     SourceLocation Sigil);
692 
693   /// \brief Build a new array type given the element type, size
694   /// modifier, size of the array (if known), size expression, and index type
695   /// qualifiers.
696   ///
697   /// By default, performs semantic analysis when building the array type.
698   /// Subclasses may override this routine to provide different behavior.
699   /// Also by default, all of the other Rebuild*Array
700   QualType RebuildArrayType(QualType ElementType,
701                             ArrayType::ArraySizeModifier SizeMod,
702                             const llvm::APInt *Size,
703                             Expr *SizeExpr,
704                             unsigned IndexTypeQuals,
705                             SourceRange BracketsRange);
706 
707   /// \brief Build a new constant array type given the element type, size
708   /// modifier, (known) size of the array, and index type qualifiers.
709   ///
710   /// By default, performs semantic analysis when building the array type.
711   /// Subclasses may override this routine to provide different behavior.
712   QualType RebuildConstantArrayType(QualType ElementType,
713                                     ArrayType::ArraySizeModifier SizeMod,
714                                     const llvm::APInt &Size,
715                                     unsigned IndexTypeQuals,
716                                     SourceRange BracketsRange);
717 
718   /// \brief Build a new incomplete array type given the element type, size
719   /// modifier, and index type qualifiers.
720   ///
721   /// By default, performs semantic analysis when building the array type.
722   /// Subclasses may override this routine to provide different behavior.
723   QualType RebuildIncompleteArrayType(QualType ElementType,
724                                       ArrayType::ArraySizeModifier SizeMod,
725                                       unsigned IndexTypeQuals,
726                                       SourceRange BracketsRange);
727 
728   /// \brief Build a new variable-length array type given the element type,
729   /// size modifier, size expression, and index type qualifiers.
730   ///
731   /// By default, performs semantic analysis when building the array type.
732   /// Subclasses may override this routine to provide different behavior.
733   QualType RebuildVariableArrayType(QualType ElementType,
734                                     ArrayType::ArraySizeModifier SizeMod,
735                                     Expr *SizeExpr,
736                                     unsigned IndexTypeQuals,
737                                     SourceRange BracketsRange);
738 
739   /// \brief Build a new dependent-sized array type given the element type,
740   /// size modifier, size expression, and index type qualifiers.
741   ///
742   /// By default, performs semantic analysis when building the array type.
743   /// Subclasses may override this routine to provide different behavior.
744   QualType RebuildDependentSizedArrayType(QualType ElementType,
745                                           ArrayType::ArraySizeModifier SizeMod,
746                                           Expr *SizeExpr,
747                                           unsigned IndexTypeQuals,
748                                           SourceRange BracketsRange);
749 
750   /// \brief Build a new vector type given the element type and
751   /// number of elements.
752   ///
753   /// By default, performs semantic analysis when building the vector type.
754   /// Subclasses may override this routine to provide different behavior.
755   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
756                              VectorType::VectorKind VecKind);
757 
758   /// \brief Build a new extended vector type given the element type and
759   /// number of elements.
760   ///
761   /// By default, performs semantic analysis when building the vector type.
762   /// Subclasses may override this routine to provide different behavior.
763   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
764                                 SourceLocation AttributeLoc);
765 
766   /// \brief Build a new potentially dependently-sized extended vector type
767   /// given the element type and number of elements.
768   ///
769   /// By default, performs semantic analysis when building the vector type.
770   /// Subclasses may override this routine to provide different behavior.
771   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
772                                               Expr *SizeExpr,
773                                               SourceLocation AttributeLoc);
774 
775   /// \brief Build a new function type.
776   ///
777   /// By default, performs semantic analysis when building the function type.
778   /// Subclasses may override this routine to provide different behavior.
779   QualType RebuildFunctionProtoType(QualType T,
780                                     MutableArrayRef<QualType> ParamTypes,
781                                     const FunctionProtoType::ExtProtoInfo &EPI);
782 
783   /// \brief Build a new unprototyped function type.
784   QualType RebuildFunctionNoProtoType(QualType ResultType);
785 
786   /// \brief Rebuild an unresolved typename type, given the decl that
787   /// the UnresolvedUsingTypenameDecl was transformed to.
788   QualType RebuildUnresolvedUsingType(Decl *D);
789 
790   /// \brief Build a new typedef type.
RebuildTypedefType(TypedefNameDecl * Typedef)791   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
792     return SemaRef.Context.getTypeDeclType(Typedef);
793   }
794 
795   /// \brief Build a new class/struct/union type.
RebuildRecordType(RecordDecl * Record)796   QualType RebuildRecordType(RecordDecl *Record) {
797     return SemaRef.Context.getTypeDeclType(Record);
798   }
799 
800   /// \brief Build a new Enum type.
RebuildEnumType(EnumDecl * Enum)801   QualType RebuildEnumType(EnumDecl *Enum) {
802     return SemaRef.Context.getTypeDeclType(Enum);
803   }
804 
805   /// \brief Build a new typeof(expr) type.
806   ///
807   /// By default, performs semantic analysis when building the typeof type.
808   /// Subclasses may override this routine to provide different behavior.
809   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
810 
811   /// \brief Build a new typeof(type) type.
812   ///
813   /// By default, builds a new TypeOfType with the given underlying type.
814   QualType RebuildTypeOfType(QualType Underlying);
815 
816   /// \brief Build a new unary transform type.
817   QualType RebuildUnaryTransformType(QualType BaseType,
818                                      UnaryTransformType::UTTKind UKind,
819                                      SourceLocation Loc);
820 
821   /// \brief Build a new C++11 decltype type.
822   ///
823   /// By default, performs semantic analysis when building the decltype type.
824   /// Subclasses may override this routine to provide different behavior.
825   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
826 
827   /// \brief Build a new C++11 auto type.
828   ///
829   /// By default, builds a new AutoType with the given deduced type.
RebuildAutoType(QualType Deduced,bool IsDecltypeAuto)830   QualType RebuildAutoType(QualType Deduced, bool IsDecltypeAuto) {
831     // Note, IsDependent is always false here: we implicitly convert an 'auto'
832     // which has been deduced to a dependent type into an undeduced 'auto', so
833     // that we'll retry deduction after the transformation.
834     return SemaRef.Context.getAutoType(Deduced, IsDecltypeAuto,
835                                        /*IsDependent*/ false);
836   }
837 
838   /// \brief Build a new template specialization type.
839   ///
840   /// By default, performs semantic analysis when building the template
841   /// specialization type. Subclasses may override this routine to provide
842   /// different behavior.
843   QualType RebuildTemplateSpecializationType(TemplateName Template,
844                                              SourceLocation TemplateLoc,
845                                              TemplateArgumentListInfo &Args);
846 
847   /// \brief Build a new parenthesized type.
848   ///
849   /// By default, builds a new ParenType type from the inner type.
850   /// Subclasses may override this routine to provide different behavior.
RebuildParenType(QualType InnerType)851   QualType RebuildParenType(QualType InnerType) {
852     return SemaRef.Context.getParenType(InnerType);
853   }
854 
855   /// \brief Build a new qualified name type.
856   ///
857   /// By default, builds a new ElaboratedType type from the keyword,
858   /// the nested-name-specifier and the named type.
859   /// Subclasses may override this routine to provide different behavior.
RebuildElaboratedType(SourceLocation KeywordLoc,ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,QualType Named)860   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
861                                  ElaboratedTypeKeyword Keyword,
862                                  NestedNameSpecifierLoc QualifierLoc,
863                                  QualType Named) {
864     return SemaRef.Context.getElaboratedType(Keyword,
865                                          QualifierLoc.getNestedNameSpecifier(),
866                                              Named);
867   }
868 
869   /// \brief Build a new typename type that refers to a template-id.
870   ///
871   /// By default, builds a new DependentNameType type from the
872   /// nested-name-specifier and the given type. Subclasses may override
873   /// this routine to provide different behavior.
RebuildDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Name,SourceLocation NameLoc,TemplateArgumentListInfo & Args)874   QualType RebuildDependentTemplateSpecializationType(
875                                           ElaboratedTypeKeyword Keyword,
876                                           NestedNameSpecifierLoc QualifierLoc,
877                                           const IdentifierInfo *Name,
878                                           SourceLocation NameLoc,
879                                           TemplateArgumentListInfo &Args) {
880     // Rebuild the template name.
881     // TODO: avoid TemplateName abstraction
882     CXXScopeSpec SS;
883     SS.Adopt(QualifierLoc);
884     TemplateName InstName
885       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
886                                          nullptr);
887 
888     if (InstName.isNull())
889       return QualType();
890 
891     // If it's still dependent, make a dependent specialization.
892     if (InstName.getAsDependentTemplateName())
893       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
894                                           QualifierLoc.getNestedNameSpecifier(),
895                                                                     Name,
896                                                                     Args);
897 
898     // Otherwise, make an elaborated type wrapping a non-dependent
899     // specialization.
900     QualType T =
901     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
902     if (T.isNull()) return QualType();
903 
904     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
905       return T;
906 
907     return SemaRef.Context.getElaboratedType(Keyword,
908                                        QualifierLoc.getNestedNameSpecifier(),
909                                              T);
910   }
911 
912   /// \brief Build a new typename type that refers to an identifier.
913   ///
914   /// By default, performs semantic analysis when building the typename type
915   /// (or elaborated type). Subclasses may override this routine to provide
916   /// different behavior.
RebuildDependentNameType(ElaboratedTypeKeyword Keyword,SourceLocation KeywordLoc,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Id,SourceLocation IdLoc)917   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
918                                     SourceLocation KeywordLoc,
919                                     NestedNameSpecifierLoc QualifierLoc,
920                                     const IdentifierInfo *Id,
921                                     SourceLocation IdLoc) {
922     CXXScopeSpec SS;
923     SS.Adopt(QualifierLoc);
924 
925     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
926       // If the name is still dependent, just build a new dependent name type.
927       if (!SemaRef.computeDeclContext(SS))
928         return SemaRef.Context.getDependentNameType(Keyword,
929                                           QualifierLoc.getNestedNameSpecifier(),
930                                                     Id);
931     }
932 
933     if (Keyword == ETK_None || Keyword == ETK_Typename)
934       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
935                                        *Id, IdLoc);
936 
937     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
938 
939     // We had a dependent elaborated-type-specifier that has been transformed
940     // into a non-dependent elaborated-type-specifier. Find the tag we're
941     // referring to.
942     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
943     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
944     if (!DC)
945       return QualType();
946 
947     if (SemaRef.RequireCompleteDeclContext(SS, DC))
948       return QualType();
949 
950     TagDecl *Tag = nullptr;
951     SemaRef.LookupQualifiedName(Result, DC);
952     switch (Result.getResultKind()) {
953       case LookupResult::NotFound:
954       case LookupResult::NotFoundInCurrentInstantiation:
955         break;
956 
957       case LookupResult::Found:
958         Tag = Result.getAsSingle<TagDecl>();
959         break;
960 
961       case LookupResult::FoundOverloaded:
962       case LookupResult::FoundUnresolvedValue:
963         llvm_unreachable("Tag lookup cannot find non-tags");
964 
965       case LookupResult::Ambiguous:
966         // Let the LookupResult structure handle ambiguities.
967         return QualType();
968     }
969 
970     if (!Tag) {
971       // Check where the name exists but isn't a tag type and use that to emit
972       // better diagnostics.
973       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
974       SemaRef.LookupQualifiedName(Result, DC);
975       switch (Result.getResultKind()) {
976         case LookupResult::Found:
977         case LookupResult::FoundOverloaded:
978         case LookupResult::FoundUnresolvedValue: {
979           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
980           unsigned Kind = 0;
981           if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
982           else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2;
983           else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3;
984           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
985           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
986           break;
987         }
988         default:
989           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
990               << Kind << Id << DC << QualifierLoc.getSourceRange();
991           break;
992       }
993       return QualType();
994     }
995 
996     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
997                                               IdLoc, *Id)) {
998       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
999       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1000       return QualType();
1001     }
1002 
1003     // Build the elaborated-type-specifier type.
1004     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1005     return SemaRef.Context.getElaboratedType(Keyword,
1006                                          QualifierLoc.getNestedNameSpecifier(),
1007                                              T);
1008   }
1009 
1010   /// \brief Build a new pack expansion type.
1011   ///
1012   /// By default, builds a new PackExpansionType type from the given pattern.
1013   /// Subclasses may override this routine to provide different behavior.
RebuildPackExpansionType(QualType Pattern,SourceRange PatternRange,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)1014   QualType RebuildPackExpansionType(QualType Pattern,
1015                                     SourceRange PatternRange,
1016                                     SourceLocation EllipsisLoc,
1017                                     Optional<unsigned> NumExpansions) {
1018     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1019                                         NumExpansions);
1020   }
1021 
1022   /// \brief Build a new atomic type given its value type.
1023   ///
1024   /// By default, performs semantic analysis when building the atomic type.
1025   /// Subclasses may override this routine to provide different behavior.
1026   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1027 
1028   /// \brief Build a new template name given a nested name specifier, a flag
1029   /// indicating whether the "template" keyword was provided, and the template
1030   /// that the template name refers to.
1031   ///
1032   /// By default, builds the new template name directly. Subclasses may override
1033   /// this routine to provide different behavior.
1034   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1035                                    bool TemplateKW,
1036                                    TemplateDecl *Template);
1037 
1038   /// \brief Build a new template name given a nested name specifier and the
1039   /// name that is referred to as a template.
1040   ///
1041   /// By default, performs semantic analysis to determine whether the name can
1042   /// be resolved to a specific template, then builds the appropriate kind of
1043   /// template name. Subclasses may override this routine to provide different
1044   /// behavior.
1045   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1046                                    const IdentifierInfo &Name,
1047                                    SourceLocation NameLoc,
1048                                    QualType ObjectType,
1049                                    NamedDecl *FirstQualifierInScope);
1050 
1051   /// \brief Build a new template name given a nested name specifier and the
1052   /// overloaded operator name that is referred to as a template.
1053   ///
1054   /// By default, performs semantic analysis to determine whether the name can
1055   /// be resolved to a specific template, then builds the appropriate kind of
1056   /// template name. Subclasses may override this routine to provide different
1057   /// behavior.
1058   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1059                                    OverloadedOperatorKind Operator,
1060                                    SourceLocation NameLoc,
1061                                    QualType ObjectType);
1062 
1063   /// \brief Build a new template name given a template template parameter pack
1064   /// and the
1065   ///
1066   /// By default, performs semantic analysis to determine whether the name can
1067   /// be resolved to a specific template, then builds the appropriate kind of
1068   /// template name. Subclasses may override this routine to provide different
1069   /// behavior.
RebuildTemplateName(TemplateTemplateParmDecl * Param,const TemplateArgument & ArgPack)1070   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1071                                    const TemplateArgument &ArgPack) {
1072     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1073   }
1074 
1075   /// \brief Build a new compound statement.
1076   ///
1077   /// By default, performs semantic analysis to build the new statement.
1078   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundStmt(SourceLocation LBraceLoc,MultiStmtArg Statements,SourceLocation RBraceLoc,bool IsStmtExpr)1079   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1080                                        MultiStmtArg Statements,
1081                                        SourceLocation RBraceLoc,
1082                                        bool IsStmtExpr) {
1083     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1084                                        IsStmtExpr);
1085   }
1086 
1087   /// \brief Build a new case statement.
1088   ///
1089   /// By default, performs semantic analysis to build the new statement.
1090   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmt(SourceLocation CaseLoc,Expr * LHS,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation ColonLoc)1091   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1092                                    Expr *LHS,
1093                                    SourceLocation EllipsisLoc,
1094                                    Expr *RHS,
1095                                    SourceLocation ColonLoc) {
1096     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1097                                    ColonLoc);
1098   }
1099 
1100   /// \brief Attach the body to a new case statement.
1101   ///
1102   /// By default, performs semantic analysis to build the new statement.
1103   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmtBody(Stmt * S,Stmt * Body)1104   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1105     getSema().ActOnCaseStmtBody(S, Body);
1106     return S;
1107   }
1108 
1109   /// \brief Build a new default statement.
1110   ///
1111   /// By default, performs semantic analysis to build the new statement.
1112   /// Subclasses may override this routine to provide different behavior.
RebuildDefaultStmt(SourceLocation DefaultLoc,SourceLocation ColonLoc,Stmt * SubStmt)1113   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1114                                       SourceLocation ColonLoc,
1115                                       Stmt *SubStmt) {
1116     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1117                                       /*CurScope=*/nullptr);
1118   }
1119 
1120   /// \brief Build a new label statement.
1121   ///
1122   /// By default, performs semantic analysis to build the new statement.
1123   /// Subclasses may override this routine to provide different behavior.
RebuildLabelStmt(SourceLocation IdentLoc,LabelDecl * L,SourceLocation ColonLoc,Stmt * SubStmt)1124   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1125                               SourceLocation ColonLoc, Stmt *SubStmt) {
1126     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1127   }
1128 
1129   /// \brief Build a new label statement.
1130   ///
1131   /// By default, performs semantic analysis to build the new statement.
1132   /// Subclasses may override this routine to provide different behavior.
RebuildAttributedStmt(SourceLocation AttrLoc,ArrayRef<const Attr * > Attrs,Stmt * SubStmt)1133   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1134                                    ArrayRef<const Attr*> Attrs,
1135                                    Stmt *SubStmt) {
1136     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1137   }
1138 
1139   /// \brief Build a new "if" statement.
1140   ///
1141   /// By default, performs semantic analysis to build the new statement.
1142   /// Subclasses may override this routine to provide different behavior.
RebuildIfStmt(SourceLocation IfLoc,Sema::FullExprArg Cond,VarDecl * CondVar,Stmt * Then,SourceLocation ElseLoc,Stmt * Else)1143   StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
1144                            VarDecl *CondVar, Stmt *Then,
1145                            SourceLocation ElseLoc, Stmt *Else) {
1146     return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
1147   }
1148 
1149   /// \brief Start building a new switch statement.
1150   ///
1151   /// By default, performs semantic analysis to build the new statement.
1152   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtStart(SourceLocation SwitchLoc,Expr * Cond,VarDecl * CondVar)1153   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1154                                     Expr *Cond, VarDecl *CondVar) {
1155     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
1156                                             CondVar);
1157   }
1158 
1159   /// \brief Attach the body to the switch statement.
1160   ///
1161   /// By default, performs semantic analysis to build the new statement.
1162   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtBody(SourceLocation SwitchLoc,Stmt * Switch,Stmt * Body)1163   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1164                                    Stmt *Switch, Stmt *Body) {
1165     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1166   }
1167 
1168   /// \brief Build a new while statement.
1169   ///
1170   /// By default, performs semantic analysis to build the new statement.
1171   /// Subclasses may override this routine to provide different behavior.
RebuildWhileStmt(SourceLocation WhileLoc,Sema::FullExprArg Cond,VarDecl * CondVar,Stmt * Body)1172   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
1173                               VarDecl *CondVar, Stmt *Body) {
1174     return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
1175   }
1176 
1177   /// \brief Build a new do-while statement.
1178   ///
1179   /// By default, performs semantic analysis to build the new statement.
1180   /// Subclasses may override this routine to provide different behavior.
RebuildDoStmt(SourceLocation DoLoc,Stmt * Body,SourceLocation WhileLoc,SourceLocation LParenLoc,Expr * Cond,SourceLocation RParenLoc)1181   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1182                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1183                            Expr *Cond, SourceLocation RParenLoc) {
1184     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1185                                  Cond, RParenLoc);
1186   }
1187 
1188   /// \brief Build a new for statement.
1189   ///
1190   /// By default, performs semantic analysis to build the new statement.
1191   /// Subclasses may override this routine to provide different behavior.
RebuildForStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * Init,Sema::FullExprArg Cond,VarDecl * CondVar,Sema::FullExprArg Inc,SourceLocation RParenLoc,Stmt * Body)1192   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1193                             Stmt *Init, Sema::FullExprArg Cond,
1194                             VarDecl *CondVar, Sema::FullExprArg Inc,
1195                             SourceLocation RParenLoc, Stmt *Body) {
1196     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1197                                   CondVar, Inc, RParenLoc, Body);
1198   }
1199 
1200   /// \brief Build a new goto statement.
1201   ///
1202   /// By default, performs semantic analysis to build the new statement.
1203   /// Subclasses may override this routine to provide different behavior.
RebuildGotoStmt(SourceLocation GotoLoc,SourceLocation LabelLoc,LabelDecl * Label)1204   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1205                              LabelDecl *Label) {
1206     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1207   }
1208 
1209   /// \brief Build a new indirect goto statement.
1210   ///
1211   /// By default, performs semantic analysis to build the new statement.
1212   /// Subclasses may override this routine to provide different behavior.
RebuildIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,Expr * Target)1213   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1214                                      SourceLocation StarLoc,
1215                                      Expr *Target) {
1216     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1217   }
1218 
1219   /// \brief Build a new return statement.
1220   ///
1221   /// By default, performs semantic analysis to build the new statement.
1222   /// Subclasses may override this routine to provide different behavior.
RebuildReturnStmt(SourceLocation ReturnLoc,Expr * Result)1223   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1224     return getSema().BuildReturnStmt(ReturnLoc, Result);
1225   }
1226 
1227   /// \brief Build a new declaration statement.
1228   ///
1229   /// By default, performs semantic analysis to build the new statement.
1230   /// Subclasses may override this routine to provide different behavior.
RebuildDeclStmt(MutableArrayRef<Decl * > Decls,SourceLocation StartLoc,SourceLocation EndLoc)1231   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1232                              SourceLocation StartLoc, SourceLocation EndLoc) {
1233     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1234     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1235   }
1236 
1237   /// \brief Build a new inline asm statement.
1238   ///
1239   /// By default, performs semantic analysis to build the new statement.
1240   /// 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,SourceLocation RParenLoc)1241   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1242                                bool IsVolatile, unsigned NumOutputs,
1243                                unsigned NumInputs, IdentifierInfo **Names,
1244                                MultiExprArg Constraints, MultiExprArg Exprs,
1245                                Expr *AsmString, MultiExprArg Clobbers,
1246                                SourceLocation RParenLoc) {
1247     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1248                                      NumInputs, Names, Constraints, Exprs,
1249                                      AsmString, Clobbers, RParenLoc);
1250   }
1251 
1252   /// \brief Build a new MS style inline asm statement.
1253   ///
1254   /// By default, performs semantic analysis to build the new statement.
1255   /// 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)1256   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1257                               ArrayRef<Token> AsmToks,
1258                               StringRef AsmString,
1259                               unsigned NumOutputs, unsigned NumInputs,
1260                               ArrayRef<StringRef> Constraints,
1261                               ArrayRef<StringRef> Clobbers,
1262                               ArrayRef<Expr*> Exprs,
1263                               SourceLocation EndLoc) {
1264     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1265                                     NumOutputs, NumInputs,
1266                                     Constraints, Clobbers, Exprs, EndLoc);
1267   }
1268 
1269   /// \brief Build a new Objective-C \@try statement.
1270   ///
1271   /// By default, performs semantic analysis to build the new statement.
1272   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtTryStmt(SourceLocation AtLoc,Stmt * TryBody,MultiStmtArg CatchStmts,Stmt * Finally)1273   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1274                                         Stmt *TryBody,
1275                                         MultiStmtArg CatchStmts,
1276                                         Stmt *Finally) {
1277     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1278                                         Finally);
1279   }
1280 
1281   /// \brief Rebuild an Objective-C exception declaration.
1282   ///
1283   /// By default, performs semantic analysis to build the new declaration.
1284   /// Subclasses may override this routine to provide different behavior.
RebuildObjCExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * TInfo,QualType T)1285   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1286                                     TypeSourceInfo *TInfo, QualType T) {
1287     return getSema().BuildObjCExceptionDecl(TInfo, T,
1288                                             ExceptionDecl->getInnerLocStart(),
1289                                             ExceptionDecl->getLocation(),
1290                                             ExceptionDecl->getIdentifier());
1291   }
1292 
1293   /// \brief Build a new Objective-C \@catch statement.
1294   ///
1295   /// By default, performs semantic analysis to build the new statement.
1296   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtCatchStmt(SourceLocation AtLoc,SourceLocation RParenLoc,VarDecl * Var,Stmt * Body)1297   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1298                                           SourceLocation RParenLoc,
1299                                           VarDecl *Var,
1300                                           Stmt *Body) {
1301     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1302                                           Var, Body);
1303   }
1304 
1305   /// \brief Build a new Objective-C \@finally statement.
1306   ///
1307   /// By default, performs semantic analysis to build the new statement.
1308   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtFinallyStmt(SourceLocation AtLoc,Stmt * Body)1309   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1310                                             Stmt *Body) {
1311     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1312   }
1313 
1314   /// \brief Build a new Objective-C \@throw statement.
1315   ///
1316   /// By default, performs semantic analysis to build the new statement.
1317   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtThrowStmt(SourceLocation AtLoc,Expr * Operand)1318   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1319                                           Expr *Operand) {
1320     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1321   }
1322 
1323   /// \brief Build a new OpenMP executable directive.
1324   ///
1325   /// By default, performs semantic analysis to build the new statement.
1326   /// Subclasses may override this routine to provide different behavior.
RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,DeclarationNameInfo DirName,ArrayRef<OMPClause * > Clauses,Stmt * AStmt,SourceLocation StartLoc,SourceLocation EndLoc)1327   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1328                                            DeclarationNameInfo DirName,
1329                                            ArrayRef<OMPClause *> Clauses,
1330                                            Stmt *AStmt, SourceLocation StartLoc,
1331                                            SourceLocation EndLoc) {
1332     return getSema().ActOnOpenMPExecutableDirective(Kind, DirName, Clauses,
1333                                                     AStmt, StartLoc, EndLoc);
1334   }
1335 
1336   /// \brief Build a new OpenMP 'if' clause.
1337   ///
1338   /// By default, performs semantic analysis to build the new OpenMP clause.
1339   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIfClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1340   OMPClause *RebuildOMPIfClause(Expr *Condition,
1341                                 SourceLocation StartLoc,
1342                                 SourceLocation LParenLoc,
1343                                 SourceLocation EndLoc) {
1344     return getSema().ActOnOpenMPIfClause(Condition, StartLoc,
1345                                          LParenLoc, EndLoc);
1346   }
1347 
1348   /// \brief Build a new OpenMP 'final' clause.
1349   ///
1350   /// By default, performs semantic analysis to build the new OpenMP clause.
1351   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFinalClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1352   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1353                                    SourceLocation LParenLoc,
1354                                    SourceLocation EndLoc) {
1355     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1356                                             EndLoc);
1357   }
1358 
1359   /// \brief Build a new OpenMP 'num_threads' clause.
1360   ///
1361   /// By default, performs semantic analysis to build the new OpenMP clause.
1362   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumThreadsClause(Expr * NumThreads,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1363   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1364                                         SourceLocation StartLoc,
1365                                         SourceLocation LParenLoc,
1366                                         SourceLocation EndLoc) {
1367     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1368                                                  LParenLoc, EndLoc);
1369   }
1370 
1371   /// \brief Build a new OpenMP 'safelen' clause.
1372   ///
1373   /// By default, performs semantic analysis to build the new OpenMP clause.
1374   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSafelenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1375   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1376                                      SourceLocation LParenLoc,
1377                                      SourceLocation EndLoc) {
1378     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1379   }
1380 
1381   /// \brief Build a new OpenMP 'collapse' clause.
1382   ///
1383   /// By default, performs semantic analysis to build the new OpenMP clause.
1384   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCollapseClause(Expr * Num,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1385   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1386                                       SourceLocation LParenLoc,
1387                                       SourceLocation EndLoc) {
1388     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1389                                                EndLoc);
1390   }
1391 
1392   /// \brief Build a new OpenMP 'default' clause.
1393   ///
1394   /// By default, performs semantic analysis to build the new OpenMP clause.
1395   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1396   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1397                                      SourceLocation KindKwLoc,
1398                                      SourceLocation StartLoc,
1399                                      SourceLocation LParenLoc,
1400                                      SourceLocation EndLoc) {
1401     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1402                                               StartLoc, LParenLoc, EndLoc);
1403   }
1404 
1405   /// \brief Build a new OpenMP 'proc_bind' clause.
1406   ///
1407   /// By default, performs semantic analysis to build the new OpenMP clause.
1408   /// Subclasses may override this routine to provide different behavior.
RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1409   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1410                                       SourceLocation KindKwLoc,
1411                                       SourceLocation StartLoc,
1412                                       SourceLocation LParenLoc,
1413                                       SourceLocation EndLoc) {
1414     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1415                                                StartLoc, LParenLoc, EndLoc);
1416   }
1417 
1418   /// \brief Build a new OpenMP 'schedule' clause.
1419   ///
1420   /// By default, performs semantic analysis to build the new OpenMP clause.
1421   /// Subclasses may override this routine to provide different behavior.
RebuildOMPScheduleClause(OpenMPScheduleClauseKind Kind,Expr * ChunkSize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation KindLoc,SourceLocation CommaLoc,SourceLocation EndLoc)1422   OMPClause *RebuildOMPScheduleClause(OpenMPScheduleClauseKind Kind,
1423                                       Expr *ChunkSize,
1424                                       SourceLocation StartLoc,
1425                                       SourceLocation LParenLoc,
1426                                       SourceLocation KindLoc,
1427                                       SourceLocation CommaLoc,
1428                                       SourceLocation EndLoc) {
1429     return getSema().ActOnOpenMPScheduleClause(
1430         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1431   }
1432 
1433   /// \brief Build a new OpenMP 'private' clause.
1434   ///
1435   /// By default, performs semantic analysis to build the new OpenMP clause.
1436   /// Subclasses may override this routine to provide different behavior.
RebuildOMPPrivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1437   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1438                                      SourceLocation StartLoc,
1439                                      SourceLocation LParenLoc,
1440                                      SourceLocation EndLoc) {
1441     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1442                                               EndLoc);
1443   }
1444 
1445   /// \brief Build a new OpenMP 'firstprivate' clause.
1446   ///
1447   /// By default, performs semantic analysis to build the new OpenMP clause.
1448   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFirstprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1449   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1450                                           SourceLocation StartLoc,
1451                                           SourceLocation LParenLoc,
1452                                           SourceLocation EndLoc) {
1453     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1454                                                    EndLoc);
1455   }
1456 
1457   /// \brief Build a new OpenMP 'lastprivate' clause.
1458   ///
1459   /// By default, performs semantic analysis to build the new OpenMP clause.
1460   /// Subclasses may override this routine to provide different behavior.
RebuildOMPLastprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1461   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1462                                          SourceLocation StartLoc,
1463                                          SourceLocation LParenLoc,
1464                                          SourceLocation EndLoc) {
1465     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1466                                                   EndLoc);
1467   }
1468 
1469   /// \brief Build a new OpenMP 'shared' clause.
1470   ///
1471   /// By default, performs semantic analysis to build the new OpenMP clause.
1472   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSharedClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1473   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1474                                     SourceLocation StartLoc,
1475                                     SourceLocation LParenLoc,
1476                                     SourceLocation EndLoc) {
1477     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1478                                              EndLoc);
1479   }
1480 
1481   /// \brief Build a new OpenMP 'reduction' clause.
1482   ///
1483   /// By default, performs semantic analysis to build the new statement.
1484   /// Subclasses may override this routine to provide different behavior.
RebuildOMPReductionClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,CXXScopeSpec & ReductionIdScopeSpec,const DeclarationNameInfo & ReductionId)1485   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1486                                        SourceLocation StartLoc,
1487                                        SourceLocation LParenLoc,
1488                                        SourceLocation ColonLoc,
1489                                        SourceLocation EndLoc,
1490                                        CXXScopeSpec &ReductionIdScopeSpec,
1491                                        const DeclarationNameInfo &ReductionId) {
1492     return getSema().ActOnOpenMPReductionClause(
1493         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1494         ReductionId);
1495   }
1496 
1497   /// \brief Build a new OpenMP 'linear' clause.
1498   ///
1499   /// By default, performs semantic analysis to build the new OpenMP clause.
1500   /// Subclasses may override this routine to provide different behavior.
RebuildOMPLinearClause(ArrayRef<Expr * > VarList,Expr * Step,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1501   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1502                                     SourceLocation StartLoc,
1503                                     SourceLocation LParenLoc,
1504                                     SourceLocation ColonLoc,
1505                                     SourceLocation EndLoc) {
1506     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1507                                              ColonLoc, EndLoc);
1508   }
1509 
1510   /// \brief Build a new OpenMP 'aligned' clause.
1511   ///
1512   /// By default, performs semantic analysis to build the new OpenMP clause.
1513   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAlignedClause(ArrayRef<Expr * > VarList,Expr * Alignment,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1514   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1515                                      SourceLocation StartLoc,
1516                                      SourceLocation LParenLoc,
1517                                      SourceLocation ColonLoc,
1518                                      SourceLocation EndLoc) {
1519     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1520                                               LParenLoc, ColonLoc, EndLoc);
1521   }
1522 
1523   /// \brief Build a new OpenMP 'copyin' clause.
1524   ///
1525   /// By default, performs semantic analysis to build the new OpenMP clause.
1526   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyinClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1527   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1528                                     SourceLocation StartLoc,
1529                                     SourceLocation LParenLoc,
1530                                     SourceLocation EndLoc) {
1531     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1532                                              EndLoc);
1533   }
1534 
1535   /// \brief Build a new OpenMP 'copyprivate' clause.
1536   ///
1537   /// By default, performs semantic analysis to build the new OpenMP clause.
1538   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1539   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1540                                          SourceLocation StartLoc,
1541                                          SourceLocation LParenLoc,
1542                                          SourceLocation EndLoc) {
1543     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1544                                                   EndLoc);
1545   }
1546 
1547   /// \brief Build a new OpenMP 'flush' pseudo clause.
1548   ///
1549   /// By default, performs semantic analysis to build the new OpenMP clause.
1550   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFlushClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1551   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1552                                    SourceLocation StartLoc,
1553                                    SourceLocation LParenLoc,
1554                                    SourceLocation EndLoc) {
1555     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1556                                             EndLoc);
1557   }
1558 
1559   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1560   ///
1561   /// By default, performs semantic analysis to build the new statement.
1562   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,Expr * object)1563   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1564                                               Expr *object) {
1565     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1566   }
1567 
1568   /// \brief Build a new Objective-C \@synchronized statement.
1569   ///
1570   /// By default, performs semantic analysis to build the new statement.
1571   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,Expr * Object,Stmt * Body)1572   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1573                                            Expr *Object, Stmt *Body) {
1574     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1575   }
1576 
1577   /// \brief Build a new Objective-C \@autoreleasepool statement.
1578   ///
1579   /// By default, performs semantic analysis to build the new statement.
1580   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,Stmt * Body)1581   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1582                                             Stmt *Body) {
1583     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1584   }
1585 
1586   /// \brief Build a new Objective-C fast enumeration statement.
1587   ///
1588   /// By default, performs semantic analysis to build the new statement.
1589   /// Subclasses may override this routine to provide different behavior.
RebuildObjCForCollectionStmt(SourceLocation ForLoc,Stmt * Element,Expr * Collection,SourceLocation RParenLoc,Stmt * Body)1590   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1591                                           Stmt *Element,
1592                                           Expr *Collection,
1593                                           SourceLocation RParenLoc,
1594                                           Stmt *Body) {
1595     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1596                                                 Element,
1597                                                 Collection,
1598                                                 RParenLoc);
1599     if (ForEachStmt.isInvalid())
1600       return StmtError();
1601 
1602     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1603   }
1604 
1605   /// \brief Build a new C++ exception declaration.
1606   ///
1607   /// By default, performs semantic analysis to build the new decaration.
1608   /// Subclasses may override this routine to provide different behavior.
RebuildExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * Declarator,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id)1609   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1610                                 TypeSourceInfo *Declarator,
1611                                 SourceLocation StartLoc,
1612                                 SourceLocation IdLoc,
1613                                 IdentifierInfo *Id) {
1614     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1615                                                        StartLoc, IdLoc, Id);
1616     if (Var)
1617       getSema().CurContext->addDecl(Var);
1618     return Var;
1619   }
1620 
1621   /// \brief Build a new C++ catch statement.
1622   ///
1623   /// By default, performs semantic analysis to build the new statement.
1624   /// Subclasses may override this routine to provide different behavior.
RebuildCXXCatchStmt(SourceLocation CatchLoc,VarDecl * ExceptionDecl,Stmt * Handler)1625   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1626                                  VarDecl *ExceptionDecl,
1627                                  Stmt *Handler) {
1628     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1629                                                       Handler));
1630   }
1631 
1632   /// \brief Build a new C++ try statement.
1633   ///
1634   /// By default, performs semantic analysis to build the new statement.
1635   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTryStmt(SourceLocation TryLoc,Stmt * TryBlock,ArrayRef<Stmt * > Handlers)1636   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1637                                ArrayRef<Stmt *> Handlers) {
1638     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1639   }
1640 
1641   /// \brief Build a new C++0x range-based for statement.
1642   ///
1643   /// By default, performs semantic analysis to build the new statement.
1644   /// Subclasses may override this routine to provide different behavior.
RebuildCXXForRangeStmt(SourceLocation ForLoc,SourceLocation ColonLoc,Stmt * Range,Stmt * BeginEnd,Expr * Cond,Expr * Inc,Stmt * LoopVar,SourceLocation RParenLoc)1645   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1646                                     SourceLocation ColonLoc,
1647                                     Stmt *Range, Stmt *BeginEnd,
1648                                     Expr *Cond, Expr *Inc,
1649                                     Stmt *LoopVar,
1650                                     SourceLocation RParenLoc) {
1651     // If we've just learned that the range is actually an Objective-C
1652     // collection, treat this as an Objective-C fast enumeration loop.
1653     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1654       if (RangeStmt->isSingleDecl()) {
1655         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1656           if (RangeVar->isInvalidDecl())
1657             return StmtError();
1658 
1659           Expr *RangeExpr = RangeVar->getInit();
1660           if (!RangeExpr->isTypeDependent() &&
1661               RangeExpr->getType()->isObjCObjectPointerType())
1662             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1663                                                         RParenLoc);
1664         }
1665       }
1666     }
1667 
1668     return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd,
1669                                           Cond, Inc, LoopVar, RParenLoc,
1670                                           Sema::BFRK_Rebuild);
1671   }
1672 
1673   /// \brief Build a new C++0x range-based for statement.
1674   ///
1675   /// By default, performs semantic analysis to build the new statement.
1676   /// Subclasses may override this routine to provide different behavior.
RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,bool IsIfExists,NestedNameSpecifierLoc QualifierLoc,DeclarationNameInfo NameInfo,Stmt * Nested)1677   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
1678                                           bool IsIfExists,
1679                                           NestedNameSpecifierLoc QualifierLoc,
1680                                           DeclarationNameInfo NameInfo,
1681                                           Stmt *Nested) {
1682     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
1683                                                 QualifierLoc, NameInfo, Nested);
1684   }
1685 
1686   /// \brief Attach body to a C++0x range-based for statement.
1687   ///
1688   /// By default, performs semantic analysis to finish the new statement.
1689   /// Subclasses may override this routine to provide different behavior.
FinishCXXForRangeStmt(Stmt * ForRange,Stmt * Body)1690   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1691     return getSema().FinishCXXForRangeStmt(ForRange, Body);
1692   }
1693 
RebuildSEHTryStmt(bool IsCXXTry,SourceLocation TryLoc,Stmt * TryBlock,Stmt * Handler)1694   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
1695                                Stmt *TryBlock, Stmt *Handler) {
1696     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
1697   }
1698 
RebuildSEHExceptStmt(SourceLocation Loc,Expr * FilterExpr,Stmt * Block)1699   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
1700                                   Stmt *Block) {
1701     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
1702   }
1703 
RebuildSEHFinallyStmt(SourceLocation Loc,Stmt * Block)1704   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
1705     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
1706   }
1707 
1708   /// \brief Build a new predefined expression.
1709   ///
1710   /// By default, performs semantic analysis to build the new expression.
1711   /// Subclasses may override this routine to provide different behavior.
RebuildPredefinedExpr(SourceLocation Loc,PredefinedExpr::IdentType IT)1712   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
1713                                    PredefinedExpr::IdentType IT) {
1714     return getSema().BuildPredefinedExpr(Loc, IT);
1715   }
1716 
1717   /// \brief Build a new expression that references a declaration.
1718   ///
1719   /// By default, performs semantic analysis to build the new expression.
1720   /// Subclasses may override this routine to provide different behavior.
RebuildDeclarationNameExpr(const CXXScopeSpec & SS,LookupResult & R,bool RequiresADL)1721   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1722                                         LookupResult &R,
1723                                         bool RequiresADL) {
1724     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1725   }
1726 
1727 
1728   /// \brief Build a new expression that references a declaration.
1729   ///
1730   /// By default, performs semantic analysis to build the new expression.
1731   /// Subclasses may override this routine to provide different behavior.
RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,ValueDecl * VD,const DeclarationNameInfo & NameInfo,TemplateArgumentListInfo * TemplateArgs)1732   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1733                                 ValueDecl *VD,
1734                                 const DeclarationNameInfo &NameInfo,
1735                                 TemplateArgumentListInfo *TemplateArgs) {
1736     CXXScopeSpec SS;
1737     SS.Adopt(QualifierLoc);
1738 
1739     // FIXME: loses template args.
1740 
1741     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1742   }
1743 
1744   /// \brief Build a new expression in parentheses.
1745   ///
1746   /// By default, performs semantic analysis to build the new expression.
1747   /// Subclasses may override this routine to provide different behavior.
RebuildParenExpr(Expr * SubExpr,SourceLocation LParen,SourceLocation RParen)1748   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1749                                     SourceLocation RParen) {
1750     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1751   }
1752 
1753   /// \brief Build a new pseudo-destructor expression.
1754   ///
1755   /// By default, performs semantic analysis to build the new expression.
1756   /// Subclasses may override this routine to provide different behavior.
1757   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1758                                             SourceLocation OperatorLoc,
1759                                             bool isArrow,
1760                                             CXXScopeSpec &SS,
1761                                             TypeSourceInfo *ScopeType,
1762                                             SourceLocation CCLoc,
1763                                             SourceLocation TildeLoc,
1764                                         PseudoDestructorTypeStorage Destroyed);
1765 
1766   /// \brief Build a new unary operator expression.
1767   ///
1768   /// By default, performs semantic analysis to build the new expression.
1769   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryOperator(SourceLocation OpLoc,UnaryOperatorKind Opc,Expr * SubExpr)1770   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1771                                         UnaryOperatorKind Opc,
1772                                         Expr *SubExpr) {
1773     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
1774   }
1775 
1776   /// \brief Build a new builtin offsetof expression.
1777   ///
1778   /// By default, performs semantic analysis to build the new expression.
1779   /// Subclasses may override this routine to provide different behavior.
RebuildOffsetOfExpr(SourceLocation OperatorLoc,TypeSourceInfo * Type,Sema::OffsetOfComponent * Components,unsigned NumComponents,SourceLocation RParenLoc)1780   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
1781                                        TypeSourceInfo *Type,
1782                                        Sema::OffsetOfComponent *Components,
1783                                        unsigned NumComponents,
1784                                        SourceLocation RParenLoc) {
1785     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
1786                                           NumComponents, RParenLoc);
1787   }
1788 
1789   /// \brief Build a new sizeof, alignof or vec_step expression with a
1790   /// type argument.
1791   ///
1792   /// By default, performs semantic analysis to build the new expression.
1793   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(TypeSourceInfo * TInfo,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)1794   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
1795                                          SourceLocation OpLoc,
1796                                          UnaryExprOrTypeTrait ExprKind,
1797                                          SourceRange R) {
1798     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
1799   }
1800 
1801   /// \brief Build a new sizeof, alignof or vec step expression with an
1802   /// expression argument.
1803   ///
1804   /// By default, performs semantic analysis to build the new expression.
1805   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(Expr * SubExpr,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)1806   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
1807                                          UnaryExprOrTypeTrait ExprKind,
1808                                          SourceRange R) {
1809     ExprResult Result
1810       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
1811     if (Result.isInvalid())
1812       return ExprError();
1813 
1814     return Result;
1815   }
1816 
1817   /// \brief Build a new array subscript expression.
1818   ///
1819   /// By default, performs semantic analysis to build the new expression.
1820   /// Subclasses may override this routine to provide different behavior.
RebuildArraySubscriptExpr(Expr * LHS,SourceLocation LBracketLoc,Expr * RHS,SourceLocation RBracketLoc)1821   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1822                                              SourceLocation LBracketLoc,
1823                                              Expr *RHS,
1824                                              SourceLocation RBracketLoc) {
1825     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
1826                                              LBracketLoc, RHS,
1827                                              RBracketLoc);
1828   }
1829 
1830   /// \brief Build a new call expression.
1831   ///
1832   /// By default, performs semantic analysis to build the new expression.
1833   /// Subclasses may override this routine to provide different behavior.
1834   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1835                                    MultiExprArg Args,
1836                                    SourceLocation RParenLoc,
1837                                    Expr *ExecConfig = nullptr) {
1838     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
1839                                    Args, RParenLoc, ExecConfig);
1840   }
1841 
1842   /// \brief Build a new member access expression.
1843   ///
1844   /// By default, performs semantic analysis to build the new expression.
1845   /// 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)1846   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
1847                                bool isArrow,
1848                                NestedNameSpecifierLoc QualifierLoc,
1849                                SourceLocation TemplateKWLoc,
1850                                const DeclarationNameInfo &MemberNameInfo,
1851                                ValueDecl *Member,
1852                                NamedDecl *FoundDecl,
1853                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
1854                                NamedDecl *FirstQualifierInScope) {
1855     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
1856                                                                       isArrow);
1857     if (!Member->getDeclName()) {
1858       // We have a reference to an unnamed field.  This is always the
1859       // base of an anonymous struct/union member access, i.e. the
1860       // field is always of record type.
1861       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
1862       assert(Member->getType()->isRecordType() &&
1863              "unnamed member not of record type?");
1864 
1865       BaseResult =
1866         getSema().PerformObjectMemberConversion(BaseResult.get(),
1867                                                 QualifierLoc.getNestedNameSpecifier(),
1868                                                 FoundDecl, Member);
1869       if (BaseResult.isInvalid())
1870         return ExprError();
1871       Base = BaseResult.get();
1872       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
1873       MemberExpr *ME = new (getSema().Context)
1874           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
1875                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
1876       return ME;
1877     }
1878 
1879     CXXScopeSpec SS;
1880     SS.Adopt(QualifierLoc);
1881 
1882     Base = BaseResult.get();
1883     QualType BaseType = Base->getType();
1884 
1885     // FIXME: this involves duplicating earlier analysis in a lot of
1886     // cases; we should avoid this when possible.
1887     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
1888     R.addDecl(FoundDecl);
1889     R.resolveKind();
1890 
1891     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1892                                               SS, TemplateKWLoc,
1893                                               FirstQualifierInScope,
1894                                               R, ExplicitTemplateArgs);
1895   }
1896 
1897   /// \brief Build a new binary operator expression.
1898   ///
1899   /// By default, performs semantic analysis to build the new expression.
1900   /// Subclasses may override this routine to provide different behavior.
RebuildBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opc,Expr * LHS,Expr * RHS)1901   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1902                                          BinaryOperatorKind Opc,
1903                                          Expr *LHS, Expr *RHS) {
1904     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
1905   }
1906 
1907   /// \brief Build a new conditional operator expression.
1908   ///
1909   /// By default, performs semantic analysis to build the new expression.
1910   /// Subclasses may override this routine to provide different behavior.
RebuildConditionalOperator(Expr * Cond,SourceLocation QuestionLoc,Expr * LHS,SourceLocation ColonLoc,Expr * RHS)1911   ExprResult RebuildConditionalOperator(Expr *Cond,
1912                                         SourceLocation QuestionLoc,
1913                                         Expr *LHS,
1914                                         SourceLocation ColonLoc,
1915                                         Expr *RHS) {
1916     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
1917                                         LHS, RHS);
1918   }
1919 
1920   /// \brief Build a new C-style cast expression.
1921   ///
1922   /// By default, performs semantic analysis to build the new expression.
1923   /// Subclasses may override this routine to provide different behavior.
RebuildCStyleCastExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * SubExpr)1924   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
1925                                          TypeSourceInfo *TInfo,
1926                                          SourceLocation RParenLoc,
1927                                          Expr *SubExpr) {
1928     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1929                                          SubExpr);
1930   }
1931 
1932   /// \brief Build a new compound literal expression.
1933   ///
1934   /// By default, performs semantic analysis to build the new expression.
1935   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundLiteralExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * Init)1936   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1937                                               TypeSourceInfo *TInfo,
1938                                               SourceLocation RParenLoc,
1939                                               Expr *Init) {
1940     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
1941                                               Init);
1942   }
1943 
1944   /// \brief Build a new extended vector element access expression.
1945   ///
1946   /// By default, performs semantic analysis to build the new expression.
1947   /// Subclasses may override this routine to provide different behavior.
RebuildExtVectorElementExpr(Expr * Base,SourceLocation OpLoc,SourceLocation AccessorLoc,IdentifierInfo & Accessor)1948   ExprResult RebuildExtVectorElementExpr(Expr *Base,
1949                                                SourceLocation OpLoc,
1950                                                SourceLocation AccessorLoc,
1951                                                IdentifierInfo &Accessor) {
1952 
1953     CXXScopeSpec SS;
1954     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
1955     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1956                                               OpLoc, /*IsArrow*/ false,
1957                                               SS, SourceLocation(),
1958                                               /*FirstQualifierInScope*/ nullptr,
1959                                               NameInfo,
1960                                               /* TemplateArgs */ nullptr);
1961   }
1962 
1963   /// \brief Build a new initializer list expression.
1964   ///
1965   /// By default, performs semantic analysis to build the new expression.
1966   /// Subclasses may override this routine to provide different behavior.
RebuildInitList(SourceLocation LBraceLoc,MultiExprArg Inits,SourceLocation RBraceLoc,QualType ResultTy)1967   ExprResult RebuildInitList(SourceLocation LBraceLoc,
1968                              MultiExprArg Inits,
1969                              SourceLocation RBraceLoc,
1970                              QualType ResultTy) {
1971     ExprResult Result
1972       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
1973     if (Result.isInvalid() || ResultTy->isDependentType())
1974       return Result;
1975 
1976     // Patch in the result type we were given, which may have been computed
1977     // when the initial InitListExpr was built.
1978     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1979     ILE->setType(ResultTy);
1980     return Result;
1981   }
1982 
1983   /// \brief Build a new designated initializer expression.
1984   ///
1985   /// By default, performs semantic analysis to build the new expression.
1986   /// Subclasses may override this routine to provide different behavior.
RebuildDesignatedInitExpr(Designation & Desig,MultiExprArg ArrayExprs,SourceLocation EqualOrColonLoc,bool GNUSyntax,Expr * Init)1987   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1988                                              MultiExprArg ArrayExprs,
1989                                              SourceLocation EqualOrColonLoc,
1990                                              bool GNUSyntax,
1991                                              Expr *Init) {
1992     ExprResult Result
1993       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1994                                            Init);
1995     if (Result.isInvalid())
1996       return ExprError();
1997 
1998     return Result;
1999   }
2000 
2001   /// \brief Build a new value-initialized expression.
2002   ///
2003   /// By default, builds the implicit value initialization without performing
2004   /// any semantic analysis. Subclasses may override this routine to provide
2005   /// different behavior.
RebuildImplicitValueInitExpr(QualType T)2006   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2007     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2008   }
2009 
2010   /// \brief Build a new \c va_arg expression.
2011   ///
2012   /// By default, performs semantic analysis to build the new expression.
2013   /// Subclasses may override this routine to provide different behavior.
RebuildVAArgExpr(SourceLocation BuiltinLoc,Expr * SubExpr,TypeSourceInfo * TInfo,SourceLocation RParenLoc)2014   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2015                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2016                                     SourceLocation RParenLoc) {
2017     return getSema().BuildVAArgExpr(BuiltinLoc,
2018                                     SubExpr, TInfo,
2019                                     RParenLoc);
2020   }
2021 
2022   /// \brief Build a new expression list in parentheses.
2023   ///
2024   /// By default, performs semantic analysis to build the new expression.
2025   /// Subclasses may override this routine to provide different behavior.
RebuildParenListExpr(SourceLocation LParenLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2026   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2027                                   MultiExprArg SubExprs,
2028                                   SourceLocation RParenLoc) {
2029     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2030   }
2031 
2032   /// \brief Build a new address-of-label expression.
2033   ///
2034   /// By default, performs semantic analysis, using the name of the label
2035   /// rather than attempting to map the label statement itself.
2036   /// Subclasses may override this routine to provide different behavior.
RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,SourceLocation LabelLoc,LabelDecl * Label)2037   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2038                                   SourceLocation LabelLoc, LabelDecl *Label) {
2039     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2040   }
2041 
2042   /// \brief Build a new GNU statement expression.
2043   ///
2044   /// By default, performs semantic analysis to build the new expression.
2045   /// Subclasses may override this routine to provide different behavior.
RebuildStmtExpr(SourceLocation LParenLoc,Stmt * SubStmt,SourceLocation RParenLoc)2046   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2047                                    Stmt *SubStmt,
2048                                    SourceLocation RParenLoc) {
2049     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2050   }
2051 
2052   /// \brief Build a new __builtin_choose_expr expression.
2053   ///
2054   /// By default, performs semantic analysis to build the new expression.
2055   /// Subclasses may override this routine to provide different behavior.
RebuildChooseExpr(SourceLocation BuiltinLoc,Expr * Cond,Expr * LHS,Expr * RHS,SourceLocation RParenLoc)2056   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2057                                      Expr *Cond, Expr *LHS, Expr *RHS,
2058                                      SourceLocation RParenLoc) {
2059     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2060                                    Cond, LHS, RHS,
2061                                    RParenLoc);
2062   }
2063 
2064   /// \brief Build a new generic selection expression.
2065   ///
2066   /// By default, performs semantic analysis to build the new expression.
2067   /// Subclasses may override this routine to provide different behavior.
RebuildGenericSelectionExpr(SourceLocation KeyLoc,SourceLocation DefaultLoc,SourceLocation RParenLoc,Expr * ControllingExpr,ArrayRef<TypeSourceInfo * > Types,ArrayRef<Expr * > Exprs)2068   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2069                                          SourceLocation DefaultLoc,
2070                                          SourceLocation RParenLoc,
2071                                          Expr *ControllingExpr,
2072                                          ArrayRef<TypeSourceInfo *> Types,
2073                                          ArrayRef<Expr *> Exprs) {
2074     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2075                                                 ControllingExpr, Types, Exprs);
2076   }
2077 
2078   /// \brief Build a new overloaded operator call expression.
2079   ///
2080   /// By default, performs semantic analysis to build the new expression.
2081   /// The semantic analysis provides the behavior of template instantiation,
2082   /// copying with transformations that turn what looks like an overloaded
2083   /// operator call into a use of a builtin operator, performing
2084   /// argument-dependent lookup, etc. Subclasses may override this routine to
2085   /// provide different behavior.
2086   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2087                                               SourceLocation OpLoc,
2088                                               Expr *Callee,
2089                                               Expr *First,
2090                                               Expr *Second);
2091 
2092   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2093   /// reinterpret_cast.
2094   ///
2095   /// By default, this routine dispatches to one of the more-specific routines
2096   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2097   /// 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)2098   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2099                                            Stmt::StmtClass Class,
2100                                            SourceLocation LAngleLoc,
2101                                            TypeSourceInfo *TInfo,
2102                                            SourceLocation RAngleLoc,
2103                                            SourceLocation LParenLoc,
2104                                            Expr *SubExpr,
2105                                            SourceLocation RParenLoc) {
2106     switch (Class) {
2107     case Stmt::CXXStaticCastExprClass:
2108       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2109                                                    RAngleLoc, LParenLoc,
2110                                                    SubExpr, RParenLoc);
2111 
2112     case Stmt::CXXDynamicCastExprClass:
2113       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2114                                                     RAngleLoc, LParenLoc,
2115                                                     SubExpr, RParenLoc);
2116 
2117     case Stmt::CXXReinterpretCastExprClass:
2118       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2119                                                         RAngleLoc, LParenLoc,
2120                                                         SubExpr,
2121                                                         RParenLoc);
2122 
2123     case Stmt::CXXConstCastExprClass:
2124       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2125                                                    RAngleLoc, LParenLoc,
2126                                                    SubExpr, RParenLoc);
2127 
2128     default:
2129       llvm_unreachable("Invalid C++ named cast");
2130     }
2131   }
2132 
2133   /// \brief Build a new C++ static_cast expression.
2134   ///
2135   /// By default, performs semantic analysis to build the new expression.
2136   /// Subclasses may override this routine to provide different behavior.
RebuildCXXStaticCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2137   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2138                                             SourceLocation LAngleLoc,
2139                                             TypeSourceInfo *TInfo,
2140                                             SourceLocation RAngleLoc,
2141                                             SourceLocation LParenLoc,
2142                                             Expr *SubExpr,
2143                                             SourceLocation RParenLoc) {
2144     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2145                                        TInfo, SubExpr,
2146                                        SourceRange(LAngleLoc, RAngleLoc),
2147                                        SourceRange(LParenLoc, RParenLoc));
2148   }
2149 
2150   /// \brief Build a new C++ dynamic_cast expression.
2151   ///
2152   /// By default, performs semantic analysis to build the new expression.
2153   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDynamicCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2154   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2155                                              SourceLocation LAngleLoc,
2156                                              TypeSourceInfo *TInfo,
2157                                              SourceLocation RAngleLoc,
2158                                              SourceLocation LParenLoc,
2159                                              Expr *SubExpr,
2160                                              SourceLocation RParenLoc) {
2161     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2162                                        TInfo, SubExpr,
2163                                        SourceRange(LAngleLoc, RAngleLoc),
2164                                        SourceRange(LParenLoc, RParenLoc));
2165   }
2166 
2167   /// \brief Build a new C++ reinterpret_cast expression.
2168   ///
2169   /// By default, performs semantic analysis to build the new expression.
2170   /// Subclasses may override this routine to provide different behavior.
RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2171   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2172                                                  SourceLocation LAngleLoc,
2173                                                  TypeSourceInfo *TInfo,
2174                                                  SourceLocation RAngleLoc,
2175                                                  SourceLocation LParenLoc,
2176                                                  Expr *SubExpr,
2177                                                  SourceLocation RParenLoc) {
2178     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2179                                        TInfo, SubExpr,
2180                                        SourceRange(LAngleLoc, RAngleLoc),
2181                                        SourceRange(LParenLoc, RParenLoc));
2182   }
2183 
2184   /// \brief Build a new C++ const_cast expression.
2185   ///
2186   /// By default, performs semantic analysis to build the new expression.
2187   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2188   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2189                                            SourceLocation LAngleLoc,
2190                                            TypeSourceInfo *TInfo,
2191                                            SourceLocation RAngleLoc,
2192                                            SourceLocation LParenLoc,
2193                                            Expr *SubExpr,
2194                                            SourceLocation RParenLoc) {
2195     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2196                                        TInfo, SubExpr,
2197                                        SourceRange(LAngleLoc, RAngleLoc),
2198                                        SourceRange(LParenLoc, RParenLoc));
2199   }
2200 
2201   /// \brief Build a new C++ functional-style cast expression.
2202   ///
2203   /// By default, performs semantic analysis to build the new expression.
2204   /// Subclasses may override this routine to provide different behavior.
RebuildCXXFunctionalCastExpr(TypeSourceInfo * TInfo,SourceLocation LParenLoc,Expr * Sub,SourceLocation RParenLoc)2205   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2206                                           SourceLocation LParenLoc,
2207                                           Expr *Sub,
2208                                           SourceLocation RParenLoc) {
2209     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2210                                                MultiExprArg(&Sub, 1),
2211                                                RParenLoc);
2212   }
2213 
2214   /// \brief Build a new C++ typeid(type) expression.
2215   ///
2216   /// By default, performs semantic analysis to build the new expression.
2217   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)2218   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2219                                         SourceLocation TypeidLoc,
2220                                         TypeSourceInfo *Operand,
2221                                         SourceLocation RParenLoc) {
2222     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2223                                     RParenLoc);
2224   }
2225 
2226 
2227   /// \brief Build a new C++ typeid(expr) expression.
2228   ///
2229   /// By default, performs semantic analysis to build the new expression.
2230   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)2231   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2232                                         SourceLocation TypeidLoc,
2233                                         Expr *Operand,
2234                                         SourceLocation RParenLoc) {
2235     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2236                                     RParenLoc);
2237   }
2238 
2239   /// \brief Build a new C++ __uuidof(type) expression.
2240   ///
2241   /// By default, performs semantic analysis to build the new expression.
2242   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)2243   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2244                                         SourceLocation TypeidLoc,
2245                                         TypeSourceInfo *Operand,
2246                                         SourceLocation RParenLoc) {
2247     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2248                                     RParenLoc);
2249   }
2250 
2251   /// \brief Build a new C++ __uuidof(expr) expression.
2252   ///
2253   /// By default, performs semantic analysis to build the new expression.
2254   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)2255   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2256                                         SourceLocation TypeidLoc,
2257                                         Expr *Operand,
2258                                         SourceLocation RParenLoc) {
2259     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2260                                     RParenLoc);
2261   }
2262 
2263   /// \brief Build a new C++ "this" expression.
2264   ///
2265   /// By default, builds a new "this" expression without performing any
2266   /// semantic analysis. Subclasses may override this routine to provide
2267   /// different behavior.
RebuildCXXThisExpr(SourceLocation ThisLoc,QualType ThisType,bool isImplicit)2268   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2269                                 QualType ThisType,
2270                                 bool isImplicit) {
2271     getSema().CheckCXXThisCapture(ThisLoc);
2272     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2273   }
2274 
2275   /// \brief Build a new C++ throw expression.
2276   ///
2277   /// By default, performs semantic analysis to build the new expression.
2278   /// Subclasses may override this routine to provide different behavior.
RebuildCXXThrowExpr(SourceLocation ThrowLoc,Expr * Sub,bool IsThrownVariableInScope)2279   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2280                                  bool IsThrownVariableInScope) {
2281     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2282   }
2283 
2284   /// \brief Build a new C++ default-argument expression.
2285   ///
2286   /// By default, builds a new default-argument expression, which does not
2287   /// require any semantic analysis. Subclasses may override this routine to
2288   /// provide different behavior.
RebuildCXXDefaultArgExpr(SourceLocation Loc,ParmVarDecl * Param)2289   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2290                                             ParmVarDecl *Param) {
2291     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2292   }
2293 
2294   /// \brief Build a new C++11 default-initialization expression.
2295   ///
2296   /// By default, builds a new default field initialization expression, which
2297   /// does not require any semantic analysis. Subclasses may override this
2298   /// routine to provide different behavior.
RebuildCXXDefaultInitExpr(SourceLocation Loc,FieldDecl * Field)2299   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2300                                        FieldDecl *Field) {
2301     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2302   }
2303 
2304   /// \brief Build a new C++ zero-initialization expression.
2305   ///
2306   /// By default, performs semantic analysis to build the new expression.
2307   /// Subclasses may override this routine to provide different behavior.
RebuildCXXScalarValueInitExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,SourceLocation RParenLoc)2308   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2309                                            SourceLocation LParenLoc,
2310                                            SourceLocation RParenLoc) {
2311     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2312                                                None, RParenLoc);
2313   }
2314 
2315   /// \brief Build a new C++ "new" expression.
2316   ///
2317   /// By default, performs semantic analysis to build the new expression.
2318   /// 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,Expr * ArraySize,SourceRange DirectInitRange,Expr * Initializer)2319   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2320                                bool UseGlobal,
2321                                SourceLocation PlacementLParen,
2322                                MultiExprArg PlacementArgs,
2323                                SourceLocation PlacementRParen,
2324                                SourceRange TypeIdParens,
2325                                QualType AllocatedType,
2326                                TypeSourceInfo *AllocatedTypeInfo,
2327                                Expr *ArraySize,
2328                                SourceRange DirectInitRange,
2329                                Expr *Initializer) {
2330     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2331                                  PlacementLParen,
2332                                  PlacementArgs,
2333                                  PlacementRParen,
2334                                  TypeIdParens,
2335                                  AllocatedType,
2336                                  AllocatedTypeInfo,
2337                                  ArraySize,
2338                                  DirectInitRange,
2339                                  Initializer);
2340   }
2341 
2342   /// \brief Build a new C++ "delete" expression.
2343   ///
2344   /// By default, performs semantic analysis to build the new expression.
2345   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDeleteExpr(SourceLocation StartLoc,bool IsGlobalDelete,bool IsArrayForm,Expr * Operand)2346   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2347                                         bool IsGlobalDelete,
2348                                         bool IsArrayForm,
2349                                         Expr *Operand) {
2350     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2351                                     Operand);
2352   }
2353 
2354   /// \brief Build a new type trait expression.
2355   ///
2356   /// By default, performs semantic analysis to build the new expression.
2357   /// Subclasses may override this routine to provide different behavior.
RebuildTypeTrait(TypeTrait Trait,SourceLocation StartLoc,ArrayRef<TypeSourceInfo * > Args,SourceLocation RParenLoc)2358   ExprResult RebuildTypeTrait(TypeTrait Trait,
2359                               SourceLocation StartLoc,
2360                               ArrayRef<TypeSourceInfo *> Args,
2361                               SourceLocation RParenLoc) {
2362     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2363   }
2364 
2365   /// \brief Build a new array type trait expression.
2366   ///
2367   /// By default, performs semantic analysis to build the new expression.
2368   /// Subclasses may override this routine to provide different behavior.
RebuildArrayTypeTrait(ArrayTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * TSInfo,Expr * DimExpr,SourceLocation RParenLoc)2369   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2370                                    SourceLocation StartLoc,
2371                                    TypeSourceInfo *TSInfo,
2372                                    Expr *DimExpr,
2373                                    SourceLocation RParenLoc) {
2374     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2375   }
2376 
2377   /// \brief Build a new expression trait expression.
2378   ///
2379   /// By default, performs semantic analysis to build the new expression.
2380   /// Subclasses may override this routine to provide different behavior.
RebuildExpressionTrait(ExpressionTrait Trait,SourceLocation StartLoc,Expr * Queried,SourceLocation RParenLoc)2381   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2382                                    SourceLocation StartLoc,
2383                                    Expr *Queried,
2384                                    SourceLocation RParenLoc) {
2385     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2386   }
2387 
2388   /// \brief Build a new (previously unresolved) declaration reference
2389   /// expression.
2390   ///
2391   /// By default, performs semantic analysis to build the new expression.
2392   /// Subclasses may override this routine to provide different behavior.
RebuildDependentScopeDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * TemplateArgs,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)2393   ExprResult RebuildDependentScopeDeclRefExpr(
2394                                           NestedNameSpecifierLoc QualifierLoc,
2395                                           SourceLocation TemplateKWLoc,
2396                                        const DeclarationNameInfo &NameInfo,
2397                               const TemplateArgumentListInfo *TemplateArgs,
2398                                           bool IsAddressOfOperand,
2399                                           TypeSourceInfo **RecoveryTSI) {
2400     CXXScopeSpec SS;
2401     SS.Adopt(QualifierLoc);
2402 
2403     if (TemplateArgs || TemplateKWLoc.isValid())
2404       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2405                                                     TemplateArgs);
2406 
2407     return getSema().BuildQualifiedDeclarationNameExpr(
2408         SS, NameInfo, IsAddressOfOperand, RecoveryTSI);
2409   }
2410 
2411   /// \brief Build a new template-id expression.
2412   ///
2413   /// By default, performs semantic analysis to build the new expression.
2414   /// Subclasses may override this routine to provide different behavior.
RebuildTemplateIdExpr(const CXXScopeSpec & SS,SourceLocation TemplateKWLoc,LookupResult & R,bool RequiresADL,const TemplateArgumentListInfo * TemplateArgs)2415   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2416                                    SourceLocation TemplateKWLoc,
2417                                    LookupResult &R,
2418                                    bool RequiresADL,
2419                               const TemplateArgumentListInfo *TemplateArgs) {
2420     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2421                                          TemplateArgs);
2422   }
2423 
2424   /// \brief Build a new object-construction expression.
2425   ///
2426   /// By default, performs semantic analysis to build the new expression.
2427   /// 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)2428   ExprResult RebuildCXXConstructExpr(QualType T,
2429                                      SourceLocation Loc,
2430                                      CXXConstructorDecl *Constructor,
2431                                      bool IsElidable,
2432                                      MultiExprArg Args,
2433                                      bool HadMultipleCandidates,
2434                                      bool ListInitialization,
2435                                      bool StdInitListInitialization,
2436                                      bool RequiresZeroInit,
2437                              CXXConstructExpr::ConstructionKind ConstructKind,
2438                                      SourceRange ParenRange) {
2439     SmallVector<Expr*, 8> ConvertedArgs;
2440     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2441                                           ConvertedArgs))
2442       return ExprError();
2443 
2444     return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
2445                                            ConvertedArgs,
2446                                            HadMultipleCandidates,
2447                                            ListInitialization,
2448                                            StdInitListInitialization,
2449                                            RequiresZeroInit, ConstructKind,
2450                                            ParenRange);
2451   }
2452 
2453   /// \brief Build a new object-construction expression.
2454   ///
2455   /// By default, performs semantic analysis to build the new expression.
2456   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTemporaryObjectExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2457   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2458                                            SourceLocation LParenLoc,
2459                                            MultiExprArg Args,
2460                                            SourceLocation RParenLoc) {
2461     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2462                                                LParenLoc,
2463                                                Args,
2464                                                RParenLoc);
2465   }
2466 
2467   /// \brief Build a new object-construction expression.
2468   ///
2469   /// By default, performs semantic analysis to build the new expression.
2470   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUnresolvedConstructExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2471   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2472                                                SourceLocation LParenLoc,
2473                                                MultiExprArg Args,
2474                                                SourceLocation RParenLoc) {
2475     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2476                                                LParenLoc,
2477                                                Args,
2478                                                RParenLoc);
2479   }
2480 
2481   /// \brief Build a new member reference expression.
2482   ///
2483   /// By default, performs semantic analysis to build the new expression.
2484   /// 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)2485   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2486                                                 QualType BaseType,
2487                                                 bool IsArrow,
2488                                                 SourceLocation OperatorLoc,
2489                                           NestedNameSpecifierLoc QualifierLoc,
2490                                                 SourceLocation TemplateKWLoc,
2491                                             NamedDecl *FirstQualifierInScope,
2492                                    const DeclarationNameInfo &MemberNameInfo,
2493                               const TemplateArgumentListInfo *TemplateArgs) {
2494     CXXScopeSpec SS;
2495     SS.Adopt(QualifierLoc);
2496 
2497     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2498                                             OperatorLoc, IsArrow,
2499                                             SS, TemplateKWLoc,
2500                                             FirstQualifierInScope,
2501                                             MemberNameInfo,
2502                                             TemplateArgs);
2503   }
2504 
2505   /// \brief Build a new member reference expression.
2506   ///
2507   /// By default, performs semantic analysis to build the new expression.
2508   /// 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)2509   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2510                                          SourceLocation OperatorLoc,
2511                                          bool IsArrow,
2512                                          NestedNameSpecifierLoc QualifierLoc,
2513                                          SourceLocation TemplateKWLoc,
2514                                          NamedDecl *FirstQualifierInScope,
2515                                          LookupResult &R,
2516                                 const TemplateArgumentListInfo *TemplateArgs) {
2517     CXXScopeSpec SS;
2518     SS.Adopt(QualifierLoc);
2519 
2520     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2521                                             OperatorLoc, IsArrow,
2522                                             SS, TemplateKWLoc,
2523                                             FirstQualifierInScope,
2524                                             R, TemplateArgs);
2525   }
2526 
2527   /// \brief Build a new noexcept expression.
2528   ///
2529   /// By default, performs semantic analysis to build the new expression.
2530   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNoexceptExpr(SourceRange Range,Expr * Arg)2531   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2532     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2533   }
2534 
2535   /// \brief Build a new expression to compute the length of a parameter pack.
RebuildSizeOfPackExpr(SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,Optional<unsigned> Length)2536   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
2537                                    SourceLocation PackLoc,
2538                                    SourceLocation RParenLoc,
2539                                    Optional<unsigned> Length) {
2540     if (Length)
2541       return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2542                                                   OperatorLoc, Pack, PackLoc,
2543                                                   RParenLoc, *Length);
2544 
2545     return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2546                                                 OperatorLoc, Pack, PackLoc,
2547                                                 RParenLoc);
2548   }
2549 
2550   /// \brief Build a new Objective-C boxed expression.
2551   ///
2552   /// By default, performs semantic analysis to build the new expression.
2553   /// Subclasses may override this routine to provide different behavior.
RebuildObjCBoxedExpr(SourceRange SR,Expr * ValueExpr)2554   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2555     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2556   }
2557 
2558   /// \brief Build a new Objective-C array literal.
2559   ///
2560   /// By default, performs semantic analysis to build the new expression.
2561   /// Subclasses may override this routine to provide different behavior.
RebuildObjCArrayLiteral(SourceRange Range,Expr ** Elements,unsigned NumElements)2562   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2563                                      Expr **Elements, unsigned NumElements) {
2564     return getSema().BuildObjCArrayLiteral(Range,
2565                                            MultiExprArg(Elements, NumElements));
2566   }
2567 
RebuildObjCSubscriptRefExpr(SourceLocation RB,Expr * Base,Expr * Key,ObjCMethodDecl * getterMethod,ObjCMethodDecl * setterMethod)2568   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2569                                          Expr *Base, Expr *Key,
2570                                          ObjCMethodDecl *getterMethod,
2571                                          ObjCMethodDecl *setterMethod) {
2572     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2573                                                    getterMethod, setterMethod);
2574   }
2575 
2576   /// \brief Build a new Objective-C dictionary literal.
2577   ///
2578   /// By default, performs semantic analysis to build the new expression.
2579   /// Subclasses may override this routine to provide different behavior.
RebuildObjCDictionaryLiteral(SourceRange Range,ObjCDictionaryElement * Elements,unsigned NumElements)2580   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2581                                           ObjCDictionaryElement *Elements,
2582                                           unsigned NumElements) {
2583     return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements);
2584   }
2585 
2586   /// \brief Build a new Objective-C \@encode expression.
2587   ///
2588   /// By default, performs semantic analysis to build the new expression.
2589   /// Subclasses may override this routine to provide different behavior.
RebuildObjCEncodeExpr(SourceLocation AtLoc,TypeSourceInfo * EncodeTypeInfo,SourceLocation RParenLoc)2590   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2591                                          TypeSourceInfo *EncodeTypeInfo,
2592                                          SourceLocation RParenLoc) {
2593     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2594   }
2595 
2596   /// \brief Build a new Objective-C class message.
RebuildObjCMessageExpr(TypeSourceInfo * ReceiverTypeInfo,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2597   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2598                                           Selector Sel,
2599                                           ArrayRef<SourceLocation> SelectorLocs,
2600                                           ObjCMethodDecl *Method,
2601                                           SourceLocation LBracLoc,
2602                                           MultiExprArg Args,
2603                                           SourceLocation RBracLoc) {
2604     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2605                                      ReceiverTypeInfo->getType(),
2606                                      /*SuperLoc=*/SourceLocation(),
2607                                      Sel, Method, LBracLoc, SelectorLocs,
2608                                      RBracLoc, Args);
2609   }
2610 
2611   /// \brief Build a new Objective-C instance message.
RebuildObjCMessageExpr(Expr * Receiver,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2612   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2613                                           Selector Sel,
2614                                           ArrayRef<SourceLocation> SelectorLocs,
2615                                           ObjCMethodDecl *Method,
2616                                           SourceLocation LBracLoc,
2617                                           MultiExprArg Args,
2618                                           SourceLocation RBracLoc) {
2619     return SemaRef.BuildInstanceMessage(Receiver,
2620                                         Receiver->getType(),
2621                                         /*SuperLoc=*/SourceLocation(),
2622                                         Sel, Method, LBracLoc, SelectorLocs,
2623                                         RBracLoc, Args);
2624   }
2625 
2626   /// \brief Build a new Objective-C instance/class message to 'super'.
RebuildObjCMessageExpr(SourceLocation SuperLoc,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2627   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
2628                                     Selector Sel,
2629                                     ArrayRef<SourceLocation> SelectorLocs,
2630                                     ObjCMethodDecl *Method,
2631                                     SourceLocation LBracLoc,
2632                                     MultiExprArg Args,
2633                                     SourceLocation RBracLoc) {
2634     ObjCInterfaceDecl *Class = Method->getClassInterface();
2635     QualType ReceiverTy = SemaRef.Context.getObjCInterfaceType(Class);
2636 
2637     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
2638                                           ReceiverTy,
2639                                           SuperLoc,
2640                                           Sel, Method, LBracLoc, SelectorLocs,
2641                                           RBracLoc, Args)
2642                                       : SemaRef.BuildClassMessage(nullptr,
2643                                           ReceiverTy,
2644                                           SuperLoc,
2645                                           Sel, Method, LBracLoc, SelectorLocs,
2646                                           RBracLoc, Args);
2647 
2648 
2649   }
2650 
2651   /// \brief Build a new Objective-C ivar reference expression.
2652   ///
2653   /// By default, performs semantic analysis to build the new expression.
2654   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIvarRefExpr(Expr * BaseArg,ObjCIvarDecl * Ivar,SourceLocation IvarLoc,bool IsArrow,bool IsFreeIvar)2655   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2656                                           SourceLocation IvarLoc,
2657                                           bool IsArrow, bool IsFreeIvar) {
2658     // FIXME: We lose track of the IsFreeIvar bit.
2659     CXXScopeSpec SS;
2660     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
2661     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2662                                               /*FIXME:*/IvarLoc, IsArrow,
2663                                               SS, SourceLocation(),
2664                                               /*FirstQualifierInScope=*/nullptr,
2665                                               NameInfo,
2666                                               /*TemplateArgs=*/nullptr);
2667   }
2668 
2669   /// \brief Build a new Objective-C property reference expression.
2670   ///
2671   /// By default, performs semantic analysis to build the new expression.
2672   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * BaseArg,ObjCPropertyDecl * Property,SourceLocation PropertyLoc)2673   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2674                                         ObjCPropertyDecl *Property,
2675                                         SourceLocation PropertyLoc) {
2676     CXXScopeSpec SS;
2677     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
2678     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2679                                               /*FIXME:*/PropertyLoc,
2680                                               /*IsArrow=*/false,
2681                                               SS, SourceLocation(),
2682                                               /*FirstQualifierInScope=*/nullptr,
2683                                               NameInfo,
2684                                               /*TemplateArgs=*/nullptr);
2685   }
2686 
2687   /// \brief Build a new Objective-C property reference expression.
2688   ///
2689   /// By default, performs semantic analysis to build the new expression.
2690   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * Base,QualType T,ObjCMethodDecl * Getter,ObjCMethodDecl * Setter,SourceLocation PropertyLoc)2691   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2692                                         ObjCMethodDecl *Getter,
2693                                         ObjCMethodDecl *Setter,
2694                                         SourceLocation PropertyLoc) {
2695     // Since these expressions can only be value-dependent, we do not
2696     // need to perform semantic analysis again.
2697     return Owned(
2698       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2699                                                   VK_LValue, OK_ObjCProperty,
2700                                                   PropertyLoc, Base));
2701   }
2702 
2703   /// \brief Build a new Objective-C "isa" expression.
2704   ///
2705   /// By default, performs semantic analysis to build the new expression.
2706   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIsaExpr(Expr * BaseArg,SourceLocation IsaLoc,SourceLocation OpLoc,bool IsArrow)2707   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2708                                 SourceLocation OpLoc, bool IsArrow) {
2709     CXXScopeSpec SS;
2710     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
2711     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2712                                               OpLoc, IsArrow,
2713                                               SS, SourceLocation(),
2714                                               /*FirstQualifierInScope=*/nullptr,
2715                                               NameInfo,
2716                                               /*TemplateArgs=*/nullptr);
2717   }
2718 
2719   /// \brief Build a new shuffle vector expression.
2720   ///
2721   /// By default, performs semantic analysis to build the new expression.
2722   /// Subclasses may override this routine to provide different behavior.
RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2723   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2724                                       MultiExprArg SubExprs,
2725                                       SourceLocation RParenLoc) {
2726     // Find the declaration for __builtin_shufflevector
2727     const IdentifierInfo &Name
2728       = SemaRef.Context.Idents.get("__builtin_shufflevector");
2729     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
2730     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
2731     assert(!Lookup.empty() && "No __builtin_shufflevector?");
2732 
2733     // Build a reference to the __builtin_shufflevector builtin
2734     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
2735     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
2736                                                   SemaRef.Context.BuiltinFnTy,
2737                                                   VK_RValue, BuiltinLoc);
2738     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
2739     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
2740                                        CK_BuiltinFnToFnPtr).get();
2741 
2742     // Build the CallExpr
2743     ExprResult TheCall = new (SemaRef.Context) CallExpr(
2744         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
2745         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
2746 
2747     // Type-check the __builtin_shufflevector expression.
2748     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
2749   }
2750 
2751   /// \brief Build a new convert vector expression.
RebuildConvertVectorExpr(SourceLocation BuiltinLoc,Expr * SrcExpr,TypeSourceInfo * DstTInfo,SourceLocation RParenLoc)2752   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
2753                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
2754                                       SourceLocation RParenLoc) {
2755     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
2756                                          BuiltinLoc, RParenLoc);
2757   }
2758 
2759   /// \brief Build a new template argument pack expansion.
2760   ///
2761   /// By default, performs semantic analysis to build a new pack expansion
2762   /// for a template argument. Subclasses may override this routine to provide
2763   /// different behavior.
RebuildPackExpansion(TemplateArgumentLoc Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)2764   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
2765                                            SourceLocation EllipsisLoc,
2766                                            Optional<unsigned> NumExpansions) {
2767     switch (Pattern.getArgument().getKind()) {
2768     case TemplateArgument::Expression: {
2769       ExprResult Result
2770         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
2771                                        EllipsisLoc, NumExpansions);
2772       if (Result.isInvalid())
2773         return TemplateArgumentLoc();
2774 
2775       return TemplateArgumentLoc(Result.get(), Result.get());
2776     }
2777 
2778     case TemplateArgument::Template:
2779       return TemplateArgumentLoc(TemplateArgument(
2780                                           Pattern.getArgument().getAsTemplate(),
2781                                                   NumExpansions),
2782                                  Pattern.getTemplateQualifierLoc(),
2783                                  Pattern.getTemplateNameLoc(),
2784                                  EllipsisLoc);
2785 
2786     case TemplateArgument::Null:
2787     case TemplateArgument::Integral:
2788     case TemplateArgument::Declaration:
2789     case TemplateArgument::Pack:
2790     case TemplateArgument::TemplateExpansion:
2791     case TemplateArgument::NullPtr:
2792       llvm_unreachable("Pack expansion pattern has no parameter packs");
2793 
2794     case TemplateArgument::Type:
2795       if (TypeSourceInfo *Expansion
2796             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
2797                                            EllipsisLoc,
2798                                            NumExpansions))
2799         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
2800                                    Expansion);
2801       break;
2802     }
2803 
2804     return TemplateArgumentLoc();
2805   }
2806 
2807   /// \brief Build a new expression pack expansion.
2808   ///
2809   /// By default, performs semantic analysis to build a new pack expansion
2810   /// for an expression. Subclasses may override this routine to provide
2811   /// different behavior.
RebuildPackExpansion(Expr * Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)2812   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
2813                                   Optional<unsigned> NumExpansions) {
2814     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
2815   }
2816 
2817   /// \brief Build a new C++1z fold-expression.
2818   ///
2819   /// By default, performs semantic analysis in order to build a new fold
2820   /// expression.
RebuildCXXFoldExpr(SourceLocation LParenLoc,Expr * LHS,BinaryOperatorKind Operator,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation RParenLoc)2821   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
2822                                 BinaryOperatorKind Operator,
2823                                 SourceLocation EllipsisLoc, Expr *RHS,
2824                                 SourceLocation RParenLoc) {
2825     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
2826                                       RHS, RParenLoc);
2827   }
2828 
2829   /// \brief Build an empty C++1z fold-expression with the given operator.
2830   ///
2831   /// By default, produces the fallback value for the fold-expression, or
2832   /// produce an error if there is no fallback value.
RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,BinaryOperatorKind Operator)2833   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
2834                                      BinaryOperatorKind Operator) {
2835     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
2836   }
2837 
2838   /// \brief Build a new atomic operation expression.
2839   ///
2840   /// By default, performs semantic analysis to build the new expression.
2841   /// Subclasses may override this routine to provide different behavior.
RebuildAtomicExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,QualType RetTy,AtomicExpr::AtomicOp Op,SourceLocation RParenLoc)2842   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
2843                                MultiExprArg SubExprs,
2844                                QualType RetTy,
2845                                AtomicExpr::AtomicOp Op,
2846                                SourceLocation RParenLoc) {
2847     // Just create the expression; there is not any interesting semantic
2848     // analysis here because we can't actually build an AtomicExpr until
2849     // we are sure it is semantically sound.
2850     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
2851                                             RParenLoc);
2852   }
2853 
2854 private:
2855   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
2856                                      QualType ObjectType,
2857                                      NamedDecl *FirstQualifierInScope,
2858                                      CXXScopeSpec &SS);
2859 
2860   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
2861                                              QualType ObjectType,
2862                                              NamedDecl *FirstQualifierInScope,
2863                                              CXXScopeSpec &SS);
2864 
2865   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
2866                                             NamedDecl *FirstQualifierInScope,
2867                                             CXXScopeSpec &SS);
2868 };
2869 
2870 template<typename Derived>
TransformStmt(Stmt * S)2871 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
2872   if (!S)
2873     return S;
2874 
2875   switch (S->getStmtClass()) {
2876   case Stmt::NoStmtClass: break;
2877 
2878   // Transform individual statement nodes
2879 #define STMT(Node, Parent)                                              \
2880   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
2881 #define ABSTRACT_STMT(Node)
2882 #define EXPR(Node, Parent)
2883 #include "clang/AST/StmtNodes.inc"
2884 
2885   // Transform expressions by calling TransformExpr.
2886 #define STMT(Node, Parent)
2887 #define ABSTRACT_STMT(Stmt)
2888 #define EXPR(Node, Parent) case Stmt::Node##Class:
2889 #include "clang/AST/StmtNodes.inc"
2890     {
2891       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
2892       if (E.isInvalid())
2893         return StmtError();
2894 
2895       return getSema().ActOnExprStmt(E);
2896     }
2897   }
2898 
2899   return S;
2900 }
2901 
2902 template<typename Derived>
TransformOMPClause(OMPClause * S)2903 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
2904   if (!S)
2905     return S;
2906 
2907   switch (S->getClauseKind()) {
2908   default: break;
2909   // Transform individual clause nodes
2910 #define OPENMP_CLAUSE(Name, Class)                                             \
2911   case OMPC_ ## Name :                                                         \
2912     return getDerived().Transform ## Class(cast<Class>(S));
2913 #include "clang/Basic/OpenMPKinds.def"
2914   }
2915 
2916   return S;
2917 }
2918 
2919 
2920 template<typename Derived>
TransformExpr(Expr * E)2921 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2922   if (!E)
2923     return E;
2924 
2925   switch (E->getStmtClass()) {
2926     case Stmt::NoStmtClass: break;
2927 #define STMT(Node, Parent) case Stmt::Node##Class: break;
2928 #define ABSTRACT_STMT(Stmt)
2929 #define EXPR(Node, Parent)                                              \
2930     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
2931 #include "clang/AST/StmtNodes.inc"
2932   }
2933 
2934   return E;
2935 }
2936 
2937 template<typename Derived>
TransformInitializer(Expr * Init,bool NotCopyInit)2938 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
2939                                                         bool NotCopyInit) {
2940   // Initializers are instantiated like expressions, except that various outer
2941   // layers are stripped.
2942   if (!Init)
2943     return Init;
2944 
2945   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
2946     Init = ExprTemp->getSubExpr();
2947 
2948   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
2949     Init = MTE->GetTemporaryExpr();
2950 
2951   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
2952     Init = Binder->getSubExpr();
2953 
2954   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
2955     Init = ICE->getSubExprAsWritten();
2956 
2957   if (CXXStdInitializerListExpr *ILE =
2958           dyn_cast<CXXStdInitializerListExpr>(Init))
2959     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
2960 
2961   // If this is copy-initialization, we only need to reconstruct
2962   // InitListExprs. Other forms of copy-initialization will be a no-op if
2963   // the initializer is already the right type.
2964   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
2965   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
2966     return getDerived().TransformExpr(Init);
2967 
2968   // Revert value-initialization back to empty parens.
2969   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
2970     SourceRange Parens = VIE->getSourceRange();
2971     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
2972                                              Parens.getEnd());
2973   }
2974 
2975   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
2976   if (isa<ImplicitValueInitExpr>(Init))
2977     return getDerived().RebuildParenListExpr(SourceLocation(), None,
2978                                              SourceLocation());
2979 
2980   // Revert initialization by constructor back to a parenthesized or braced list
2981   // of expressions. Any other form of initializer can just be reused directly.
2982   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
2983     return getDerived().TransformExpr(Init);
2984 
2985   // If the initialization implicitly converted an initializer list to a
2986   // std::initializer_list object, unwrap the std::initializer_list too.
2987   if (Construct && Construct->isStdInitListInitialization())
2988     return TransformInitializer(Construct->getArg(0), NotCopyInit);
2989 
2990   SmallVector<Expr*, 8> NewArgs;
2991   bool ArgChanged = false;
2992   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
2993                                   /*IsCall*/true, NewArgs, &ArgChanged))
2994     return ExprError();
2995 
2996   // If this was list initialization, revert to list form.
2997   if (Construct->isListInitialization())
2998     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
2999                                         Construct->getLocEnd(),
3000                                         Construct->getType());
3001 
3002   // Build a ParenListExpr to represent anything else.
3003   SourceRange Parens = Construct->getParenOrBraceRange();
3004   if (Parens.isInvalid()) {
3005     // This was a variable declaration's initialization for which no initializer
3006     // was specified.
3007     assert(NewArgs.empty() &&
3008            "no parens or braces but have direct init with arguments?");
3009     return ExprEmpty();
3010   }
3011   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3012                                            Parens.getEnd());
3013 }
3014 
3015 template<typename Derived>
TransformExprs(Expr ** Inputs,unsigned NumInputs,bool IsCall,SmallVectorImpl<Expr * > & Outputs,bool * ArgChanged)3016 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
3017                                             unsigned NumInputs,
3018                                             bool IsCall,
3019                                       SmallVectorImpl<Expr *> &Outputs,
3020                                             bool *ArgChanged) {
3021   for (unsigned I = 0; I != NumInputs; ++I) {
3022     // If requested, drop call arguments that need to be dropped.
3023     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3024       if (ArgChanged)
3025         *ArgChanged = true;
3026 
3027       break;
3028     }
3029 
3030     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3031       Expr *Pattern = Expansion->getPattern();
3032 
3033       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3034       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3035       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3036 
3037       // Determine whether the set of unexpanded parameter packs can and should
3038       // be expanded.
3039       bool Expand = true;
3040       bool RetainExpansion = false;
3041       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3042       Optional<unsigned> NumExpansions = OrigNumExpansions;
3043       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3044                                                Pattern->getSourceRange(),
3045                                                Unexpanded,
3046                                                Expand, RetainExpansion,
3047                                                NumExpansions))
3048         return true;
3049 
3050       if (!Expand) {
3051         // The transform has determined that we should perform a simple
3052         // transformation on the pack expansion, producing another pack
3053         // expansion.
3054         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3055         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3056         if (OutPattern.isInvalid())
3057           return true;
3058 
3059         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3060                                                 Expansion->getEllipsisLoc(),
3061                                                            NumExpansions);
3062         if (Out.isInvalid())
3063           return true;
3064 
3065         if (ArgChanged)
3066           *ArgChanged = true;
3067         Outputs.push_back(Out.get());
3068         continue;
3069       }
3070 
3071       // Record right away that the argument was changed.  This needs
3072       // to happen even if the array expands to nothing.
3073       if (ArgChanged) *ArgChanged = true;
3074 
3075       // The transform has determined that we should perform an elementwise
3076       // expansion of the pattern. Do so.
3077       for (unsigned I = 0; I != *NumExpansions; ++I) {
3078         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3079         ExprResult Out = getDerived().TransformExpr(Pattern);
3080         if (Out.isInvalid())
3081           return true;
3082 
3083         // FIXME: Can this happen? We should not try to expand the pack
3084         // in this case.
3085         if (Out.get()->containsUnexpandedParameterPack()) {
3086           Out = getDerived().RebuildPackExpansion(
3087               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3088           if (Out.isInvalid())
3089             return true;
3090         }
3091 
3092         Outputs.push_back(Out.get());
3093       }
3094 
3095       // If we're supposed to retain a pack expansion, do so by temporarily
3096       // forgetting the partially-substituted parameter pack.
3097       if (RetainExpansion) {
3098         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3099 
3100         ExprResult Out = getDerived().TransformExpr(Pattern);
3101         if (Out.isInvalid())
3102           return true;
3103 
3104         Out = getDerived().RebuildPackExpansion(
3105             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3106         if (Out.isInvalid())
3107           return true;
3108 
3109         Outputs.push_back(Out.get());
3110       }
3111 
3112       continue;
3113     }
3114 
3115     ExprResult Result =
3116       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3117              : getDerived().TransformExpr(Inputs[I]);
3118     if (Result.isInvalid())
3119       return true;
3120 
3121     if (Result.get() != Inputs[I] && ArgChanged)
3122       *ArgChanged = true;
3123 
3124     Outputs.push_back(Result.get());
3125   }
3126 
3127   return false;
3128 }
3129 
3130 template<typename Derived>
3131 NestedNameSpecifierLoc
TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,QualType ObjectType,NamedDecl * FirstQualifierInScope)3132 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3133                                                     NestedNameSpecifierLoc NNS,
3134                                                      QualType ObjectType,
3135                                              NamedDecl *FirstQualifierInScope) {
3136   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3137   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3138        Qualifier = Qualifier.getPrefix())
3139     Qualifiers.push_back(Qualifier);
3140 
3141   CXXScopeSpec SS;
3142   while (!Qualifiers.empty()) {
3143     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3144     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3145 
3146     switch (QNNS->getKind()) {
3147     case NestedNameSpecifier::Identifier:
3148       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr,
3149                                               *QNNS->getAsIdentifier(),
3150                                               Q.getLocalBeginLoc(),
3151                                               Q.getLocalEndLoc(),
3152                                               ObjectType, false, SS,
3153                                               FirstQualifierInScope, false))
3154         return NestedNameSpecifierLoc();
3155 
3156       break;
3157 
3158     case NestedNameSpecifier::Namespace: {
3159       NamespaceDecl *NS
3160         = cast_or_null<NamespaceDecl>(
3161                                     getDerived().TransformDecl(
3162                                                           Q.getLocalBeginLoc(),
3163                                                        QNNS->getAsNamespace()));
3164       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3165       break;
3166     }
3167 
3168     case NestedNameSpecifier::NamespaceAlias: {
3169       NamespaceAliasDecl *Alias
3170         = cast_or_null<NamespaceAliasDecl>(
3171                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3172                                                  QNNS->getAsNamespaceAlias()));
3173       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3174                 Q.getLocalEndLoc());
3175       break;
3176     }
3177 
3178     case NestedNameSpecifier::Global:
3179       // There is no meaningful transformation that one could perform on the
3180       // global scope.
3181       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3182       break;
3183 
3184     case NestedNameSpecifier::Super: {
3185       CXXRecordDecl *RD =
3186           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3187               SourceLocation(), QNNS->getAsRecordDecl()));
3188       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3189       break;
3190     }
3191 
3192     case NestedNameSpecifier::TypeSpecWithTemplate:
3193     case NestedNameSpecifier::TypeSpec: {
3194       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3195                                               FirstQualifierInScope, SS);
3196 
3197       if (!TL)
3198         return NestedNameSpecifierLoc();
3199 
3200       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3201           (SemaRef.getLangOpts().CPlusPlus11 &&
3202            TL.getType()->isEnumeralType())) {
3203         assert(!TL.getType().hasLocalQualifiers() &&
3204                "Can't get cv-qualifiers here");
3205         if (TL.getType()->isEnumeralType())
3206           SemaRef.Diag(TL.getBeginLoc(),
3207                        diag::warn_cxx98_compat_enum_nested_name_spec);
3208         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3209                   Q.getLocalEndLoc());
3210         break;
3211       }
3212       // If the nested-name-specifier is an invalid type def, don't emit an
3213       // error because a previous error should have already been emitted.
3214       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3215       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3216         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3217           << TL.getType() << SS.getRange();
3218       }
3219       return NestedNameSpecifierLoc();
3220     }
3221     }
3222 
3223     // The qualifier-in-scope and object type only apply to the leftmost entity.
3224     FirstQualifierInScope = nullptr;
3225     ObjectType = QualType();
3226   }
3227 
3228   // Don't rebuild the nested-name-specifier if we don't have to.
3229   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3230       !getDerived().AlwaysRebuild())
3231     return NNS;
3232 
3233   // If we can re-use the source-location data from the original
3234   // nested-name-specifier, do so.
3235   if (SS.location_size() == NNS.getDataLength() &&
3236       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3237     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3238 
3239   // Allocate new nested-name-specifier location information.
3240   return SS.getWithLocInContext(SemaRef.Context);
3241 }
3242 
3243 template<typename Derived>
3244 DeclarationNameInfo
3245 TreeTransform<Derived>
TransformDeclarationNameInfo(const DeclarationNameInfo & NameInfo)3246 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3247   DeclarationName Name = NameInfo.getName();
3248   if (!Name)
3249     return DeclarationNameInfo();
3250 
3251   switch (Name.getNameKind()) {
3252   case DeclarationName::Identifier:
3253   case DeclarationName::ObjCZeroArgSelector:
3254   case DeclarationName::ObjCOneArgSelector:
3255   case DeclarationName::ObjCMultiArgSelector:
3256   case DeclarationName::CXXOperatorName:
3257   case DeclarationName::CXXLiteralOperatorName:
3258   case DeclarationName::CXXUsingDirective:
3259     return NameInfo;
3260 
3261   case DeclarationName::CXXConstructorName:
3262   case DeclarationName::CXXDestructorName:
3263   case DeclarationName::CXXConversionFunctionName: {
3264     TypeSourceInfo *NewTInfo;
3265     CanQualType NewCanTy;
3266     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3267       NewTInfo = getDerived().TransformType(OldTInfo);
3268       if (!NewTInfo)
3269         return DeclarationNameInfo();
3270       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3271     }
3272     else {
3273       NewTInfo = nullptr;
3274       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3275       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3276       if (NewT.isNull())
3277         return DeclarationNameInfo();
3278       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3279     }
3280 
3281     DeclarationName NewName
3282       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3283                                                            NewCanTy);
3284     DeclarationNameInfo NewNameInfo(NameInfo);
3285     NewNameInfo.setName(NewName);
3286     NewNameInfo.setNamedTypeInfo(NewTInfo);
3287     return NewNameInfo;
3288   }
3289   }
3290 
3291   llvm_unreachable("Unknown name kind.");
3292 }
3293 
3294 template<typename Derived>
3295 TemplateName
TransformTemplateName(CXXScopeSpec & SS,TemplateName Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)3296 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3297                                               TemplateName Name,
3298                                               SourceLocation NameLoc,
3299                                               QualType ObjectType,
3300                                               NamedDecl *FirstQualifierInScope) {
3301   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3302     TemplateDecl *Template = QTN->getTemplateDecl();
3303     assert(Template && "qualified template name must refer to a template");
3304 
3305     TemplateDecl *TransTemplate
3306       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3307                                                               Template));
3308     if (!TransTemplate)
3309       return TemplateName();
3310 
3311     if (!getDerived().AlwaysRebuild() &&
3312         SS.getScopeRep() == QTN->getQualifier() &&
3313         TransTemplate == Template)
3314       return Name;
3315 
3316     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3317                                             TransTemplate);
3318   }
3319 
3320   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3321     if (SS.getScopeRep()) {
3322       // These apply to the scope specifier, not the template.
3323       ObjectType = QualType();
3324       FirstQualifierInScope = nullptr;
3325     }
3326 
3327     if (!getDerived().AlwaysRebuild() &&
3328         SS.getScopeRep() == DTN->getQualifier() &&
3329         ObjectType.isNull())
3330       return Name;
3331 
3332     if (DTN->isIdentifier()) {
3333       return getDerived().RebuildTemplateName(SS,
3334                                               *DTN->getIdentifier(),
3335                                               NameLoc,
3336                                               ObjectType,
3337                                               FirstQualifierInScope);
3338     }
3339 
3340     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3341                                             ObjectType);
3342   }
3343 
3344   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3345     TemplateDecl *TransTemplate
3346       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3347                                                               Template));
3348     if (!TransTemplate)
3349       return TemplateName();
3350 
3351     if (!getDerived().AlwaysRebuild() &&
3352         TransTemplate == Template)
3353       return Name;
3354 
3355     return TemplateName(TransTemplate);
3356   }
3357 
3358   if (SubstTemplateTemplateParmPackStorage *SubstPack
3359       = Name.getAsSubstTemplateTemplateParmPack()) {
3360     TemplateTemplateParmDecl *TransParam
3361     = cast_or_null<TemplateTemplateParmDecl>(
3362             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3363     if (!TransParam)
3364       return TemplateName();
3365 
3366     if (!getDerived().AlwaysRebuild() &&
3367         TransParam == SubstPack->getParameterPack())
3368       return Name;
3369 
3370     return getDerived().RebuildTemplateName(TransParam,
3371                                             SubstPack->getArgumentPack());
3372   }
3373 
3374   // These should be getting filtered out before they reach the AST.
3375   llvm_unreachable("overloaded function decl survived to here");
3376 }
3377 
3378 template<typename Derived>
InventTemplateArgumentLoc(const TemplateArgument & Arg,TemplateArgumentLoc & Output)3379 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3380                                          const TemplateArgument &Arg,
3381                                          TemplateArgumentLoc &Output) {
3382   SourceLocation Loc = getDerived().getBaseLocation();
3383   switch (Arg.getKind()) {
3384   case TemplateArgument::Null:
3385     llvm_unreachable("null template argument in TreeTransform");
3386     break;
3387 
3388   case TemplateArgument::Type:
3389     Output = TemplateArgumentLoc(Arg,
3390                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3391 
3392     break;
3393 
3394   case TemplateArgument::Template:
3395   case TemplateArgument::TemplateExpansion: {
3396     NestedNameSpecifierLocBuilder Builder;
3397     TemplateName Template = Arg.getAsTemplate();
3398     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3399       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3400     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3401       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3402 
3403     if (Arg.getKind() == TemplateArgument::Template)
3404       Output = TemplateArgumentLoc(Arg,
3405                                    Builder.getWithLocInContext(SemaRef.Context),
3406                                    Loc);
3407     else
3408       Output = TemplateArgumentLoc(Arg,
3409                                    Builder.getWithLocInContext(SemaRef.Context),
3410                                    Loc, Loc);
3411 
3412     break;
3413   }
3414 
3415   case TemplateArgument::Expression:
3416     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3417     break;
3418 
3419   case TemplateArgument::Declaration:
3420   case TemplateArgument::Integral:
3421   case TemplateArgument::Pack:
3422   case TemplateArgument::NullPtr:
3423     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3424     break;
3425   }
3426 }
3427 
3428 template<typename Derived>
TransformTemplateArgument(const TemplateArgumentLoc & Input,TemplateArgumentLoc & Output)3429 bool TreeTransform<Derived>::TransformTemplateArgument(
3430                                          const TemplateArgumentLoc &Input,
3431                                          TemplateArgumentLoc &Output) {
3432   const TemplateArgument &Arg = Input.getArgument();
3433   switch (Arg.getKind()) {
3434   case TemplateArgument::Null:
3435   case TemplateArgument::Integral:
3436   case TemplateArgument::Pack:
3437   case TemplateArgument::Declaration:
3438   case TemplateArgument::NullPtr:
3439     llvm_unreachable("Unexpected TemplateArgument");
3440 
3441   case TemplateArgument::Type: {
3442     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3443     if (!DI)
3444       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3445 
3446     DI = getDerived().TransformType(DI);
3447     if (!DI) return true;
3448 
3449     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3450     return false;
3451   }
3452 
3453   case TemplateArgument::Template: {
3454     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3455     if (QualifierLoc) {
3456       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3457       if (!QualifierLoc)
3458         return true;
3459     }
3460 
3461     CXXScopeSpec SS;
3462     SS.Adopt(QualifierLoc);
3463     TemplateName Template
3464       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3465                                            Input.getTemplateNameLoc());
3466     if (Template.isNull())
3467       return true;
3468 
3469     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3470                                  Input.getTemplateNameLoc());
3471     return false;
3472   }
3473 
3474   case TemplateArgument::TemplateExpansion:
3475     llvm_unreachable("Caller should expand pack expansions");
3476 
3477   case TemplateArgument::Expression: {
3478     // Template argument expressions are constant expressions.
3479     EnterExpressionEvaluationContext Unevaluated(getSema(),
3480                                                  Sema::ConstantEvaluated);
3481 
3482     Expr *InputExpr = Input.getSourceExpression();
3483     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3484 
3485     ExprResult E = getDerived().TransformExpr(InputExpr);
3486     E = SemaRef.ActOnConstantExpression(E);
3487     if (E.isInvalid()) return true;
3488     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3489     return false;
3490   }
3491   }
3492 
3493   // Work around bogus GCC warning
3494   return true;
3495 }
3496 
3497 /// \brief Iterator adaptor that invents template argument location information
3498 /// for each of the template arguments in its underlying iterator.
3499 template<typename Derived, typename InputIterator>
3500 class TemplateArgumentLocInventIterator {
3501   TreeTransform<Derived> &Self;
3502   InputIterator Iter;
3503 
3504 public:
3505   typedef TemplateArgumentLoc value_type;
3506   typedef TemplateArgumentLoc reference;
3507   typedef typename std::iterator_traits<InputIterator>::difference_type
3508     difference_type;
3509   typedef std::input_iterator_tag iterator_category;
3510 
3511   class pointer {
3512     TemplateArgumentLoc Arg;
3513 
3514   public:
pointer(TemplateArgumentLoc Arg)3515     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3516 
3517     const TemplateArgumentLoc *operator->() const { return &Arg; }
3518   };
3519 
TemplateArgumentLocInventIterator()3520   TemplateArgumentLocInventIterator() { }
3521 
TemplateArgumentLocInventIterator(TreeTransform<Derived> & Self,InputIterator Iter)3522   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3523                                              InputIterator Iter)
3524     : Self(Self), Iter(Iter) { }
3525 
3526   TemplateArgumentLocInventIterator &operator++() {
3527     ++Iter;
3528     return *this;
3529   }
3530 
3531   TemplateArgumentLocInventIterator operator++(int) {
3532     TemplateArgumentLocInventIterator Old(*this);
3533     ++(*this);
3534     return Old;
3535   }
3536 
3537   reference operator*() const {
3538     TemplateArgumentLoc Result;
3539     Self.InventTemplateArgumentLoc(*Iter, Result);
3540     return Result;
3541   }
3542 
3543   pointer operator->() const { return pointer(**this); }
3544 
3545   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3546                          const TemplateArgumentLocInventIterator &Y) {
3547     return X.Iter == Y.Iter;
3548   }
3549 
3550   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3551                          const TemplateArgumentLocInventIterator &Y) {
3552     return X.Iter != Y.Iter;
3553   }
3554 };
3555 
3556 template<typename Derived>
3557 template<typename InputIterator>
TransformTemplateArguments(InputIterator First,InputIterator Last,TemplateArgumentListInfo & Outputs)3558 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
3559                                                         InputIterator Last,
3560                                             TemplateArgumentListInfo &Outputs) {
3561   for (; First != Last; ++First) {
3562     TemplateArgumentLoc Out;
3563     TemplateArgumentLoc In = *First;
3564 
3565     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3566       // Unpack argument packs, which we translate them into separate
3567       // arguments.
3568       // FIXME: We could do much better if we could guarantee that the
3569       // TemplateArgumentLocInfo for the pack expansion would be usable for
3570       // all of the template arguments in the argument pack.
3571       typedef TemplateArgumentLocInventIterator<Derived,
3572                                                 TemplateArgument::pack_iterator>
3573         PackLocIterator;
3574       if (TransformTemplateArguments(PackLocIterator(*this,
3575                                                  In.getArgument().pack_begin()),
3576                                      PackLocIterator(*this,
3577                                                    In.getArgument().pack_end()),
3578                                      Outputs))
3579         return true;
3580 
3581       continue;
3582     }
3583 
3584     if (In.getArgument().isPackExpansion()) {
3585       // We have a pack expansion, for which we will be substituting into
3586       // the pattern.
3587       SourceLocation Ellipsis;
3588       Optional<unsigned> OrigNumExpansions;
3589       TemplateArgumentLoc Pattern
3590         = getSema().getTemplateArgumentPackExpansionPattern(
3591               In, Ellipsis, OrigNumExpansions);
3592 
3593       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3594       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3595       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3596 
3597       // Determine whether the set of unexpanded parameter packs can and should
3598       // be expanded.
3599       bool Expand = true;
3600       bool RetainExpansion = false;
3601       Optional<unsigned> NumExpansions = OrigNumExpansions;
3602       if (getDerived().TryExpandParameterPacks(Ellipsis,
3603                                                Pattern.getSourceRange(),
3604                                                Unexpanded,
3605                                                Expand,
3606                                                RetainExpansion,
3607                                                NumExpansions))
3608         return true;
3609 
3610       if (!Expand) {
3611         // The transform has determined that we should perform a simple
3612         // transformation on the pack expansion, producing another pack
3613         // expansion.
3614         TemplateArgumentLoc OutPattern;
3615         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3616         if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
3617           return true;
3618 
3619         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3620                                                 NumExpansions);
3621         if (Out.getArgument().isNull())
3622           return true;
3623 
3624         Outputs.addArgument(Out);
3625         continue;
3626       }
3627 
3628       // The transform has determined that we should perform an elementwise
3629       // expansion of the pattern. Do so.
3630       for (unsigned I = 0; I != *NumExpansions; ++I) {
3631         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3632 
3633         if (getDerived().TransformTemplateArgument(Pattern, Out))
3634           return true;
3635 
3636         if (Out.getArgument().containsUnexpandedParameterPack()) {
3637           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3638                                                   OrigNumExpansions);
3639           if (Out.getArgument().isNull())
3640             return true;
3641         }
3642 
3643         Outputs.addArgument(Out);
3644       }
3645 
3646       // If we're supposed to retain a pack expansion, do so by temporarily
3647       // forgetting the partially-substituted parameter pack.
3648       if (RetainExpansion) {
3649         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3650 
3651         if (getDerived().TransformTemplateArgument(Pattern, Out))
3652           return true;
3653 
3654         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3655                                                 OrigNumExpansions);
3656         if (Out.getArgument().isNull())
3657           return true;
3658 
3659         Outputs.addArgument(Out);
3660       }
3661 
3662       continue;
3663     }
3664 
3665     // The simple case:
3666     if (getDerived().TransformTemplateArgument(In, Out))
3667       return true;
3668 
3669     Outputs.addArgument(Out);
3670   }
3671 
3672   return false;
3673 
3674 }
3675 
3676 //===----------------------------------------------------------------------===//
3677 // Type transformation
3678 //===----------------------------------------------------------------------===//
3679 
3680 template<typename Derived>
TransformType(QualType T)3681 QualType TreeTransform<Derived>::TransformType(QualType T) {
3682   if (getDerived().AlreadyTransformed(T))
3683     return T;
3684 
3685   // Temporary workaround.  All of these transformations should
3686   // eventually turn into transformations on TypeLocs.
3687   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3688                                                 getDerived().getBaseLocation());
3689 
3690   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3691 
3692   if (!NewDI)
3693     return QualType();
3694 
3695   return NewDI->getType();
3696 }
3697 
3698 template<typename Derived>
TransformType(TypeSourceInfo * DI)3699 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3700   // Refine the base location to the type's location.
3701   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
3702                        getDerived().getBaseEntity());
3703   if (getDerived().AlreadyTransformed(DI->getType()))
3704     return DI;
3705 
3706   TypeLocBuilder TLB;
3707 
3708   TypeLoc TL = DI->getTypeLoc();
3709   TLB.reserve(TL.getFullDataSize());
3710 
3711   QualType Result = getDerived().TransformType(TLB, TL);
3712   if (Result.isNull())
3713     return nullptr;
3714 
3715   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3716 }
3717 
3718 template<typename Derived>
3719 QualType
TransformType(TypeLocBuilder & TLB,TypeLoc T)3720 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
3721   switch (T.getTypeLocClass()) {
3722 #define ABSTRACT_TYPELOC(CLASS, PARENT)
3723 #define TYPELOC(CLASS, PARENT)                                                 \
3724   case TypeLoc::CLASS:                                                         \
3725     return getDerived().Transform##CLASS##Type(TLB,                            \
3726                                                T.castAs<CLASS##TypeLoc>());
3727 #include "clang/AST/TypeLocNodes.def"
3728   }
3729 
3730   llvm_unreachable("unhandled type loc!");
3731 }
3732 
3733 /// FIXME: By default, this routine adds type qualifiers only to types
3734 /// that can have qualifiers, and silently suppresses those qualifiers
3735 /// that are not permitted (e.g., qualifiers on reference or function
3736 /// types). This is the right thing for template instantiation, but
3737 /// probably not for other clients.
3738 template<typename Derived>
3739 QualType
TransformQualifiedType(TypeLocBuilder & TLB,QualifiedTypeLoc T)3740 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
3741                                                QualifiedTypeLoc T) {
3742   Qualifiers Quals = T.getType().getLocalQualifiers();
3743 
3744   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
3745   if (Result.isNull())
3746     return QualType();
3747 
3748   // Silently suppress qualifiers if the result type can't be qualified.
3749   // FIXME: this is the right thing for template instantiation, but
3750   // probably not for other clients.
3751   if (Result->isFunctionType() || Result->isReferenceType())
3752     return Result;
3753 
3754   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
3755   // resulting type.
3756   if (Quals.hasObjCLifetime()) {
3757     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
3758       Quals.removeObjCLifetime();
3759     else if (Result.getObjCLifetime()) {
3760       // Objective-C ARC:
3761       //   A lifetime qualifier applied to a substituted template parameter
3762       //   overrides the lifetime qualifier from the template argument.
3763       const AutoType *AutoTy;
3764       if (const SubstTemplateTypeParmType *SubstTypeParam
3765                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
3766         QualType Replacement = SubstTypeParam->getReplacementType();
3767         Qualifiers Qs = Replacement.getQualifiers();
3768         Qs.removeObjCLifetime();
3769         Replacement
3770           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
3771                                              Qs);
3772         Result = SemaRef.Context.getSubstTemplateTypeParmType(
3773                                         SubstTypeParam->getReplacedParameter(),
3774                                                               Replacement);
3775         TLB.TypeWasModifiedSafely(Result);
3776       } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) {
3777         // 'auto' types behave the same way as template parameters.
3778         QualType Deduced = AutoTy->getDeducedType();
3779         Qualifiers Qs = Deduced.getQualifiers();
3780         Qs.removeObjCLifetime();
3781         Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(),
3782                                                    Qs);
3783         Result = SemaRef.Context.getAutoType(Deduced, AutoTy->isDecltypeAuto(),
3784                                 AutoTy->isDependentType());
3785         TLB.TypeWasModifiedSafely(Result);
3786       } else {
3787         // Otherwise, complain about the addition of a qualifier to an
3788         // already-qualified type.
3789         SourceRange R = T.getUnqualifiedLoc().getSourceRange();
3790         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
3791           << Result << R;
3792 
3793         Quals.removeObjCLifetime();
3794       }
3795     }
3796   }
3797   if (!Quals.empty()) {
3798     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
3799     // BuildQualifiedType might not add qualifiers if they are invalid.
3800     if (Result.hasLocalQualifiers())
3801       TLB.push<QualifiedTypeLoc>(Result);
3802     // No location information to preserve.
3803   }
3804 
3805   return Result;
3806 }
3807 
3808 template<typename Derived>
3809 TypeLoc
TransformTypeInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3810 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
3811                                                    QualType ObjectType,
3812                                                    NamedDecl *UnqualLookup,
3813                                                    CXXScopeSpec &SS) {
3814   if (getDerived().AlreadyTransformed(TL.getType()))
3815     return TL;
3816 
3817   TypeSourceInfo *TSI =
3818       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
3819   if (TSI)
3820     return TSI->getTypeLoc();
3821   return TypeLoc();
3822 }
3823 
3824 template<typename Derived>
3825 TypeSourceInfo *
TransformTypeInObjectScope(TypeSourceInfo * TSInfo,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3826 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3827                                                    QualType ObjectType,
3828                                                    NamedDecl *UnqualLookup,
3829                                                    CXXScopeSpec &SS) {
3830   if (getDerived().AlreadyTransformed(TSInfo->getType()))
3831     return TSInfo;
3832 
3833   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
3834                                    UnqualLookup, SS);
3835 }
3836 
3837 template <typename Derived>
TransformTSIInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3838 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
3839     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
3840     CXXScopeSpec &SS) {
3841   QualType T = TL.getType();
3842   assert(!getDerived().AlreadyTransformed(T));
3843 
3844   TypeLocBuilder TLB;
3845   QualType Result;
3846 
3847   if (isa<TemplateSpecializationType>(T)) {
3848     TemplateSpecializationTypeLoc SpecTL =
3849         TL.castAs<TemplateSpecializationTypeLoc>();
3850 
3851     TemplateName Template
3852     = getDerived().TransformTemplateName(SS,
3853                                          SpecTL.getTypePtr()->getTemplateName(),
3854                                          SpecTL.getTemplateNameLoc(),
3855                                          ObjectType, UnqualLookup);
3856     if (Template.isNull())
3857       return nullptr;
3858 
3859     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3860                                                               Template);
3861   } else if (isa<DependentTemplateSpecializationType>(T)) {
3862     DependentTemplateSpecializationTypeLoc SpecTL =
3863         TL.castAs<DependentTemplateSpecializationTypeLoc>();
3864 
3865     TemplateName Template
3866       = getDerived().RebuildTemplateName(SS,
3867                                          *SpecTL.getTypePtr()->getIdentifier(),
3868                                          SpecTL.getTemplateNameLoc(),
3869                                          ObjectType, UnqualLookup);
3870     if (Template.isNull())
3871       return nullptr;
3872 
3873     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3874                                                                        SpecTL,
3875                                                                        Template,
3876                                                                        SS);
3877   } else {
3878     // Nothing special needs to be done for these.
3879     Result = getDerived().TransformType(TLB, TL);
3880   }
3881 
3882   if (Result.isNull())
3883     return nullptr;
3884 
3885   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3886 }
3887 
3888 template <class TyLoc> static inline
TransformTypeSpecType(TypeLocBuilder & TLB,TyLoc T)3889 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
3890   TyLoc NewT = TLB.push<TyLoc>(T.getType());
3891   NewT.setNameLoc(T.getNameLoc());
3892   return T.getType();
3893 }
3894 
3895 template<typename Derived>
TransformBuiltinType(TypeLocBuilder & TLB,BuiltinTypeLoc T)3896 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
3897                                                       BuiltinTypeLoc T) {
3898   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
3899   NewT.setBuiltinLoc(T.getBuiltinLoc());
3900   if (T.needsExtraLocalData())
3901     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
3902   return T.getType();
3903 }
3904 
3905 template<typename Derived>
TransformComplexType(TypeLocBuilder & TLB,ComplexTypeLoc T)3906 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
3907                                                       ComplexTypeLoc T) {
3908   // FIXME: recurse?
3909   return TransformTypeSpecType(TLB, T);
3910 }
3911 
3912 template <typename Derived>
TransformAdjustedType(TypeLocBuilder & TLB,AdjustedTypeLoc TL)3913 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
3914                                                        AdjustedTypeLoc TL) {
3915   // Adjustments applied during transformation are handled elsewhere.
3916   return getDerived().TransformType(TLB, TL.getOriginalLoc());
3917 }
3918 
3919 template<typename Derived>
TransformDecayedType(TypeLocBuilder & TLB,DecayedTypeLoc TL)3920 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
3921                                                       DecayedTypeLoc TL) {
3922   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
3923   if (OriginalType.isNull())
3924     return QualType();
3925 
3926   QualType Result = TL.getType();
3927   if (getDerived().AlwaysRebuild() ||
3928       OriginalType != TL.getOriginalLoc().getType())
3929     Result = SemaRef.Context.getDecayedType(OriginalType);
3930   TLB.push<DecayedTypeLoc>(Result);
3931   // Nothing to set for DecayedTypeLoc.
3932   return Result;
3933 }
3934 
3935 template<typename Derived>
TransformPointerType(TypeLocBuilder & TLB,PointerTypeLoc TL)3936 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
3937                                                       PointerTypeLoc TL) {
3938   QualType PointeeType
3939     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3940   if (PointeeType.isNull())
3941     return QualType();
3942 
3943   QualType Result = TL.getType();
3944   if (PointeeType->getAs<ObjCObjectType>()) {
3945     // A dependent pointer type 'T *' has is being transformed such
3946     // that an Objective-C class type is being replaced for 'T'. The
3947     // resulting pointer type is an ObjCObjectPointerType, not a
3948     // PointerType.
3949     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
3950 
3951     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
3952     NewT.setStarLoc(TL.getStarLoc());
3953     return Result;
3954   }
3955 
3956   if (getDerived().AlwaysRebuild() ||
3957       PointeeType != TL.getPointeeLoc().getType()) {
3958     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
3959     if (Result.isNull())
3960       return QualType();
3961   }
3962 
3963   // Objective-C ARC can add lifetime qualifiers to the type that we're
3964   // pointing to.
3965   TLB.TypeWasModifiedSafely(Result->getPointeeType());
3966 
3967   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
3968   NewT.setSigilLoc(TL.getSigilLoc());
3969   return Result;
3970 }
3971 
3972 template<typename Derived>
3973 QualType
TransformBlockPointerType(TypeLocBuilder & TLB,BlockPointerTypeLoc TL)3974 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
3975                                                   BlockPointerTypeLoc TL) {
3976   QualType PointeeType
3977     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3978   if (PointeeType.isNull())
3979     return QualType();
3980 
3981   QualType Result = TL.getType();
3982   if (getDerived().AlwaysRebuild() ||
3983       PointeeType != TL.getPointeeLoc().getType()) {
3984     Result = getDerived().RebuildBlockPointerType(PointeeType,
3985                                                   TL.getSigilLoc());
3986     if (Result.isNull())
3987       return QualType();
3988   }
3989 
3990   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
3991   NewT.setSigilLoc(TL.getSigilLoc());
3992   return Result;
3993 }
3994 
3995 /// Transforms a reference type.  Note that somewhat paradoxically we
3996 /// don't care whether the type itself is an l-value type or an r-value
3997 /// type;  we only care if the type was *written* as an l-value type
3998 /// or an r-value type.
3999 template<typename Derived>
4000 QualType
TransformReferenceType(TypeLocBuilder & TLB,ReferenceTypeLoc TL)4001 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4002                                                ReferenceTypeLoc TL) {
4003   const ReferenceType *T = TL.getTypePtr();
4004 
4005   // Note that this works with the pointee-as-written.
4006   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4007   if (PointeeType.isNull())
4008     return QualType();
4009 
4010   QualType Result = TL.getType();
4011   if (getDerived().AlwaysRebuild() ||
4012       PointeeType != T->getPointeeTypeAsWritten()) {
4013     Result = getDerived().RebuildReferenceType(PointeeType,
4014                                                T->isSpelledAsLValue(),
4015                                                TL.getSigilLoc());
4016     if (Result.isNull())
4017       return QualType();
4018   }
4019 
4020   // Objective-C ARC can add lifetime qualifiers to the type that we're
4021   // referring to.
4022   TLB.TypeWasModifiedSafely(
4023                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4024 
4025   // r-value references can be rebuilt as l-value references.
4026   ReferenceTypeLoc NewTL;
4027   if (isa<LValueReferenceType>(Result))
4028     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4029   else
4030     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4031   NewTL.setSigilLoc(TL.getSigilLoc());
4032 
4033   return Result;
4034 }
4035 
4036 template<typename Derived>
4037 QualType
TransformLValueReferenceType(TypeLocBuilder & TLB,LValueReferenceTypeLoc TL)4038 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4039                                                  LValueReferenceTypeLoc TL) {
4040   return TransformReferenceType(TLB, TL);
4041 }
4042 
4043 template<typename Derived>
4044 QualType
TransformRValueReferenceType(TypeLocBuilder & TLB,RValueReferenceTypeLoc TL)4045 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4046                                                  RValueReferenceTypeLoc TL) {
4047   return TransformReferenceType(TLB, TL);
4048 }
4049 
4050 template<typename Derived>
4051 QualType
TransformMemberPointerType(TypeLocBuilder & TLB,MemberPointerTypeLoc TL)4052 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4053                                                    MemberPointerTypeLoc TL) {
4054   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4055   if (PointeeType.isNull())
4056     return QualType();
4057 
4058   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4059   TypeSourceInfo *NewClsTInfo = nullptr;
4060   if (OldClsTInfo) {
4061     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4062     if (!NewClsTInfo)
4063       return QualType();
4064   }
4065 
4066   const MemberPointerType *T = TL.getTypePtr();
4067   QualType OldClsType = QualType(T->getClass(), 0);
4068   QualType NewClsType;
4069   if (NewClsTInfo)
4070     NewClsType = NewClsTInfo->getType();
4071   else {
4072     NewClsType = getDerived().TransformType(OldClsType);
4073     if (NewClsType.isNull())
4074       return QualType();
4075   }
4076 
4077   QualType Result = TL.getType();
4078   if (getDerived().AlwaysRebuild() ||
4079       PointeeType != T->getPointeeType() ||
4080       NewClsType != OldClsType) {
4081     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4082                                                    TL.getStarLoc());
4083     if (Result.isNull())
4084       return QualType();
4085   }
4086 
4087   // If we had to adjust the pointee type when building a member pointer, make
4088   // sure to push TypeLoc info for it.
4089   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4090   if (MPT && PointeeType != MPT->getPointeeType()) {
4091     assert(isa<AdjustedType>(MPT->getPointeeType()));
4092     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4093   }
4094 
4095   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4096   NewTL.setSigilLoc(TL.getSigilLoc());
4097   NewTL.setClassTInfo(NewClsTInfo);
4098 
4099   return Result;
4100 }
4101 
4102 template<typename Derived>
4103 QualType
TransformConstantArrayType(TypeLocBuilder & TLB,ConstantArrayTypeLoc TL)4104 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4105                                                    ConstantArrayTypeLoc TL) {
4106   const ConstantArrayType *T = TL.getTypePtr();
4107   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4108   if (ElementType.isNull())
4109     return QualType();
4110 
4111   QualType Result = TL.getType();
4112   if (getDerived().AlwaysRebuild() ||
4113       ElementType != T->getElementType()) {
4114     Result = getDerived().RebuildConstantArrayType(ElementType,
4115                                                    T->getSizeModifier(),
4116                                                    T->getSize(),
4117                                              T->getIndexTypeCVRQualifiers(),
4118                                                    TL.getBracketsRange());
4119     if (Result.isNull())
4120       return QualType();
4121   }
4122 
4123   // We might have either a ConstantArrayType or a VariableArrayType now:
4124   // a ConstantArrayType is allowed to have an element type which is a
4125   // VariableArrayType if the type is dependent.  Fortunately, all array
4126   // types have the same location layout.
4127   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4128   NewTL.setLBracketLoc(TL.getLBracketLoc());
4129   NewTL.setRBracketLoc(TL.getRBracketLoc());
4130 
4131   Expr *Size = TL.getSizeExpr();
4132   if (Size) {
4133     EnterExpressionEvaluationContext Unevaluated(SemaRef,
4134                                                  Sema::ConstantEvaluated);
4135     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4136     Size = SemaRef.ActOnConstantExpression(Size).get();
4137   }
4138   NewTL.setSizeExpr(Size);
4139 
4140   return Result;
4141 }
4142 
4143 template<typename Derived>
TransformIncompleteArrayType(TypeLocBuilder & TLB,IncompleteArrayTypeLoc TL)4144 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4145                                               TypeLocBuilder &TLB,
4146                                               IncompleteArrayTypeLoc TL) {
4147   const IncompleteArrayType *T = TL.getTypePtr();
4148   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4149   if (ElementType.isNull())
4150     return QualType();
4151 
4152   QualType Result = TL.getType();
4153   if (getDerived().AlwaysRebuild() ||
4154       ElementType != T->getElementType()) {
4155     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4156                                                      T->getSizeModifier(),
4157                                            T->getIndexTypeCVRQualifiers(),
4158                                                      TL.getBracketsRange());
4159     if (Result.isNull())
4160       return QualType();
4161   }
4162 
4163   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4164   NewTL.setLBracketLoc(TL.getLBracketLoc());
4165   NewTL.setRBracketLoc(TL.getRBracketLoc());
4166   NewTL.setSizeExpr(nullptr);
4167 
4168   return Result;
4169 }
4170 
4171 template<typename Derived>
4172 QualType
TransformVariableArrayType(TypeLocBuilder & TLB,VariableArrayTypeLoc TL)4173 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4174                                                    VariableArrayTypeLoc TL) {
4175   const VariableArrayType *T = TL.getTypePtr();
4176   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4177   if (ElementType.isNull())
4178     return QualType();
4179 
4180   ExprResult SizeResult
4181     = getDerived().TransformExpr(T->getSizeExpr());
4182   if (SizeResult.isInvalid())
4183     return QualType();
4184 
4185   Expr *Size = SizeResult.get();
4186 
4187   QualType Result = TL.getType();
4188   if (getDerived().AlwaysRebuild() ||
4189       ElementType != T->getElementType() ||
4190       Size != T->getSizeExpr()) {
4191     Result = getDerived().RebuildVariableArrayType(ElementType,
4192                                                    T->getSizeModifier(),
4193                                                    Size,
4194                                              T->getIndexTypeCVRQualifiers(),
4195                                                    TL.getBracketsRange());
4196     if (Result.isNull())
4197       return QualType();
4198   }
4199 
4200   // We might have constant size array now, but fortunately it has the same
4201   // location layout.
4202   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4203   NewTL.setLBracketLoc(TL.getLBracketLoc());
4204   NewTL.setRBracketLoc(TL.getRBracketLoc());
4205   NewTL.setSizeExpr(Size);
4206 
4207   return Result;
4208 }
4209 
4210 template<typename Derived>
4211 QualType
TransformDependentSizedArrayType(TypeLocBuilder & TLB,DependentSizedArrayTypeLoc TL)4212 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4213                                              DependentSizedArrayTypeLoc TL) {
4214   const DependentSizedArrayType *T = TL.getTypePtr();
4215   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4216   if (ElementType.isNull())
4217     return QualType();
4218 
4219   // Array bounds are constant expressions.
4220   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4221                                                Sema::ConstantEvaluated);
4222 
4223   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4224   Expr *origSize = TL.getSizeExpr();
4225   if (!origSize) origSize = T->getSizeExpr();
4226 
4227   ExprResult sizeResult
4228     = getDerived().TransformExpr(origSize);
4229   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4230   if (sizeResult.isInvalid())
4231     return QualType();
4232 
4233   Expr *size = sizeResult.get();
4234 
4235   QualType Result = TL.getType();
4236   if (getDerived().AlwaysRebuild() ||
4237       ElementType != T->getElementType() ||
4238       size != origSize) {
4239     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4240                                                          T->getSizeModifier(),
4241                                                          size,
4242                                                 T->getIndexTypeCVRQualifiers(),
4243                                                         TL.getBracketsRange());
4244     if (Result.isNull())
4245       return QualType();
4246   }
4247 
4248   // We might have any sort of array type now, but fortunately they
4249   // all have the same location layout.
4250   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4251   NewTL.setLBracketLoc(TL.getLBracketLoc());
4252   NewTL.setRBracketLoc(TL.getRBracketLoc());
4253   NewTL.setSizeExpr(size);
4254 
4255   return Result;
4256 }
4257 
4258 template<typename Derived>
TransformDependentSizedExtVectorType(TypeLocBuilder & TLB,DependentSizedExtVectorTypeLoc TL)4259 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4260                                       TypeLocBuilder &TLB,
4261                                       DependentSizedExtVectorTypeLoc TL) {
4262   const DependentSizedExtVectorType *T = TL.getTypePtr();
4263 
4264   // FIXME: ext vector locs should be nested
4265   QualType ElementType = getDerived().TransformType(T->getElementType());
4266   if (ElementType.isNull())
4267     return QualType();
4268 
4269   // Vector sizes are constant expressions.
4270   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4271                                                Sema::ConstantEvaluated);
4272 
4273   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4274   Size = SemaRef.ActOnConstantExpression(Size);
4275   if (Size.isInvalid())
4276     return QualType();
4277 
4278   QualType Result = TL.getType();
4279   if (getDerived().AlwaysRebuild() ||
4280       ElementType != T->getElementType() ||
4281       Size.get() != T->getSizeExpr()) {
4282     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4283                                                              Size.get(),
4284                                                          T->getAttributeLoc());
4285     if (Result.isNull())
4286       return QualType();
4287   }
4288 
4289   // Result might be dependent or not.
4290   if (isa<DependentSizedExtVectorType>(Result)) {
4291     DependentSizedExtVectorTypeLoc NewTL
4292       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4293     NewTL.setNameLoc(TL.getNameLoc());
4294   } else {
4295     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4296     NewTL.setNameLoc(TL.getNameLoc());
4297   }
4298 
4299   return Result;
4300 }
4301 
4302 template<typename Derived>
TransformVectorType(TypeLocBuilder & TLB,VectorTypeLoc TL)4303 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4304                                                      VectorTypeLoc TL) {
4305   const VectorType *T = TL.getTypePtr();
4306   QualType ElementType = getDerived().TransformType(T->getElementType());
4307   if (ElementType.isNull())
4308     return QualType();
4309 
4310   QualType Result = TL.getType();
4311   if (getDerived().AlwaysRebuild() ||
4312       ElementType != T->getElementType()) {
4313     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4314                                             T->getVectorKind());
4315     if (Result.isNull())
4316       return QualType();
4317   }
4318 
4319   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4320   NewTL.setNameLoc(TL.getNameLoc());
4321 
4322   return Result;
4323 }
4324 
4325 template<typename Derived>
TransformExtVectorType(TypeLocBuilder & TLB,ExtVectorTypeLoc TL)4326 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4327                                                         ExtVectorTypeLoc TL) {
4328   const VectorType *T = TL.getTypePtr();
4329   QualType ElementType = getDerived().TransformType(T->getElementType());
4330   if (ElementType.isNull())
4331     return QualType();
4332 
4333   QualType Result = TL.getType();
4334   if (getDerived().AlwaysRebuild() ||
4335       ElementType != T->getElementType()) {
4336     Result = getDerived().RebuildExtVectorType(ElementType,
4337                                                T->getNumElements(),
4338                                                /*FIXME*/ SourceLocation());
4339     if (Result.isNull())
4340       return QualType();
4341   }
4342 
4343   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4344   NewTL.setNameLoc(TL.getNameLoc());
4345 
4346   return Result;
4347 }
4348 
4349 template <typename Derived>
TransformFunctionTypeParam(ParmVarDecl * OldParm,int indexAdjustment,Optional<unsigned> NumExpansions,bool ExpectParameterPack)4350 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4351     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4352     bool ExpectParameterPack) {
4353   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4354   TypeSourceInfo *NewDI = nullptr;
4355 
4356   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4357     // If we're substituting into a pack expansion type and we know the
4358     // length we want to expand to, just substitute for the pattern.
4359     TypeLoc OldTL = OldDI->getTypeLoc();
4360     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4361 
4362     TypeLocBuilder TLB;
4363     TypeLoc NewTL = OldDI->getTypeLoc();
4364     TLB.reserve(NewTL.getFullDataSize());
4365 
4366     QualType Result = getDerived().TransformType(TLB,
4367                                                OldExpansionTL.getPatternLoc());
4368     if (Result.isNull())
4369       return nullptr;
4370 
4371     Result = RebuildPackExpansionType(Result,
4372                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4373                                       OldExpansionTL.getEllipsisLoc(),
4374                                       NumExpansions);
4375     if (Result.isNull())
4376       return nullptr;
4377 
4378     PackExpansionTypeLoc NewExpansionTL
4379       = TLB.push<PackExpansionTypeLoc>(Result);
4380     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4381     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4382   } else
4383     NewDI = getDerived().TransformType(OldDI);
4384   if (!NewDI)
4385     return nullptr;
4386 
4387   if (NewDI == OldDI && indexAdjustment == 0)
4388     return OldParm;
4389 
4390   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4391                                              OldParm->getDeclContext(),
4392                                              OldParm->getInnerLocStart(),
4393                                              OldParm->getLocation(),
4394                                              OldParm->getIdentifier(),
4395                                              NewDI->getType(),
4396                                              NewDI,
4397                                              OldParm->getStorageClass(),
4398                                              /* DefArg */ nullptr);
4399   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4400                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4401   return newParm;
4402 }
4403 
4404 template<typename Derived>
4405 bool TreeTransform<Derived>::
TransformFunctionTypeParams(SourceLocation Loc,ParmVarDecl ** Params,unsigned NumParams,const QualType * ParamTypes,SmallVectorImpl<QualType> & OutParamTypes,SmallVectorImpl<ParmVarDecl * > * PVars)4406   TransformFunctionTypeParams(SourceLocation Loc,
4407                               ParmVarDecl **Params, unsigned NumParams,
4408                               const QualType *ParamTypes,
4409                               SmallVectorImpl<QualType> &OutParamTypes,
4410                               SmallVectorImpl<ParmVarDecl*> *PVars) {
4411   int indexAdjustment = 0;
4412 
4413   for (unsigned i = 0; i != NumParams; ++i) {
4414     if (ParmVarDecl *OldParm = Params[i]) {
4415       assert(OldParm->getFunctionScopeIndex() == i);
4416 
4417       Optional<unsigned> NumExpansions;
4418       ParmVarDecl *NewParm = nullptr;
4419       if (OldParm->isParameterPack()) {
4420         // We have a function parameter pack that may need to be expanded.
4421         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4422 
4423         // Find the parameter packs that could be expanded.
4424         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4425         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4426         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4427         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4428         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4429 
4430         // Determine whether we should expand the parameter packs.
4431         bool ShouldExpand = false;
4432         bool RetainExpansion = false;
4433         Optional<unsigned> OrigNumExpansions =
4434             ExpansionTL.getTypePtr()->getNumExpansions();
4435         NumExpansions = OrigNumExpansions;
4436         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4437                                                  Pattern.getSourceRange(),
4438                                                  Unexpanded,
4439                                                  ShouldExpand,
4440                                                  RetainExpansion,
4441                                                  NumExpansions)) {
4442           return true;
4443         }
4444 
4445         if (ShouldExpand) {
4446           // Expand the function parameter pack into multiple, separate
4447           // parameters.
4448           getDerived().ExpandingFunctionParameterPack(OldParm);
4449           for (unsigned I = 0; I != *NumExpansions; ++I) {
4450             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4451             ParmVarDecl *NewParm
4452               = getDerived().TransformFunctionTypeParam(OldParm,
4453                                                         indexAdjustment++,
4454                                                         OrigNumExpansions,
4455                                                 /*ExpectParameterPack=*/false);
4456             if (!NewParm)
4457               return true;
4458 
4459             OutParamTypes.push_back(NewParm->getType());
4460             if (PVars)
4461               PVars->push_back(NewParm);
4462           }
4463 
4464           // If we're supposed to retain a pack expansion, do so by temporarily
4465           // forgetting the partially-substituted parameter pack.
4466           if (RetainExpansion) {
4467             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4468             ParmVarDecl *NewParm
4469               = getDerived().TransformFunctionTypeParam(OldParm,
4470                                                         indexAdjustment++,
4471                                                         OrigNumExpansions,
4472                                                 /*ExpectParameterPack=*/false);
4473             if (!NewParm)
4474               return true;
4475 
4476             OutParamTypes.push_back(NewParm->getType());
4477             if (PVars)
4478               PVars->push_back(NewParm);
4479           }
4480 
4481           // The next parameter should have the same adjustment as the
4482           // last thing we pushed, but we post-incremented indexAdjustment
4483           // on every push.  Also, if we push nothing, the adjustment should
4484           // go down by one.
4485           indexAdjustment--;
4486 
4487           // We're done with the pack expansion.
4488           continue;
4489         }
4490 
4491         // We'll substitute the parameter now without expanding the pack
4492         // expansion.
4493         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4494         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4495                                                           indexAdjustment,
4496                                                           NumExpansions,
4497                                                   /*ExpectParameterPack=*/true);
4498       } else {
4499         NewParm = getDerived().TransformFunctionTypeParam(
4500             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4501       }
4502 
4503       if (!NewParm)
4504         return true;
4505 
4506       OutParamTypes.push_back(NewParm->getType());
4507       if (PVars)
4508         PVars->push_back(NewParm);
4509       continue;
4510     }
4511 
4512     // Deal with the possibility that we don't have a parameter
4513     // declaration for this parameter.
4514     QualType OldType = ParamTypes[i];
4515     bool IsPackExpansion = false;
4516     Optional<unsigned> NumExpansions;
4517     QualType NewType;
4518     if (const PackExpansionType *Expansion
4519                                        = dyn_cast<PackExpansionType>(OldType)) {
4520       // We have a function parameter pack that may need to be expanded.
4521       QualType Pattern = Expansion->getPattern();
4522       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4523       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4524 
4525       // Determine whether we should expand the parameter packs.
4526       bool ShouldExpand = false;
4527       bool RetainExpansion = false;
4528       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4529                                                Unexpanded,
4530                                                ShouldExpand,
4531                                                RetainExpansion,
4532                                                NumExpansions)) {
4533         return true;
4534       }
4535 
4536       if (ShouldExpand) {
4537         // Expand the function parameter pack into multiple, separate
4538         // parameters.
4539         for (unsigned I = 0; I != *NumExpansions; ++I) {
4540           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4541           QualType NewType = getDerived().TransformType(Pattern);
4542           if (NewType.isNull())
4543             return true;
4544 
4545           OutParamTypes.push_back(NewType);
4546           if (PVars)
4547             PVars->push_back(nullptr);
4548         }
4549 
4550         // We're done with the pack expansion.
4551         continue;
4552       }
4553 
4554       // If we're supposed to retain a pack expansion, do so by temporarily
4555       // forgetting the partially-substituted parameter pack.
4556       if (RetainExpansion) {
4557         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4558         QualType NewType = getDerived().TransformType(Pattern);
4559         if (NewType.isNull())
4560           return true;
4561 
4562         OutParamTypes.push_back(NewType);
4563         if (PVars)
4564           PVars->push_back(nullptr);
4565       }
4566 
4567       // We'll substitute the parameter now without expanding the pack
4568       // expansion.
4569       OldType = Expansion->getPattern();
4570       IsPackExpansion = true;
4571       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4572       NewType = getDerived().TransformType(OldType);
4573     } else {
4574       NewType = getDerived().TransformType(OldType);
4575     }
4576 
4577     if (NewType.isNull())
4578       return true;
4579 
4580     if (IsPackExpansion)
4581       NewType = getSema().Context.getPackExpansionType(NewType,
4582                                                        NumExpansions);
4583 
4584     OutParamTypes.push_back(NewType);
4585     if (PVars)
4586       PVars->push_back(nullptr);
4587   }
4588 
4589 #ifndef NDEBUG
4590   if (PVars) {
4591     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
4592       if (ParmVarDecl *parm = (*PVars)[i])
4593         assert(parm->getFunctionScopeIndex() == i);
4594   }
4595 #endif
4596 
4597   return false;
4598 }
4599 
4600 template<typename Derived>
4601 QualType
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL)4602 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4603                                                    FunctionProtoTypeLoc TL) {
4604   SmallVector<QualType, 4> ExceptionStorage;
4605   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
4606   return getDerived().TransformFunctionProtoType(
4607       TLB, TL, nullptr, 0,
4608       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
4609         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
4610                                             ExceptionStorage, Changed);
4611       });
4612 }
4613 
4614 template<typename Derived> template<typename Fn>
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL,CXXRecordDecl * ThisContext,unsigned ThisTypeQuals,Fn TransformExceptionSpec)4615 QualType TreeTransform<Derived>::TransformFunctionProtoType(
4616     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
4617     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
4618   // Transform the parameters and return type.
4619   //
4620   // We are required to instantiate the params and return type in source order.
4621   // When the function has a trailing return type, we instantiate the
4622   // parameters before the return type,  since the return type can then refer
4623   // to the parameters themselves (via decltype, sizeof, etc.).
4624   //
4625   SmallVector<QualType, 4> ParamTypes;
4626   SmallVector<ParmVarDecl*, 4> ParamDecls;
4627   const FunctionProtoType *T = TL.getTypePtr();
4628 
4629   QualType ResultType;
4630 
4631   if (T->hasTrailingReturn()) {
4632     if (getDerived().TransformFunctionTypeParams(
4633             TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4634             TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4635       return QualType();
4636 
4637     {
4638       // C++11 [expr.prim.general]p3:
4639       //   If a declaration declares a member function or member function
4640       //   template of a class X, the expression this is a prvalue of type
4641       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
4642       //   and the end of the function-definition, member-declarator, or
4643       //   declarator.
4644       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
4645 
4646       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4647       if (ResultType.isNull())
4648         return QualType();
4649     }
4650   }
4651   else {
4652     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4653     if (ResultType.isNull())
4654       return QualType();
4655 
4656     if (getDerived().TransformFunctionTypeParams(
4657             TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4658             TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4659       return QualType();
4660   }
4661 
4662   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
4663 
4664   bool EPIChanged = false;
4665   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
4666     return QualType();
4667 
4668   // FIXME: Need to transform ConsumedParameters for variadic template
4669   // expansion.
4670 
4671   QualType Result = TL.getType();
4672   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
4673       T->getNumParams() != ParamTypes.size() ||
4674       !std::equal(T->param_type_begin(), T->param_type_end(),
4675                   ParamTypes.begin()) || EPIChanged) {
4676     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
4677     if (Result.isNull())
4678       return QualType();
4679   }
4680 
4681   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
4682   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4683   NewTL.setLParenLoc(TL.getLParenLoc());
4684   NewTL.setRParenLoc(TL.getRParenLoc());
4685   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4686   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
4687     NewTL.setParam(i, ParamDecls[i]);
4688 
4689   return Result;
4690 }
4691 
4692 template<typename Derived>
TransformExceptionSpec(SourceLocation Loc,FunctionProtoType::ExceptionSpecInfo & ESI,SmallVectorImpl<QualType> & Exceptions,bool & Changed)4693 bool TreeTransform<Derived>::TransformExceptionSpec(
4694     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
4695     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
4696   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
4697 
4698   // Instantiate a dynamic noexcept expression, if any.
4699   if (ESI.Type == EST_ComputedNoexcept) {
4700     EnterExpressionEvaluationContext Unevaluated(getSema(),
4701                                                  Sema::ConstantEvaluated);
4702     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
4703     if (NoexceptExpr.isInvalid())
4704       return true;
4705 
4706     NoexceptExpr = getSema().CheckBooleanCondition(
4707         NoexceptExpr.get(), NoexceptExpr.get()->getLocStart());
4708     if (NoexceptExpr.isInvalid())
4709       return true;
4710 
4711     if (!NoexceptExpr.get()->isValueDependent()) {
4712       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
4713           NoexceptExpr.get(), nullptr,
4714           diag::err_noexcept_needs_constant_expression,
4715           /*AllowFold*/false);
4716       if (NoexceptExpr.isInvalid())
4717         return true;
4718     }
4719 
4720     if (ESI.NoexceptExpr != NoexceptExpr.get())
4721       Changed = true;
4722     ESI.NoexceptExpr = NoexceptExpr.get();
4723   }
4724 
4725   if (ESI.Type != EST_Dynamic)
4726     return false;
4727 
4728   // Instantiate a dynamic exception specification's type.
4729   for (QualType T : ESI.Exceptions) {
4730     if (const PackExpansionType *PackExpansion =
4731             T->getAs<PackExpansionType>()) {
4732       Changed = true;
4733 
4734       // We have a pack expansion. Instantiate it.
4735       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4736       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
4737                                               Unexpanded);
4738       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4739 
4740       // Determine whether the set of unexpanded parameter packs can and
4741       // should
4742       // be expanded.
4743       bool Expand = false;
4744       bool RetainExpansion = false;
4745       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
4746       // FIXME: Track the location of the ellipsis (and track source location
4747       // information for the types in the exception specification in general).
4748       if (getDerived().TryExpandParameterPacks(
4749               Loc, SourceRange(), Unexpanded, Expand,
4750               RetainExpansion, NumExpansions))
4751         return true;
4752 
4753       if (!Expand) {
4754         // We can't expand this pack expansion into separate arguments yet;
4755         // just substitute into the pattern and create a new pack expansion
4756         // type.
4757         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4758         QualType U = getDerived().TransformType(PackExpansion->getPattern());
4759         if (U.isNull())
4760           return true;
4761 
4762         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
4763         Exceptions.push_back(U);
4764         continue;
4765       }
4766 
4767       // Substitute into the pack expansion pattern for each slice of the
4768       // pack.
4769       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
4770         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
4771 
4772         QualType U = getDerived().TransformType(PackExpansion->getPattern());
4773         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
4774           return true;
4775 
4776         Exceptions.push_back(U);
4777       }
4778     } else {
4779       QualType U = getDerived().TransformType(T);
4780       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
4781         return true;
4782       if (T != U)
4783         Changed = true;
4784 
4785       Exceptions.push_back(U);
4786     }
4787   }
4788 
4789   ESI.Exceptions = Exceptions;
4790   return false;
4791 }
4792 
4793 template<typename Derived>
TransformFunctionNoProtoType(TypeLocBuilder & TLB,FunctionNoProtoTypeLoc TL)4794 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
4795                                                  TypeLocBuilder &TLB,
4796                                                  FunctionNoProtoTypeLoc TL) {
4797   const FunctionNoProtoType *T = TL.getTypePtr();
4798   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4799   if (ResultType.isNull())
4800     return QualType();
4801 
4802   QualType Result = TL.getType();
4803   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
4804     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
4805 
4806   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
4807   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4808   NewTL.setLParenLoc(TL.getLParenLoc());
4809   NewTL.setRParenLoc(TL.getRParenLoc());
4810   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4811 
4812   return Result;
4813 }
4814 
4815 template<typename Derived> QualType
TransformUnresolvedUsingType(TypeLocBuilder & TLB,UnresolvedUsingTypeLoc TL)4816 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
4817                                                  UnresolvedUsingTypeLoc TL) {
4818   const UnresolvedUsingType *T = TL.getTypePtr();
4819   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
4820   if (!D)
4821     return QualType();
4822 
4823   QualType Result = TL.getType();
4824   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
4825     Result = getDerived().RebuildUnresolvedUsingType(D);
4826     if (Result.isNull())
4827       return QualType();
4828   }
4829 
4830   // We might get an arbitrary type spec type back.  We should at
4831   // least always get a type spec type, though.
4832   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
4833   NewTL.setNameLoc(TL.getNameLoc());
4834 
4835   return Result;
4836 }
4837 
4838 template<typename Derived>
TransformTypedefType(TypeLocBuilder & TLB,TypedefTypeLoc TL)4839 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
4840                                                       TypedefTypeLoc TL) {
4841   const TypedefType *T = TL.getTypePtr();
4842   TypedefNameDecl *Typedef
4843     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4844                                                                T->getDecl()));
4845   if (!Typedef)
4846     return QualType();
4847 
4848   QualType Result = TL.getType();
4849   if (getDerived().AlwaysRebuild() ||
4850       Typedef != T->getDecl()) {
4851     Result = getDerived().RebuildTypedefType(Typedef);
4852     if (Result.isNull())
4853       return QualType();
4854   }
4855 
4856   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
4857   NewTL.setNameLoc(TL.getNameLoc());
4858 
4859   return Result;
4860 }
4861 
4862 template<typename Derived>
TransformTypeOfExprType(TypeLocBuilder & TLB,TypeOfExprTypeLoc TL)4863 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
4864                                                       TypeOfExprTypeLoc TL) {
4865   // typeof expressions are not potentially evaluated contexts
4866   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4867                                                Sema::ReuseLambdaContextDecl);
4868 
4869   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
4870   if (E.isInvalid())
4871     return QualType();
4872 
4873   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
4874   if (E.isInvalid())
4875     return QualType();
4876 
4877   QualType Result = TL.getType();
4878   if (getDerived().AlwaysRebuild() ||
4879       E.get() != TL.getUnderlyingExpr()) {
4880     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
4881     if (Result.isNull())
4882       return QualType();
4883   }
4884   else E.get();
4885 
4886   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
4887   NewTL.setTypeofLoc(TL.getTypeofLoc());
4888   NewTL.setLParenLoc(TL.getLParenLoc());
4889   NewTL.setRParenLoc(TL.getRParenLoc());
4890 
4891   return Result;
4892 }
4893 
4894 template<typename Derived>
TransformTypeOfType(TypeLocBuilder & TLB,TypeOfTypeLoc TL)4895 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
4896                                                      TypeOfTypeLoc TL) {
4897   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
4898   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
4899   if (!New_Under_TI)
4900     return QualType();
4901 
4902   QualType Result = TL.getType();
4903   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
4904     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
4905     if (Result.isNull())
4906       return QualType();
4907   }
4908 
4909   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
4910   NewTL.setTypeofLoc(TL.getTypeofLoc());
4911   NewTL.setLParenLoc(TL.getLParenLoc());
4912   NewTL.setRParenLoc(TL.getRParenLoc());
4913   NewTL.setUnderlyingTInfo(New_Under_TI);
4914 
4915   return Result;
4916 }
4917 
4918 template<typename Derived>
TransformDecltypeType(TypeLocBuilder & TLB,DecltypeTypeLoc TL)4919 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
4920                                                        DecltypeTypeLoc TL) {
4921   const DecltypeType *T = TL.getTypePtr();
4922 
4923   // decltype expressions are not potentially evaluated contexts
4924   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4925                                                nullptr, /*IsDecltype=*/ true);
4926 
4927   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
4928   if (E.isInvalid())
4929     return QualType();
4930 
4931   E = getSema().ActOnDecltypeExpression(E.get());
4932   if (E.isInvalid())
4933     return QualType();
4934 
4935   QualType Result = TL.getType();
4936   if (getDerived().AlwaysRebuild() ||
4937       E.get() != T->getUnderlyingExpr()) {
4938     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
4939     if (Result.isNull())
4940       return QualType();
4941   }
4942   else E.get();
4943 
4944   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
4945   NewTL.setNameLoc(TL.getNameLoc());
4946 
4947   return Result;
4948 }
4949 
4950 template<typename Derived>
TransformUnaryTransformType(TypeLocBuilder & TLB,UnaryTransformTypeLoc TL)4951 QualType TreeTransform<Derived>::TransformUnaryTransformType(
4952                                                             TypeLocBuilder &TLB,
4953                                                      UnaryTransformTypeLoc TL) {
4954   QualType Result = TL.getType();
4955   if (Result->isDependentType()) {
4956     const UnaryTransformType *T = TL.getTypePtr();
4957     QualType NewBase =
4958       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
4959     Result = getDerived().RebuildUnaryTransformType(NewBase,
4960                                                     T->getUTTKind(),
4961                                                     TL.getKWLoc());
4962     if (Result.isNull())
4963       return QualType();
4964   }
4965 
4966   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
4967   NewTL.setKWLoc(TL.getKWLoc());
4968   NewTL.setParensRange(TL.getParensRange());
4969   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
4970   return Result;
4971 }
4972 
4973 template<typename Derived>
TransformAutoType(TypeLocBuilder & TLB,AutoTypeLoc TL)4974 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
4975                                                    AutoTypeLoc TL) {
4976   const AutoType *T = TL.getTypePtr();
4977   QualType OldDeduced = T->getDeducedType();
4978   QualType NewDeduced;
4979   if (!OldDeduced.isNull()) {
4980     NewDeduced = getDerived().TransformType(OldDeduced);
4981     if (NewDeduced.isNull())
4982       return QualType();
4983   }
4984 
4985   QualType Result = TL.getType();
4986   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
4987       T->isDependentType()) {
4988     Result = getDerived().RebuildAutoType(NewDeduced, T->isDecltypeAuto());
4989     if (Result.isNull())
4990       return QualType();
4991   }
4992 
4993   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
4994   NewTL.setNameLoc(TL.getNameLoc());
4995 
4996   return Result;
4997 }
4998 
4999 template<typename Derived>
TransformRecordType(TypeLocBuilder & TLB,RecordTypeLoc TL)5000 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5001                                                      RecordTypeLoc TL) {
5002   const RecordType *T = TL.getTypePtr();
5003   RecordDecl *Record
5004     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5005                                                           T->getDecl()));
5006   if (!Record)
5007     return QualType();
5008 
5009   QualType Result = TL.getType();
5010   if (getDerived().AlwaysRebuild() ||
5011       Record != T->getDecl()) {
5012     Result = getDerived().RebuildRecordType(Record);
5013     if (Result.isNull())
5014       return QualType();
5015   }
5016 
5017   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5018   NewTL.setNameLoc(TL.getNameLoc());
5019 
5020   return Result;
5021 }
5022 
5023 template<typename Derived>
TransformEnumType(TypeLocBuilder & TLB,EnumTypeLoc TL)5024 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5025                                                    EnumTypeLoc TL) {
5026   const EnumType *T = TL.getTypePtr();
5027   EnumDecl *Enum
5028     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5029                                                         T->getDecl()));
5030   if (!Enum)
5031     return QualType();
5032 
5033   QualType Result = TL.getType();
5034   if (getDerived().AlwaysRebuild() ||
5035       Enum != T->getDecl()) {
5036     Result = getDerived().RebuildEnumType(Enum);
5037     if (Result.isNull())
5038       return QualType();
5039   }
5040 
5041   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5042   NewTL.setNameLoc(TL.getNameLoc());
5043 
5044   return Result;
5045 }
5046 
5047 template<typename Derived>
TransformInjectedClassNameType(TypeLocBuilder & TLB,InjectedClassNameTypeLoc TL)5048 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5049                                          TypeLocBuilder &TLB,
5050                                          InjectedClassNameTypeLoc TL) {
5051   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5052                                        TL.getTypePtr()->getDecl());
5053   if (!D) return QualType();
5054 
5055   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5056   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5057   return T;
5058 }
5059 
5060 template<typename Derived>
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL)5061 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5062                                                 TypeLocBuilder &TLB,
5063                                                 TemplateTypeParmTypeLoc TL) {
5064   return TransformTypeSpecType(TLB, TL);
5065 }
5066 
5067 template<typename Derived>
TransformSubstTemplateTypeParmType(TypeLocBuilder & TLB,SubstTemplateTypeParmTypeLoc TL)5068 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5069                                          TypeLocBuilder &TLB,
5070                                          SubstTemplateTypeParmTypeLoc TL) {
5071   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5072 
5073   // Substitute into the replacement type, which itself might involve something
5074   // that needs to be transformed. This only tends to occur with default
5075   // template arguments of template template parameters.
5076   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5077   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5078   if (Replacement.isNull())
5079     return QualType();
5080 
5081   // Always canonicalize the replacement type.
5082   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5083   QualType Result
5084     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5085                                                    Replacement);
5086 
5087   // Propagate type-source information.
5088   SubstTemplateTypeParmTypeLoc NewTL
5089     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5090   NewTL.setNameLoc(TL.getNameLoc());
5091   return Result;
5092 
5093 }
5094 
5095 template<typename Derived>
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL)5096 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5097                                           TypeLocBuilder &TLB,
5098                                           SubstTemplateTypeParmPackTypeLoc TL) {
5099   return TransformTypeSpecType(TLB, TL);
5100 }
5101 
5102 template<typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL)5103 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5104                                                         TypeLocBuilder &TLB,
5105                                            TemplateSpecializationTypeLoc TL) {
5106   const TemplateSpecializationType *T = TL.getTypePtr();
5107 
5108   // The nested-name-specifier never matters in a TemplateSpecializationType,
5109   // because we can't have a dependent nested-name-specifier anyway.
5110   CXXScopeSpec SS;
5111   TemplateName Template
5112     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5113                                          TL.getTemplateNameLoc());
5114   if (Template.isNull())
5115     return QualType();
5116 
5117   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5118 }
5119 
5120 template<typename Derived>
TransformAtomicType(TypeLocBuilder & TLB,AtomicTypeLoc TL)5121 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5122                                                      AtomicTypeLoc TL) {
5123   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5124   if (ValueType.isNull())
5125     return QualType();
5126 
5127   QualType Result = TL.getType();
5128   if (getDerived().AlwaysRebuild() ||
5129       ValueType != TL.getValueLoc().getType()) {
5130     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5131     if (Result.isNull())
5132       return QualType();
5133   }
5134 
5135   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5136   NewTL.setKWLoc(TL.getKWLoc());
5137   NewTL.setLParenLoc(TL.getLParenLoc());
5138   NewTL.setRParenLoc(TL.getRParenLoc());
5139 
5140   return Result;
5141 }
5142 
5143   /// \brief Simple iterator that traverses the template arguments in a
5144   /// container that provides a \c getArgLoc() member function.
5145   ///
5146   /// This iterator is intended to be used with the iterator form of
5147   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5148   template<typename ArgLocContainer>
5149   class TemplateArgumentLocContainerIterator {
5150     ArgLocContainer *Container;
5151     unsigned Index;
5152 
5153   public:
5154     typedef TemplateArgumentLoc value_type;
5155     typedef TemplateArgumentLoc reference;
5156     typedef int difference_type;
5157     typedef std::input_iterator_tag iterator_category;
5158 
5159     class pointer {
5160       TemplateArgumentLoc Arg;
5161 
5162     public:
pointer(TemplateArgumentLoc Arg)5163       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5164 
5165       const TemplateArgumentLoc *operator->() const {
5166         return &Arg;
5167       }
5168     };
5169 
5170 
TemplateArgumentLocContainerIterator()5171     TemplateArgumentLocContainerIterator() {}
5172 
TemplateArgumentLocContainerIterator(ArgLocContainer & Container,unsigned Index)5173     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5174                                  unsigned Index)
5175       : Container(&Container), Index(Index) { }
5176 
5177     TemplateArgumentLocContainerIterator &operator++() {
5178       ++Index;
5179       return *this;
5180     }
5181 
5182     TemplateArgumentLocContainerIterator operator++(int) {
5183       TemplateArgumentLocContainerIterator Old(*this);
5184       ++(*this);
5185       return Old;
5186     }
5187 
5188     TemplateArgumentLoc operator*() const {
5189       return Container->getArgLoc(Index);
5190     }
5191 
5192     pointer operator->() const {
5193       return pointer(Container->getArgLoc(Index));
5194     }
5195 
5196     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5197                            const TemplateArgumentLocContainerIterator &Y) {
5198       return X.Container == Y.Container && X.Index == Y.Index;
5199     }
5200 
5201     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5202                            const TemplateArgumentLocContainerIterator &Y) {
5203       return !(X == Y);
5204     }
5205   };
5206 
5207 
5208 template <typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL,TemplateName Template)5209 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5210                                                         TypeLocBuilder &TLB,
5211                                            TemplateSpecializationTypeLoc TL,
5212                                                       TemplateName Template) {
5213   TemplateArgumentListInfo NewTemplateArgs;
5214   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5215   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5216   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5217     ArgIterator;
5218   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5219                                               ArgIterator(TL, TL.getNumArgs()),
5220                                               NewTemplateArgs))
5221     return QualType();
5222 
5223   // FIXME: maybe don't rebuild if all the template arguments are the same.
5224 
5225   QualType Result =
5226     getDerived().RebuildTemplateSpecializationType(Template,
5227                                                    TL.getTemplateNameLoc(),
5228                                                    NewTemplateArgs);
5229 
5230   if (!Result.isNull()) {
5231     // Specializations of template template parameters are represented as
5232     // TemplateSpecializationTypes, and substitution of type alias templates
5233     // within a dependent context can transform them into
5234     // DependentTemplateSpecializationTypes.
5235     if (isa<DependentTemplateSpecializationType>(Result)) {
5236       DependentTemplateSpecializationTypeLoc NewTL
5237         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5238       NewTL.setElaboratedKeywordLoc(SourceLocation());
5239       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5240       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5241       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5242       NewTL.setLAngleLoc(TL.getLAngleLoc());
5243       NewTL.setRAngleLoc(TL.getRAngleLoc());
5244       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5245         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5246       return Result;
5247     }
5248 
5249     TemplateSpecializationTypeLoc NewTL
5250       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5251     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5252     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5253     NewTL.setLAngleLoc(TL.getLAngleLoc());
5254     NewTL.setRAngleLoc(TL.getRAngleLoc());
5255     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5256       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5257   }
5258 
5259   return Result;
5260 }
5261 
5262 template <typename Derived>
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,TemplateName Template,CXXScopeSpec & SS)5263 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5264                                      TypeLocBuilder &TLB,
5265                                      DependentTemplateSpecializationTypeLoc TL,
5266                                      TemplateName Template,
5267                                      CXXScopeSpec &SS) {
5268   TemplateArgumentListInfo NewTemplateArgs;
5269   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5270   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5271   typedef TemplateArgumentLocContainerIterator<
5272             DependentTemplateSpecializationTypeLoc> ArgIterator;
5273   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5274                                               ArgIterator(TL, TL.getNumArgs()),
5275                                               NewTemplateArgs))
5276     return QualType();
5277 
5278   // FIXME: maybe don't rebuild if all the template arguments are the same.
5279 
5280   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5281     QualType Result
5282       = getSema().Context.getDependentTemplateSpecializationType(
5283                                                 TL.getTypePtr()->getKeyword(),
5284                                                          DTN->getQualifier(),
5285                                                          DTN->getIdentifier(),
5286                                                                NewTemplateArgs);
5287 
5288     DependentTemplateSpecializationTypeLoc NewTL
5289       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5290     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5291     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5292     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5293     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5294     NewTL.setLAngleLoc(TL.getLAngleLoc());
5295     NewTL.setRAngleLoc(TL.getRAngleLoc());
5296     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5297       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5298     return Result;
5299   }
5300 
5301   QualType Result
5302     = getDerived().RebuildTemplateSpecializationType(Template,
5303                                                      TL.getTemplateNameLoc(),
5304                                                      NewTemplateArgs);
5305 
5306   if (!Result.isNull()) {
5307     /// FIXME: Wrap this in an elaborated-type-specifier?
5308     TemplateSpecializationTypeLoc NewTL
5309       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5310     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5311     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5312     NewTL.setLAngleLoc(TL.getLAngleLoc());
5313     NewTL.setRAngleLoc(TL.getRAngleLoc());
5314     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5315       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5316   }
5317 
5318   return Result;
5319 }
5320 
5321 template<typename Derived>
5322 QualType
TransformElaboratedType(TypeLocBuilder & TLB,ElaboratedTypeLoc TL)5323 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5324                                                 ElaboratedTypeLoc TL) {
5325   const ElaboratedType *T = TL.getTypePtr();
5326 
5327   NestedNameSpecifierLoc QualifierLoc;
5328   // NOTE: the qualifier in an ElaboratedType is optional.
5329   if (TL.getQualifierLoc()) {
5330     QualifierLoc
5331       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5332     if (!QualifierLoc)
5333       return QualType();
5334   }
5335 
5336   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5337   if (NamedT.isNull())
5338     return QualType();
5339 
5340   // C++0x [dcl.type.elab]p2:
5341   //   If the identifier resolves to a typedef-name or the simple-template-id
5342   //   resolves to an alias template specialization, the
5343   //   elaborated-type-specifier is ill-formed.
5344   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5345     if (const TemplateSpecializationType *TST =
5346           NamedT->getAs<TemplateSpecializationType>()) {
5347       TemplateName Template = TST->getTemplateName();
5348       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5349               Template.getAsTemplateDecl())) {
5350         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5351                      diag::err_tag_reference_non_tag) << 4;
5352         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5353       }
5354     }
5355   }
5356 
5357   QualType Result = TL.getType();
5358   if (getDerived().AlwaysRebuild() ||
5359       QualifierLoc != TL.getQualifierLoc() ||
5360       NamedT != T->getNamedType()) {
5361     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5362                                                 T->getKeyword(),
5363                                                 QualifierLoc, NamedT);
5364     if (Result.isNull())
5365       return QualType();
5366   }
5367 
5368   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5369   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5370   NewTL.setQualifierLoc(QualifierLoc);
5371   return Result;
5372 }
5373 
5374 template<typename Derived>
TransformAttributedType(TypeLocBuilder & TLB,AttributedTypeLoc TL)5375 QualType TreeTransform<Derived>::TransformAttributedType(
5376                                                 TypeLocBuilder &TLB,
5377                                                 AttributedTypeLoc TL) {
5378   const AttributedType *oldType = TL.getTypePtr();
5379   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5380   if (modifiedType.isNull())
5381     return QualType();
5382 
5383   QualType result = TL.getType();
5384 
5385   // FIXME: dependent operand expressions?
5386   if (getDerived().AlwaysRebuild() ||
5387       modifiedType != oldType->getModifiedType()) {
5388     // TODO: this is really lame; we should really be rebuilding the
5389     // equivalent type from first principles.
5390     QualType equivalentType
5391       = getDerived().TransformType(oldType->getEquivalentType());
5392     if (equivalentType.isNull())
5393       return QualType();
5394     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5395                                                modifiedType,
5396                                                equivalentType);
5397   }
5398 
5399   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5400   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5401   if (TL.hasAttrOperand())
5402     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5403   if (TL.hasAttrExprOperand())
5404     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5405   else if (TL.hasAttrEnumOperand())
5406     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5407 
5408   return result;
5409 }
5410 
5411 template<typename Derived>
5412 QualType
TransformParenType(TypeLocBuilder & TLB,ParenTypeLoc TL)5413 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5414                                            ParenTypeLoc TL) {
5415   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5416   if (Inner.isNull())
5417     return QualType();
5418 
5419   QualType Result = TL.getType();
5420   if (getDerived().AlwaysRebuild() ||
5421       Inner != TL.getInnerLoc().getType()) {
5422     Result = getDerived().RebuildParenType(Inner);
5423     if (Result.isNull())
5424       return QualType();
5425   }
5426 
5427   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5428   NewTL.setLParenLoc(TL.getLParenLoc());
5429   NewTL.setRParenLoc(TL.getRParenLoc());
5430   return Result;
5431 }
5432 
5433 template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL)5434 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5435                                                       DependentNameTypeLoc TL) {
5436   const DependentNameType *T = TL.getTypePtr();
5437 
5438   NestedNameSpecifierLoc QualifierLoc
5439     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5440   if (!QualifierLoc)
5441     return QualType();
5442 
5443   QualType Result
5444     = getDerived().RebuildDependentNameType(T->getKeyword(),
5445                                             TL.getElaboratedKeywordLoc(),
5446                                             QualifierLoc,
5447                                             T->getIdentifier(),
5448                                             TL.getNameLoc());
5449   if (Result.isNull())
5450     return QualType();
5451 
5452   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5453     QualType NamedT = ElabT->getNamedType();
5454     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5455 
5456     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5457     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5458     NewTL.setQualifierLoc(QualifierLoc);
5459   } else {
5460     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5461     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5462     NewTL.setQualifierLoc(QualifierLoc);
5463     NewTL.setNameLoc(TL.getNameLoc());
5464   }
5465   return Result;
5466 }
5467 
5468 template<typename Derived>
5469 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL)5470           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5471                                  DependentTemplateSpecializationTypeLoc TL) {
5472   NestedNameSpecifierLoc QualifierLoc;
5473   if (TL.getQualifierLoc()) {
5474     QualifierLoc
5475       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5476     if (!QualifierLoc)
5477       return QualType();
5478   }
5479 
5480   return getDerived()
5481            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5482 }
5483 
5484 template<typename Derived>
5485 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,NestedNameSpecifierLoc QualifierLoc)5486 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5487                                    DependentTemplateSpecializationTypeLoc TL,
5488                                        NestedNameSpecifierLoc QualifierLoc) {
5489   const DependentTemplateSpecializationType *T = TL.getTypePtr();
5490 
5491   TemplateArgumentListInfo NewTemplateArgs;
5492   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5493   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5494 
5495   typedef TemplateArgumentLocContainerIterator<
5496   DependentTemplateSpecializationTypeLoc> ArgIterator;
5497   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5498                                               ArgIterator(TL, TL.getNumArgs()),
5499                                               NewTemplateArgs))
5500     return QualType();
5501 
5502   QualType Result
5503     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5504                                                               QualifierLoc,
5505                                                             T->getIdentifier(),
5506                                                        TL.getTemplateNameLoc(),
5507                                                             NewTemplateArgs);
5508   if (Result.isNull())
5509     return QualType();
5510 
5511   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5512     QualType NamedT = ElabT->getNamedType();
5513 
5514     // Copy information relevant to the template specialization.
5515     TemplateSpecializationTypeLoc NamedTL
5516       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5517     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5518     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5519     NamedTL.setLAngleLoc(TL.getLAngleLoc());
5520     NamedTL.setRAngleLoc(TL.getRAngleLoc());
5521     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5522       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5523 
5524     // Copy information relevant to the elaborated type.
5525     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5526     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5527     NewTL.setQualifierLoc(QualifierLoc);
5528   } else if (isa<DependentTemplateSpecializationType>(Result)) {
5529     DependentTemplateSpecializationTypeLoc SpecTL
5530       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5531     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5532     SpecTL.setQualifierLoc(QualifierLoc);
5533     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5534     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5535     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5536     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5537     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5538       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5539   } else {
5540     TemplateSpecializationTypeLoc SpecTL
5541       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5542     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5543     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5544     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5545     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5546     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5547       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5548   }
5549   return Result;
5550 }
5551 
5552 template<typename Derived>
TransformPackExpansionType(TypeLocBuilder & TLB,PackExpansionTypeLoc TL)5553 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5554                                                       PackExpansionTypeLoc TL) {
5555   QualType Pattern
5556     = getDerived().TransformType(TLB, TL.getPatternLoc());
5557   if (Pattern.isNull())
5558     return QualType();
5559 
5560   QualType Result = TL.getType();
5561   if (getDerived().AlwaysRebuild() ||
5562       Pattern != TL.getPatternLoc().getType()) {
5563     Result = getDerived().RebuildPackExpansionType(Pattern,
5564                                            TL.getPatternLoc().getSourceRange(),
5565                                                    TL.getEllipsisLoc(),
5566                                            TL.getTypePtr()->getNumExpansions());
5567     if (Result.isNull())
5568       return QualType();
5569   }
5570 
5571   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5572   NewT.setEllipsisLoc(TL.getEllipsisLoc());
5573   return Result;
5574 }
5575 
5576 template<typename Derived>
5577 QualType
TransformObjCInterfaceType(TypeLocBuilder & TLB,ObjCInterfaceTypeLoc TL)5578 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5579                                                    ObjCInterfaceTypeLoc TL) {
5580   // ObjCInterfaceType is never dependent.
5581   TLB.pushFullCopy(TL);
5582   return TL.getType();
5583 }
5584 
5585 template<typename Derived>
5586 QualType
TransformObjCObjectType(TypeLocBuilder & TLB,ObjCObjectTypeLoc TL)5587 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
5588                                                 ObjCObjectTypeLoc TL) {
5589   // ObjCObjectType is never dependent.
5590   TLB.pushFullCopy(TL);
5591   return TL.getType();
5592 }
5593 
5594 template<typename Derived>
5595 QualType
TransformObjCObjectPointerType(TypeLocBuilder & TLB,ObjCObjectPointerTypeLoc TL)5596 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
5597                                                ObjCObjectPointerTypeLoc TL) {
5598   // ObjCObjectPointerType is never dependent.
5599   TLB.pushFullCopy(TL);
5600   return TL.getType();
5601 }
5602 
5603 //===----------------------------------------------------------------------===//
5604 // Statement transformation
5605 //===----------------------------------------------------------------------===//
5606 template<typename Derived>
5607 StmtResult
TransformNullStmt(NullStmt * S)5608 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
5609   return S;
5610 }
5611 
5612 template<typename Derived>
5613 StmtResult
TransformCompoundStmt(CompoundStmt * S)5614 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
5615   return getDerived().TransformCompoundStmt(S, false);
5616 }
5617 
5618 template<typename Derived>
5619 StmtResult
TransformCompoundStmt(CompoundStmt * S,bool IsStmtExpr)5620 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
5621                                               bool IsStmtExpr) {
5622   Sema::CompoundScopeRAII CompoundScope(getSema());
5623 
5624   bool SubStmtInvalid = false;
5625   bool SubStmtChanged = false;
5626   SmallVector<Stmt*, 8> Statements;
5627   for (auto *B : S->body()) {
5628     StmtResult Result = getDerived().TransformStmt(B);
5629     if (Result.isInvalid()) {
5630       // Immediately fail if this was a DeclStmt, since it's very
5631       // likely that this will cause problems for future statements.
5632       if (isa<DeclStmt>(B))
5633         return StmtError();
5634 
5635       // Otherwise, just keep processing substatements and fail later.
5636       SubStmtInvalid = true;
5637       continue;
5638     }
5639 
5640     SubStmtChanged = SubStmtChanged || Result.get() != B;
5641     Statements.push_back(Result.getAs<Stmt>());
5642   }
5643 
5644   if (SubStmtInvalid)
5645     return StmtError();
5646 
5647   if (!getDerived().AlwaysRebuild() &&
5648       !SubStmtChanged)
5649     return S;
5650 
5651   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
5652                                           Statements,
5653                                           S->getRBracLoc(),
5654                                           IsStmtExpr);
5655 }
5656 
5657 template<typename Derived>
5658 StmtResult
TransformCaseStmt(CaseStmt * S)5659 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
5660   ExprResult LHS, RHS;
5661   {
5662     EnterExpressionEvaluationContext Unevaluated(SemaRef,
5663                                                  Sema::ConstantEvaluated);
5664 
5665     // Transform the left-hand case value.
5666     LHS = getDerived().TransformExpr(S->getLHS());
5667     LHS = SemaRef.ActOnConstantExpression(LHS);
5668     if (LHS.isInvalid())
5669       return StmtError();
5670 
5671     // Transform the right-hand case value (for the GNU case-range extension).
5672     RHS = getDerived().TransformExpr(S->getRHS());
5673     RHS = SemaRef.ActOnConstantExpression(RHS);
5674     if (RHS.isInvalid())
5675       return StmtError();
5676   }
5677 
5678   // Build the case statement.
5679   // Case statements are always rebuilt so that they will attached to their
5680   // transformed switch statement.
5681   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
5682                                                        LHS.get(),
5683                                                        S->getEllipsisLoc(),
5684                                                        RHS.get(),
5685                                                        S->getColonLoc());
5686   if (Case.isInvalid())
5687     return StmtError();
5688 
5689   // Transform the statement following the case
5690   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5691   if (SubStmt.isInvalid())
5692     return StmtError();
5693 
5694   // Attach the body to the case statement
5695   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
5696 }
5697 
5698 template<typename Derived>
5699 StmtResult
TransformDefaultStmt(DefaultStmt * S)5700 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
5701   // Transform the statement following the default case
5702   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5703   if (SubStmt.isInvalid())
5704     return StmtError();
5705 
5706   // Default statements are always rebuilt
5707   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
5708                                          SubStmt.get());
5709 }
5710 
5711 template<typename Derived>
5712 StmtResult
TransformLabelStmt(LabelStmt * S)5713 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
5714   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5715   if (SubStmt.isInvalid())
5716     return StmtError();
5717 
5718   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
5719                                         S->getDecl());
5720   if (!LD)
5721     return StmtError();
5722 
5723 
5724   // FIXME: Pass the real colon location in.
5725   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
5726                                        cast<LabelDecl>(LD), SourceLocation(),
5727                                        SubStmt.get());
5728 }
5729 
5730 template <typename Derived>
TransformAttr(const Attr * R)5731 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
5732   if (!R)
5733     return R;
5734 
5735   switch (R->getKind()) {
5736 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
5737 #define ATTR(X)
5738 #define PRAGMA_SPELLING_ATTR(X)                                                \
5739   case attr::X:                                                                \
5740     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
5741 #include "clang/Basic/AttrList.inc"
5742   default:
5743     return R;
5744   }
5745 }
5746 
5747 template <typename Derived>
TransformAttributedStmt(AttributedStmt * S)5748 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
5749   bool AttrsChanged = false;
5750   SmallVector<const Attr *, 1> Attrs;
5751 
5752   // Visit attributes and keep track if any are transformed.
5753   for (const auto *I : S->getAttrs()) {
5754     const Attr *R = getDerived().TransformAttr(I);
5755     AttrsChanged |= (I != R);
5756     Attrs.push_back(R);
5757   }
5758 
5759   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5760   if (SubStmt.isInvalid())
5761     return StmtError();
5762 
5763   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
5764     return S;
5765 
5766   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
5767                                             SubStmt.get());
5768 }
5769 
5770 template<typename Derived>
5771 StmtResult
TransformIfStmt(IfStmt * S)5772 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
5773   // Transform the condition
5774   ExprResult Cond;
5775   VarDecl *ConditionVar = nullptr;
5776   if (S->getConditionVariable()) {
5777     ConditionVar
5778       = cast_or_null<VarDecl>(
5779                    getDerived().TransformDefinition(
5780                                       S->getConditionVariable()->getLocation(),
5781                                                     S->getConditionVariable()));
5782     if (!ConditionVar)
5783       return StmtError();
5784   } else {
5785     Cond = getDerived().TransformExpr(S->getCond());
5786 
5787     if (Cond.isInvalid())
5788       return StmtError();
5789 
5790     // Convert the condition to a boolean value.
5791     if (S->getCond()) {
5792       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, S->getIfLoc(),
5793                                                          Cond.get());
5794       if (CondE.isInvalid())
5795         return StmtError();
5796 
5797       Cond = CondE.get();
5798     }
5799   }
5800 
5801   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5802   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5803     return StmtError();
5804 
5805   // Transform the "then" branch.
5806   StmtResult Then = getDerived().TransformStmt(S->getThen());
5807   if (Then.isInvalid())
5808     return StmtError();
5809 
5810   // Transform the "else" branch.
5811   StmtResult Else = getDerived().TransformStmt(S->getElse());
5812   if (Else.isInvalid())
5813     return StmtError();
5814 
5815   if (!getDerived().AlwaysRebuild() &&
5816       FullCond.get() == S->getCond() &&
5817       ConditionVar == S->getConditionVariable() &&
5818       Then.get() == S->getThen() &&
5819       Else.get() == S->getElse())
5820     return S;
5821 
5822   return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
5823                                     Then.get(),
5824                                     S->getElseLoc(), Else.get());
5825 }
5826 
5827 template<typename Derived>
5828 StmtResult
TransformSwitchStmt(SwitchStmt * S)5829 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
5830   // Transform the condition.
5831   ExprResult Cond;
5832   VarDecl *ConditionVar = nullptr;
5833   if (S->getConditionVariable()) {
5834     ConditionVar
5835       = cast_or_null<VarDecl>(
5836                    getDerived().TransformDefinition(
5837                                       S->getConditionVariable()->getLocation(),
5838                                                     S->getConditionVariable()));
5839     if (!ConditionVar)
5840       return StmtError();
5841   } else {
5842     Cond = getDerived().TransformExpr(S->getCond());
5843 
5844     if (Cond.isInvalid())
5845       return StmtError();
5846   }
5847 
5848   // Rebuild the switch statement.
5849   StmtResult Switch
5850     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
5851                                           ConditionVar);
5852   if (Switch.isInvalid())
5853     return StmtError();
5854 
5855   // Transform the body of the switch statement.
5856   StmtResult Body = getDerived().TransformStmt(S->getBody());
5857   if (Body.isInvalid())
5858     return StmtError();
5859 
5860   // Complete the switch statement.
5861   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
5862                                             Body.get());
5863 }
5864 
5865 template<typename Derived>
5866 StmtResult
TransformWhileStmt(WhileStmt * S)5867 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
5868   // Transform the condition
5869   ExprResult Cond;
5870   VarDecl *ConditionVar = nullptr;
5871   if (S->getConditionVariable()) {
5872     ConditionVar
5873       = cast_or_null<VarDecl>(
5874                    getDerived().TransformDefinition(
5875                                       S->getConditionVariable()->getLocation(),
5876                                                     S->getConditionVariable()));
5877     if (!ConditionVar)
5878       return StmtError();
5879   } else {
5880     Cond = getDerived().TransformExpr(S->getCond());
5881 
5882     if (Cond.isInvalid())
5883       return StmtError();
5884 
5885     if (S->getCond()) {
5886       // Convert the condition to a boolean value.
5887       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5888                                                          S->getWhileLoc(),
5889                                                          Cond.get());
5890       if (CondE.isInvalid())
5891         return StmtError();
5892       Cond = CondE;
5893     }
5894   }
5895 
5896   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5897   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5898     return StmtError();
5899 
5900   // Transform the body
5901   StmtResult Body = getDerived().TransformStmt(S->getBody());
5902   if (Body.isInvalid())
5903     return StmtError();
5904 
5905   if (!getDerived().AlwaysRebuild() &&
5906       FullCond.get() == S->getCond() &&
5907       ConditionVar == S->getConditionVariable() &&
5908       Body.get() == S->getBody())
5909     return Owned(S);
5910 
5911   return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
5912                                        ConditionVar, Body.get());
5913 }
5914 
5915 template<typename Derived>
5916 StmtResult
TransformDoStmt(DoStmt * S)5917 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
5918   // Transform the body
5919   StmtResult Body = getDerived().TransformStmt(S->getBody());
5920   if (Body.isInvalid())
5921     return StmtError();
5922 
5923   // Transform the condition
5924   ExprResult Cond = getDerived().TransformExpr(S->getCond());
5925   if (Cond.isInvalid())
5926     return StmtError();
5927 
5928   if (!getDerived().AlwaysRebuild() &&
5929       Cond.get() == S->getCond() &&
5930       Body.get() == S->getBody())
5931     return S;
5932 
5933   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
5934                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
5935                                     S->getRParenLoc());
5936 }
5937 
5938 template<typename Derived>
5939 StmtResult
TransformForStmt(ForStmt * S)5940 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
5941   // Transform the initialization statement
5942   StmtResult Init = getDerived().TransformStmt(S->getInit());
5943   if (Init.isInvalid())
5944     return StmtError();
5945 
5946   // Transform the condition
5947   ExprResult Cond;
5948   VarDecl *ConditionVar = nullptr;
5949   if (S->getConditionVariable()) {
5950     ConditionVar
5951       = cast_or_null<VarDecl>(
5952                    getDerived().TransformDefinition(
5953                                       S->getConditionVariable()->getLocation(),
5954                                                     S->getConditionVariable()));
5955     if (!ConditionVar)
5956       return StmtError();
5957   } else {
5958     Cond = getDerived().TransformExpr(S->getCond());
5959 
5960     if (Cond.isInvalid())
5961       return StmtError();
5962 
5963     if (S->getCond()) {
5964       // Convert the condition to a boolean value.
5965       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5966                                                          S->getForLoc(),
5967                                                          Cond.get());
5968       if (CondE.isInvalid())
5969         return StmtError();
5970 
5971       Cond = CondE.get();
5972     }
5973   }
5974 
5975   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5976   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5977     return StmtError();
5978 
5979   // Transform the increment
5980   ExprResult Inc = getDerived().TransformExpr(S->getInc());
5981   if (Inc.isInvalid())
5982     return StmtError();
5983 
5984   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
5985   if (S->getInc() && !FullInc.get())
5986     return StmtError();
5987 
5988   // Transform the body
5989   StmtResult Body = getDerived().TransformStmt(S->getBody());
5990   if (Body.isInvalid())
5991     return StmtError();
5992 
5993   if (!getDerived().AlwaysRebuild() &&
5994       Init.get() == S->getInit() &&
5995       FullCond.get() == S->getCond() &&
5996       Inc.get() == S->getInc() &&
5997       Body.get() == S->getBody())
5998     return S;
5999 
6000   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6001                                      Init.get(), FullCond, ConditionVar,
6002                                      FullInc, S->getRParenLoc(), Body.get());
6003 }
6004 
6005 template<typename Derived>
6006 StmtResult
TransformGotoStmt(GotoStmt * S)6007 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6008   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6009                                         S->getLabel());
6010   if (!LD)
6011     return StmtError();
6012 
6013   // Goto statements must always be rebuilt, to resolve the label.
6014   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6015                                       cast<LabelDecl>(LD));
6016 }
6017 
6018 template<typename Derived>
6019 StmtResult
TransformIndirectGotoStmt(IndirectGotoStmt * S)6020 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6021   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6022   if (Target.isInvalid())
6023     return StmtError();
6024   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6025 
6026   if (!getDerived().AlwaysRebuild() &&
6027       Target.get() == S->getTarget())
6028     return S;
6029 
6030   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6031                                               Target.get());
6032 }
6033 
6034 template<typename Derived>
6035 StmtResult
TransformContinueStmt(ContinueStmt * S)6036 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6037   return S;
6038 }
6039 
6040 template<typename Derived>
6041 StmtResult
TransformBreakStmt(BreakStmt * S)6042 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6043   return S;
6044 }
6045 
6046 template<typename Derived>
6047 StmtResult
TransformReturnStmt(ReturnStmt * S)6048 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6049   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6050                                                         /*NotCopyInit*/false);
6051   if (Result.isInvalid())
6052     return StmtError();
6053 
6054   // FIXME: We always rebuild the return statement because there is no way
6055   // to tell whether the return type of the function has changed.
6056   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6057 }
6058 
6059 template<typename Derived>
6060 StmtResult
TransformDeclStmt(DeclStmt * S)6061 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6062   bool DeclChanged = false;
6063   SmallVector<Decl *, 4> Decls;
6064   for (auto *D : S->decls()) {
6065     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6066     if (!Transformed)
6067       return StmtError();
6068 
6069     if (Transformed != D)
6070       DeclChanged = true;
6071 
6072     Decls.push_back(Transformed);
6073   }
6074 
6075   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6076     return S;
6077 
6078   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6079 }
6080 
6081 template<typename Derived>
6082 StmtResult
TransformGCCAsmStmt(GCCAsmStmt * S)6083 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6084 
6085   SmallVector<Expr*, 8> Constraints;
6086   SmallVector<Expr*, 8> Exprs;
6087   SmallVector<IdentifierInfo *, 4> Names;
6088 
6089   ExprResult AsmString;
6090   SmallVector<Expr*, 8> Clobbers;
6091 
6092   bool ExprsChanged = false;
6093 
6094   // Go through the outputs.
6095   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6096     Names.push_back(S->getOutputIdentifier(I));
6097 
6098     // No need to transform the constraint literal.
6099     Constraints.push_back(S->getOutputConstraintLiteral(I));
6100 
6101     // Transform the output expr.
6102     Expr *OutputExpr = S->getOutputExpr(I);
6103     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6104     if (Result.isInvalid())
6105       return StmtError();
6106 
6107     ExprsChanged |= Result.get() != OutputExpr;
6108 
6109     Exprs.push_back(Result.get());
6110   }
6111 
6112   // Go through the inputs.
6113   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6114     Names.push_back(S->getInputIdentifier(I));
6115 
6116     // No need to transform the constraint literal.
6117     Constraints.push_back(S->getInputConstraintLiteral(I));
6118 
6119     // Transform the input expr.
6120     Expr *InputExpr = S->getInputExpr(I);
6121     ExprResult Result = getDerived().TransformExpr(InputExpr);
6122     if (Result.isInvalid())
6123       return StmtError();
6124 
6125     ExprsChanged |= Result.get() != InputExpr;
6126 
6127     Exprs.push_back(Result.get());
6128   }
6129 
6130   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6131     return S;
6132 
6133   // Go through the clobbers.
6134   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6135     Clobbers.push_back(S->getClobberStringLiteral(I));
6136 
6137   // No need to transform the asm string literal.
6138   AsmString = S->getAsmString();
6139   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6140                                         S->isVolatile(), S->getNumOutputs(),
6141                                         S->getNumInputs(), Names.data(),
6142                                         Constraints, Exprs, AsmString.get(),
6143                                         Clobbers, S->getRParenLoc());
6144 }
6145 
6146 template<typename Derived>
6147 StmtResult
TransformMSAsmStmt(MSAsmStmt * S)6148 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6149   ArrayRef<Token> AsmToks =
6150     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6151 
6152   bool HadError = false, HadChange = false;
6153 
6154   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6155   SmallVector<Expr*, 8> TransformedExprs;
6156   TransformedExprs.reserve(SrcExprs.size());
6157   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6158     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6159     if (!Result.isUsable()) {
6160       HadError = true;
6161     } else {
6162       HadChange |= (Result.get() != SrcExprs[i]);
6163       TransformedExprs.push_back(Result.get());
6164     }
6165   }
6166 
6167   if (HadError) return StmtError();
6168   if (!HadChange && !getDerived().AlwaysRebuild())
6169     return Owned(S);
6170 
6171   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6172                                        AsmToks, S->getAsmString(),
6173                                        S->getNumOutputs(), S->getNumInputs(),
6174                                        S->getAllConstraints(), S->getClobbers(),
6175                                        TransformedExprs, S->getEndLoc());
6176 }
6177 
6178 template<typename Derived>
6179 StmtResult
TransformObjCAtTryStmt(ObjCAtTryStmt * S)6180 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
6181   // Transform the body of the @try.
6182   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
6183   if (TryBody.isInvalid())
6184     return StmtError();
6185 
6186   // Transform the @catch statements (if present).
6187   bool AnyCatchChanged = false;
6188   SmallVector<Stmt*, 8> CatchStmts;
6189   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
6190     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
6191     if (Catch.isInvalid())
6192       return StmtError();
6193     if (Catch.get() != S->getCatchStmt(I))
6194       AnyCatchChanged = true;
6195     CatchStmts.push_back(Catch.get());
6196   }
6197 
6198   // Transform the @finally statement (if present).
6199   StmtResult Finally;
6200   if (S->getFinallyStmt()) {
6201     Finally = getDerived().TransformStmt(S->getFinallyStmt());
6202     if (Finally.isInvalid())
6203       return StmtError();
6204   }
6205 
6206   // If nothing changed, just retain this statement.
6207   if (!getDerived().AlwaysRebuild() &&
6208       TryBody.get() == S->getTryBody() &&
6209       !AnyCatchChanged &&
6210       Finally.get() == S->getFinallyStmt())
6211     return S;
6212 
6213   // Build a new statement.
6214   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
6215                                            CatchStmts, Finally.get());
6216 }
6217 
6218 template<typename Derived>
6219 StmtResult
TransformObjCAtCatchStmt(ObjCAtCatchStmt * S)6220 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6221   // Transform the @catch parameter, if there is one.
6222   VarDecl *Var = nullptr;
6223   if (VarDecl *FromVar = S->getCatchParamDecl()) {
6224     TypeSourceInfo *TSInfo = nullptr;
6225     if (FromVar->getTypeSourceInfo()) {
6226       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
6227       if (!TSInfo)
6228         return StmtError();
6229     }
6230 
6231     QualType T;
6232     if (TSInfo)
6233       T = TSInfo->getType();
6234     else {
6235       T = getDerived().TransformType(FromVar->getType());
6236       if (T.isNull())
6237         return StmtError();
6238     }
6239 
6240     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
6241     if (!Var)
6242       return StmtError();
6243   }
6244 
6245   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
6246   if (Body.isInvalid())
6247     return StmtError();
6248 
6249   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
6250                                              S->getRParenLoc(),
6251                                              Var, Body.get());
6252 }
6253 
6254 template<typename Derived>
6255 StmtResult
TransformObjCAtFinallyStmt(ObjCAtFinallyStmt * S)6256 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6257   // Transform the body.
6258   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
6259   if (Body.isInvalid())
6260     return StmtError();
6261 
6262   // If nothing changed, just retain this statement.
6263   if (!getDerived().AlwaysRebuild() &&
6264       Body.get() == S->getFinallyBody())
6265     return S;
6266 
6267   // Build a new statement.
6268   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6269                                                Body.get());
6270 }
6271 
6272 template<typename Derived>
6273 StmtResult
TransformObjCAtThrowStmt(ObjCAtThrowStmt * S)6274 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6275   ExprResult Operand;
6276   if (S->getThrowExpr()) {
6277     Operand = getDerived().TransformExpr(S->getThrowExpr());
6278     if (Operand.isInvalid())
6279       return StmtError();
6280   }
6281 
6282   if (!getDerived().AlwaysRebuild() &&
6283       Operand.get() == S->getThrowExpr())
6284     return S;
6285 
6286   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6287 }
6288 
6289 template<typename Derived>
6290 StmtResult
TransformObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)6291 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6292                                                   ObjCAtSynchronizedStmt *S) {
6293   // Transform the object we are locking.
6294   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6295   if (Object.isInvalid())
6296     return StmtError();
6297   Object =
6298     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6299                                                   Object.get());
6300   if (Object.isInvalid())
6301     return StmtError();
6302 
6303   // Transform the body.
6304   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6305   if (Body.isInvalid())
6306     return StmtError();
6307 
6308   // If nothing change, just retain the current statement.
6309   if (!getDerived().AlwaysRebuild() &&
6310       Object.get() == S->getSynchExpr() &&
6311       Body.get() == S->getSynchBody())
6312     return S;
6313 
6314   // Build a new statement.
6315   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6316                                                     Object.get(), Body.get());
6317 }
6318 
6319 template<typename Derived>
6320 StmtResult
TransformObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)6321 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6322                                               ObjCAutoreleasePoolStmt *S) {
6323   // Transform the body.
6324   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6325   if (Body.isInvalid())
6326     return StmtError();
6327 
6328   // If nothing changed, just retain this statement.
6329   if (!getDerived().AlwaysRebuild() &&
6330       Body.get() == S->getSubStmt())
6331     return S;
6332 
6333   // Build a new statement.
6334   return getDerived().RebuildObjCAutoreleasePoolStmt(
6335                         S->getAtLoc(), Body.get());
6336 }
6337 
6338 template<typename Derived>
6339 StmtResult
TransformObjCForCollectionStmt(ObjCForCollectionStmt * S)6340 TreeTransform<Derived>::TransformObjCForCollectionStmt(
6341                                                   ObjCForCollectionStmt *S) {
6342   // Transform the element statement.
6343   StmtResult Element = getDerived().TransformStmt(S->getElement());
6344   if (Element.isInvalid())
6345     return StmtError();
6346 
6347   // Transform the collection expression.
6348   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6349   if (Collection.isInvalid())
6350     return StmtError();
6351 
6352   // Transform the body.
6353   StmtResult Body = getDerived().TransformStmt(S->getBody());
6354   if (Body.isInvalid())
6355     return StmtError();
6356 
6357   // If nothing changed, just retain this statement.
6358   if (!getDerived().AlwaysRebuild() &&
6359       Element.get() == S->getElement() &&
6360       Collection.get() == S->getCollection() &&
6361       Body.get() == S->getBody())
6362     return S;
6363 
6364   // Build a new statement.
6365   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6366                                                    Element.get(),
6367                                                    Collection.get(),
6368                                                    S->getRParenLoc(),
6369                                                    Body.get());
6370 }
6371 
6372 template <typename Derived>
TransformCXXCatchStmt(CXXCatchStmt * S)6373 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6374   // Transform the exception declaration, if any.
6375   VarDecl *Var = nullptr;
6376   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6377     TypeSourceInfo *T =
6378         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6379     if (!T)
6380       return StmtError();
6381 
6382     Var = getDerived().RebuildExceptionDecl(
6383         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6384         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6385     if (!Var || Var->isInvalidDecl())
6386       return StmtError();
6387   }
6388 
6389   // Transform the actual exception handler.
6390   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6391   if (Handler.isInvalid())
6392     return StmtError();
6393 
6394   if (!getDerived().AlwaysRebuild() && !Var &&
6395       Handler.get() == S->getHandlerBlock())
6396     return S;
6397 
6398   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6399 }
6400 
6401 template <typename Derived>
TransformCXXTryStmt(CXXTryStmt * S)6402 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6403   // Transform the try block itself.
6404   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6405   if (TryBlock.isInvalid())
6406     return StmtError();
6407 
6408   // Transform the handlers.
6409   bool HandlerChanged = false;
6410   SmallVector<Stmt *, 8> Handlers;
6411   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6412     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6413     if (Handler.isInvalid())
6414       return StmtError();
6415 
6416     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6417     Handlers.push_back(Handler.getAs<Stmt>());
6418   }
6419 
6420   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6421       !HandlerChanged)
6422     return S;
6423 
6424   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6425                                         Handlers);
6426 }
6427 
6428 template<typename Derived>
6429 StmtResult
TransformCXXForRangeStmt(CXXForRangeStmt * S)6430 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6431   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6432   if (Range.isInvalid())
6433     return StmtError();
6434 
6435   StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt());
6436   if (BeginEnd.isInvalid())
6437     return StmtError();
6438 
6439   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6440   if (Cond.isInvalid())
6441     return StmtError();
6442   if (Cond.get())
6443     Cond = SemaRef.CheckBooleanCondition(Cond.get(), S->getColonLoc());
6444   if (Cond.isInvalid())
6445     return StmtError();
6446   if (Cond.get())
6447     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6448 
6449   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6450   if (Inc.isInvalid())
6451     return StmtError();
6452   if (Inc.get())
6453     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6454 
6455   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6456   if (LoopVar.isInvalid())
6457     return StmtError();
6458 
6459   StmtResult NewStmt = S;
6460   if (getDerived().AlwaysRebuild() ||
6461       Range.get() != S->getRangeStmt() ||
6462       BeginEnd.get() != S->getBeginEndStmt() ||
6463       Cond.get() != S->getCond() ||
6464       Inc.get() != S->getInc() ||
6465       LoopVar.get() != S->getLoopVarStmt()) {
6466     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6467                                                   S->getColonLoc(), Range.get(),
6468                                                   BeginEnd.get(), Cond.get(),
6469                                                   Inc.get(), LoopVar.get(),
6470                                                   S->getRParenLoc());
6471     if (NewStmt.isInvalid())
6472       return StmtError();
6473   }
6474 
6475   StmtResult Body = getDerived().TransformStmt(S->getBody());
6476   if (Body.isInvalid())
6477     return StmtError();
6478 
6479   // Body has changed but we didn't rebuild the for-range statement. Rebuild
6480   // it now so we have a new statement to attach the body to.
6481   if (Body.get() != S->getBody() && NewStmt.get() == S) {
6482     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6483                                                   S->getColonLoc(), Range.get(),
6484                                                   BeginEnd.get(), Cond.get(),
6485                                                   Inc.get(), LoopVar.get(),
6486                                                   S->getRParenLoc());
6487     if (NewStmt.isInvalid())
6488       return StmtError();
6489   }
6490 
6491   if (NewStmt.get() == S)
6492     return S;
6493 
6494   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
6495 }
6496 
6497 template<typename Derived>
6498 StmtResult
TransformMSDependentExistsStmt(MSDependentExistsStmt * S)6499 TreeTransform<Derived>::TransformMSDependentExistsStmt(
6500                                                     MSDependentExistsStmt *S) {
6501   // Transform the nested-name-specifier, if any.
6502   NestedNameSpecifierLoc QualifierLoc;
6503   if (S->getQualifierLoc()) {
6504     QualifierLoc
6505       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
6506     if (!QualifierLoc)
6507       return StmtError();
6508   }
6509 
6510   // Transform the declaration name.
6511   DeclarationNameInfo NameInfo = S->getNameInfo();
6512   if (NameInfo.getName()) {
6513     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
6514     if (!NameInfo.getName())
6515       return StmtError();
6516   }
6517 
6518   // Check whether anything changed.
6519   if (!getDerived().AlwaysRebuild() &&
6520       QualifierLoc == S->getQualifierLoc() &&
6521       NameInfo.getName() == S->getNameInfo().getName())
6522     return S;
6523 
6524   // Determine whether this name exists, if we can.
6525   CXXScopeSpec SS;
6526   SS.Adopt(QualifierLoc);
6527   bool Dependent = false;
6528   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
6529   case Sema::IER_Exists:
6530     if (S->isIfExists())
6531       break;
6532 
6533     return new (getSema().Context) NullStmt(S->getKeywordLoc());
6534 
6535   case Sema::IER_DoesNotExist:
6536     if (S->isIfNotExists())
6537       break;
6538 
6539     return new (getSema().Context) NullStmt(S->getKeywordLoc());
6540 
6541   case Sema::IER_Dependent:
6542     Dependent = true;
6543     break;
6544 
6545   case Sema::IER_Error:
6546     return StmtError();
6547   }
6548 
6549   // We need to continue with the instantiation, so do so now.
6550   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
6551   if (SubStmt.isInvalid())
6552     return StmtError();
6553 
6554   // If we have resolved the name, just transform to the substatement.
6555   if (!Dependent)
6556     return SubStmt;
6557 
6558   // The name is still dependent, so build a dependent expression again.
6559   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
6560                                                    S->isIfExists(),
6561                                                    QualifierLoc,
6562                                                    NameInfo,
6563                                                    SubStmt.get());
6564 }
6565 
6566 template<typename Derived>
6567 ExprResult
TransformMSPropertyRefExpr(MSPropertyRefExpr * E)6568 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
6569   NestedNameSpecifierLoc QualifierLoc;
6570   if (E->getQualifierLoc()) {
6571     QualifierLoc
6572     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
6573     if (!QualifierLoc)
6574       return ExprError();
6575   }
6576 
6577   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
6578     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
6579   if (!PD)
6580     return ExprError();
6581 
6582   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
6583   if (Base.isInvalid())
6584     return ExprError();
6585 
6586   return new (SemaRef.getASTContext())
6587       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
6588                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
6589                         QualifierLoc, E->getMemberLoc());
6590 }
6591 
6592 template <typename Derived>
TransformSEHTryStmt(SEHTryStmt * S)6593 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
6594   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6595   if (TryBlock.isInvalid())
6596     return StmtError();
6597 
6598   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
6599   if (Handler.isInvalid())
6600     return StmtError();
6601 
6602   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6603       Handler.get() == S->getHandler())
6604     return S;
6605 
6606   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
6607                                         TryBlock.get(), Handler.get());
6608 }
6609 
6610 template <typename Derived>
TransformSEHFinallyStmt(SEHFinallyStmt * S)6611 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
6612   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6613   if (Block.isInvalid())
6614     return StmtError();
6615 
6616   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
6617 }
6618 
6619 template <typename Derived>
TransformSEHExceptStmt(SEHExceptStmt * S)6620 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
6621   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
6622   if (FilterExpr.isInvalid())
6623     return StmtError();
6624 
6625   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6626   if (Block.isInvalid())
6627     return StmtError();
6628 
6629   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
6630                                            Block.get());
6631 }
6632 
6633 template <typename Derived>
TransformSEHHandler(Stmt * Handler)6634 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
6635   if (isa<SEHFinallyStmt>(Handler))
6636     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
6637   else
6638     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
6639 }
6640 
6641 template<typename Derived>
6642 StmtResult
TransformSEHLeaveStmt(SEHLeaveStmt * S)6643 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
6644   return S;
6645 }
6646 
6647 //===----------------------------------------------------------------------===//
6648 // OpenMP directive transformation
6649 //===----------------------------------------------------------------------===//
6650 template <typename Derived>
TransformOMPExecutableDirective(OMPExecutableDirective * D)6651 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
6652     OMPExecutableDirective *D) {
6653 
6654   // Transform the clauses
6655   llvm::SmallVector<OMPClause *, 16> TClauses;
6656   ArrayRef<OMPClause *> Clauses = D->clauses();
6657   TClauses.reserve(Clauses.size());
6658   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
6659        I != E; ++I) {
6660     if (*I) {
6661       OMPClause *Clause = getDerived().TransformOMPClause(*I);
6662       if (Clause)
6663         TClauses.push_back(Clause);
6664     } else {
6665       TClauses.push_back(nullptr);
6666     }
6667   }
6668   StmtResult AssociatedStmt;
6669   if (D->hasAssociatedStmt()) {
6670     if (!D->getAssociatedStmt()) {
6671       return StmtError();
6672     }
6673     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
6674                                                   /*CurScope=*/nullptr);
6675     StmtResult Body;
6676     {
6677       Sema::CompoundScopeRAII CompoundScope(getSema());
6678       Body = getDerived().TransformStmt(
6679           cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt());
6680     }
6681     AssociatedStmt =
6682         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
6683     if (AssociatedStmt.isInvalid()) {
6684       return StmtError();
6685     }
6686   }
6687   if (TClauses.size() != Clauses.size()) {
6688     return StmtError();
6689   }
6690 
6691   // Transform directive name for 'omp critical' directive.
6692   DeclarationNameInfo DirName;
6693   if (D->getDirectiveKind() == OMPD_critical) {
6694     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
6695     DirName = getDerived().TransformDeclarationNameInfo(DirName);
6696   }
6697 
6698   return getDerived().RebuildOMPExecutableDirective(
6699       D->getDirectiveKind(), DirName, TClauses, AssociatedStmt.get(),
6700       D->getLocStart(), D->getLocEnd());
6701 }
6702 
6703 template <typename Derived>
6704 StmtResult
TransformOMPParallelDirective(OMPParallelDirective * D)6705 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
6706   DeclarationNameInfo DirName;
6707   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
6708                                              D->getLocStart());
6709   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6710   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6711   return Res;
6712 }
6713 
6714 template <typename Derived>
6715 StmtResult
TransformOMPSimdDirective(OMPSimdDirective * D)6716 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
6717   DeclarationNameInfo DirName;
6718   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
6719                                              D->getLocStart());
6720   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6721   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6722   return Res;
6723 }
6724 
6725 template <typename Derived>
6726 StmtResult
TransformOMPForDirective(OMPForDirective * D)6727 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
6728   DeclarationNameInfo DirName;
6729   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
6730                                              D->getLocStart());
6731   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6732   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6733   return Res;
6734 }
6735 
6736 template <typename Derived>
6737 StmtResult
TransformOMPForSimdDirective(OMPForSimdDirective * D)6738 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
6739   DeclarationNameInfo DirName;
6740   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
6741                                              D->getLocStart());
6742   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6743   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6744   return Res;
6745 }
6746 
6747 template <typename Derived>
6748 StmtResult
TransformOMPSectionsDirective(OMPSectionsDirective * D)6749 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
6750   DeclarationNameInfo DirName;
6751   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
6752                                              D->getLocStart());
6753   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6754   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6755   return Res;
6756 }
6757 
6758 template <typename Derived>
6759 StmtResult
TransformOMPSectionDirective(OMPSectionDirective * D)6760 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
6761   DeclarationNameInfo DirName;
6762   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
6763                                              D->getLocStart());
6764   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6765   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6766   return Res;
6767 }
6768 
6769 template <typename Derived>
6770 StmtResult
TransformOMPSingleDirective(OMPSingleDirective * D)6771 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
6772   DeclarationNameInfo DirName;
6773   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
6774                                              D->getLocStart());
6775   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6776   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6777   return Res;
6778 }
6779 
6780 template <typename Derived>
6781 StmtResult
TransformOMPMasterDirective(OMPMasterDirective * D)6782 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
6783   DeclarationNameInfo DirName;
6784   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
6785                                              D->getLocStart());
6786   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6787   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6788   return Res;
6789 }
6790 
6791 template <typename Derived>
6792 StmtResult
TransformOMPCriticalDirective(OMPCriticalDirective * D)6793 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
6794   getDerived().getSema().StartOpenMPDSABlock(
6795       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
6796   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6797   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6798   return Res;
6799 }
6800 
6801 template <typename Derived>
TransformOMPParallelForDirective(OMPParallelForDirective * D)6802 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
6803     OMPParallelForDirective *D) {
6804   DeclarationNameInfo DirName;
6805   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
6806                                              nullptr, D->getLocStart());
6807   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6808   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6809   return Res;
6810 }
6811 
6812 template <typename Derived>
TransformOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)6813 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
6814     OMPParallelForSimdDirective *D) {
6815   DeclarationNameInfo DirName;
6816   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
6817                                              nullptr, D->getLocStart());
6818   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6819   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6820   return Res;
6821 }
6822 
6823 template <typename Derived>
TransformOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)6824 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
6825     OMPParallelSectionsDirective *D) {
6826   DeclarationNameInfo DirName;
6827   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
6828                                              nullptr, D->getLocStart());
6829   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6830   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6831   return Res;
6832 }
6833 
6834 template <typename Derived>
6835 StmtResult
TransformOMPTaskDirective(OMPTaskDirective * D)6836 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
6837   DeclarationNameInfo DirName;
6838   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
6839                                              D->getLocStart());
6840   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6841   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6842   return Res;
6843 }
6844 
6845 template <typename Derived>
TransformOMPTaskyieldDirective(OMPTaskyieldDirective * D)6846 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
6847     OMPTaskyieldDirective *D) {
6848   DeclarationNameInfo DirName;
6849   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
6850                                              D->getLocStart());
6851   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6852   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6853   return Res;
6854 }
6855 
6856 template <typename Derived>
6857 StmtResult
TransformOMPBarrierDirective(OMPBarrierDirective * D)6858 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
6859   DeclarationNameInfo DirName;
6860   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
6861                                              D->getLocStart());
6862   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6863   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6864   return Res;
6865 }
6866 
6867 template <typename Derived>
6868 StmtResult
TransformOMPTaskwaitDirective(OMPTaskwaitDirective * D)6869 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
6870   DeclarationNameInfo DirName;
6871   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
6872                                              D->getLocStart());
6873   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6874   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6875   return Res;
6876 }
6877 
6878 template <typename Derived>
6879 StmtResult
TransformOMPFlushDirective(OMPFlushDirective * D)6880 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
6881   DeclarationNameInfo DirName;
6882   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
6883                                              D->getLocStart());
6884   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6885   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6886   return Res;
6887 }
6888 
6889 template <typename Derived>
6890 StmtResult
TransformOMPOrderedDirective(OMPOrderedDirective * D)6891 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
6892   DeclarationNameInfo DirName;
6893   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
6894                                              D->getLocStart());
6895   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6896   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6897   return Res;
6898 }
6899 
6900 template <typename Derived>
6901 StmtResult
TransformOMPAtomicDirective(OMPAtomicDirective * D)6902 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
6903   DeclarationNameInfo DirName;
6904   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
6905                                              D->getLocStart());
6906   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6907   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6908   return Res;
6909 }
6910 
6911 template <typename Derived>
6912 StmtResult
TransformOMPTargetDirective(OMPTargetDirective * D)6913 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
6914   DeclarationNameInfo DirName;
6915   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
6916                                              D->getLocStart());
6917   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6918   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6919   return Res;
6920 }
6921 
6922 template <typename Derived>
6923 StmtResult
TransformOMPTeamsDirective(OMPTeamsDirective * D)6924 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
6925   DeclarationNameInfo DirName;
6926   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
6927                                              D->getLocStart());
6928   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6929   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6930   return Res;
6931 }
6932 
6933 //===----------------------------------------------------------------------===//
6934 // OpenMP clause transformation
6935 //===----------------------------------------------------------------------===//
6936 template <typename Derived>
TransformOMPIfClause(OMPIfClause * C)6937 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
6938   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
6939   if (Cond.isInvalid())
6940     return nullptr;
6941   return getDerived().RebuildOMPIfClause(Cond.get(), C->getLocStart(),
6942                                          C->getLParenLoc(), C->getLocEnd());
6943 }
6944 
6945 template <typename Derived>
TransformOMPFinalClause(OMPFinalClause * C)6946 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
6947   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
6948   if (Cond.isInvalid())
6949     return nullptr;
6950   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
6951                                             C->getLParenLoc(), C->getLocEnd());
6952 }
6953 
6954 template <typename Derived>
6955 OMPClause *
TransformOMPNumThreadsClause(OMPNumThreadsClause * C)6956 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
6957   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
6958   if (NumThreads.isInvalid())
6959     return nullptr;
6960   return getDerived().RebuildOMPNumThreadsClause(
6961       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6962 }
6963 
6964 template <typename Derived>
6965 OMPClause *
TransformOMPSafelenClause(OMPSafelenClause * C)6966 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
6967   ExprResult E = getDerived().TransformExpr(C->getSafelen());
6968   if (E.isInvalid())
6969     return nullptr;
6970   return getDerived().RebuildOMPSafelenClause(
6971       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6972 }
6973 
6974 template <typename Derived>
6975 OMPClause *
TransformOMPCollapseClause(OMPCollapseClause * C)6976 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
6977   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
6978   if (E.isInvalid())
6979     return 0;
6980   return getDerived().RebuildOMPCollapseClause(
6981       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6982 }
6983 
6984 template <typename Derived>
6985 OMPClause *
TransformOMPDefaultClause(OMPDefaultClause * C)6986 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
6987   return getDerived().RebuildOMPDefaultClause(
6988       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
6989       C->getLParenLoc(), C->getLocEnd());
6990 }
6991 
6992 template <typename Derived>
6993 OMPClause *
TransformOMPProcBindClause(OMPProcBindClause * C)6994 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
6995   return getDerived().RebuildOMPProcBindClause(
6996       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
6997       C->getLParenLoc(), C->getLocEnd());
6998 }
6999 
7000 template <typename Derived>
7001 OMPClause *
TransformOMPScheduleClause(OMPScheduleClause * C)7002 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
7003   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
7004   if (E.isInvalid())
7005     return nullptr;
7006   return getDerived().RebuildOMPScheduleClause(
7007       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
7008       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
7009 }
7010 
7011 template <typename Derived>
7012 OMPClause *
TransformOMPOrderedClause(OMPOrderedClause * C)7013 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
7014   // No need to rebuild this clause, no template-dependent parameters.
7015   return C;
7016 }
7017 
7018 template <typename Derived>
7019 OMPClause *
TransformOMPNowaitClause(OMPNowaitClause * C)7020 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
7021   // No need to rebuild this clause, no template-dependent parameters.
7022   return C;
7023 }
7024 
7025 template <typename Derived>
7026 OMPClause *
TransformOMPUntiedClause(OMPUntiedClause * C)7027 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
7028   // No need to rebuild this clause, no template-dependent parameters.
7029   return C;
7030 }
7031 
7032 template <typename Derived>
7033 OMPClause *
TransformOMPMergeableClause(OMPMergeableClause * C)7034 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
7035   // No need to rebuild this clause, no template-dependent parameters.
7036   return C;
7037 }
7038 
7039 template <typename Derived>
TransformOMPReadClause(OMPReadClause * C)7040 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
7041   // No need to rebuild this clause, no template-dependent parameters.
7042   return C;
7043 }
7044 
7045 template <typename Derived>
TransformOMPWriteClause(OMPWriteClause * C)7046 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
7047   // No need to rebuild this clause, no template-dependent parameters.
7048   return C;
7049 }
7050 
7051 template <typename Derived>
7052 OMPClause *
TransformOMPUpdateClause(OMPUpdateClause * C)7053 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
7054   // No need to rebuild this clause, no template-dependent parameters.
7055   return C;
7056 }
7057 
7058 template <typename Derived>
7059 OMPClause *
TransformOMPCaptureClause(OMPCaptureClause * C)7060 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
7061   // No need to rebuild this clause, no template-dependent parameters.
7062   return C;
7063 }
7064 
7065 template <typename Derived>
7066 OMPClause *
TransformOMPSeqCstClause(OMPSeqCstClause * C)7067 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
7068   // No need to rebuild this clause, no template-dependent parameters.
7069   return C;
7070 }
7071 
7072 template <typename Derived>
7073 OMPClause *
TransformOMPPrivateClause(OMPPrivateClause * C)7074 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
7075   llvm::SmallVector<Expr *, 16> Vars;
7076   Vars.reserve(C->varlist_size());
7077   for (auto *VE : C->varlists()) {
7078     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7079     if (EVar.isInvalid())
7080       return nullptr;
7081     Vars.push_back(EVar.get());
7082   }
7083   return getDerived().RebuildOMPPrivateClause(
7084       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7085 }
7086 
7087 template <typename Derived>
TransformOMPFirstprivateClause(OMPFirstprivateClause * C)7088 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
7089     OMPFirstprivateClause *C) {
7090   llvm::SmallVector<Expr *, 16> Vars;
7091   Vars.reserve(C->varlist_size());
7092   for (auto *VE : C->varlists()) {
7093     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7094     if (EVar.isInvalid())
7095       return nullptr;
7096     Vars.push_back(EVar.get());
7097   }
7098   return getDerived().RebuildOMPFirstprivateClause(
7099       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7100 }
7101 
7102 template <typename Derived>
7103 OMPClause *
TransformOMPLastprivateClause(OMPLastprivateClause * C)7104 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
7105   llvm::SmallVector<Expr *, 16> Vars;
7106   Vars.reserve(C->varlist_size());
7107   for (auto *VE : C->varlists()) {
7108     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7109     if (EVar.isInvalid())
7110       return nullptr;
7111     Vars.push_back(EVar.get());
7112   }
7113   return getDerived().RebuildOMPLastprivateClause(
7114       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7115 }
7116 
7117 template <typename Derived>
7118 OMPClause *
TransformOMPSharedClause(OMPSharedClause * C)7119 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
7120   llvm::SmallVector<Expr *, 16> Vars;
7121   Vars.reserve(C->varlist_size());
7122   for (auto *VE : C->varlists()) {
7123     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7124     if (EVar.isInvalid())
7125       return nullptr;
7126     Vars.push_back(EVar.get());
7127   }
7128   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
7129                                              C->getLParenLoc(), C->getLocEnd());
7130 }
7131 
7132 template <typename Derived>
7133 OMPClause *
TransformOMPReductionClause(OMPReductionClause * C)7134 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
7135   llvm::SmallVector<Expr *, 16> Vars;
7136   Vars.reserve(C->varlist_size());
7137   for (auto *VE : C->varlists()) {
7138     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7139     if (EVar.isInvalid())
7140       return nullptr;
7141     Vars.push_back(EVar.get());
7142   }
7143   CXXScopeSpec ReductionIdScopeSpec;
7144   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
7145 
7146   DeclarationNameInfo NameInfo = C->getNameInfo();
7147   if (NameInfo.getName()) {
7148     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7149     if (!NameInfo.getName())
7150       return nullptr;
7151   }
7152   return getDerived().RebuildOMPReductionClause(
7153       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
7154       C->getLocEnd(), ReductionIdScopeSpec, NameInfo);
7155 }
7156 
7157 template <typename Derived>
7158 OMPClause *
TransformOMPLinearClause(OMPLinearClause * C)7159 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
7160   llvm::SmallVector<Expr *, 16> Vars;
7161   Vars.reserve(C->varlist_size());
7162   for (auto *VE : C->varlists()) {
7163     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7164     if (EVar.isInvalid())
7165       return nullptr;
7166     Vars.push_back(EVar.get());
7167   }
7168   ExprResult Step = getDerived().TransformExpr(C->getStep());
7169   if (Step.isInvalid())
7170     return nullptr;
7171   return getDerived().RebuildOMPLinearClause(Vars, Step.get(), C->getLocStart(),
7172                                              C->getLParenLoc(),
7173                                              C->getColonLoc(), C->getLocEnd());
7174 }
7175 
7176 template <typename Derived>
7177 OMPClause *
TransformOMPAlignedClause(OMPAlignedClause * C)7178 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
7179   llvm::SmallVector<Expr *, 16> Vars;
7180   Vars.reserve(C->varlist_size());
7181   for (auto *VE : C->varlists()) {
7182     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7183     if (EVar.isInvalid())
7184       return nullptr;
7185     Vars.push_back(EVar.get());
7186   }
7187   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
7188   if (Alignment.isInvalid())
7189     return nullptr;
7190   return getDerived().RebuildOMPAlignedClause(
7191       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
7192       C->getColonLoc(), C->getLocEnd());
7193 }
7194 
7195 template <typename Derived>
7196 OMPClause *
TransformOMPCopyinClause(OMPCopyinClause * C)7197 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
7198   llvm::SmallVector<Expr *, 16> Vars;
7199   Vars.reserve(C->varlist_size());
7200   for (auto *VE : C->varlists()) {
7201     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7202     if (EVar.isInvalid())
7203       return nullptr;
7204     Vars.push_back(EVar.get());
7205   }
7206   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
7207                                              C->getLParenLoc(), C->getLocEnd());
7208 }
7209 
7210 template <typename Derived>
7211 OMPClause *
TransformOMPCopyprivateClause(OMPCopyprivateClause * C)7212 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
7213   llvm::SmallVector<Expr *, 16> Vars;
7214   Vars.reserve(C->varlist_size());
7215   for (auto *VE : C->varlists()) {
7216     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7217     if (EVar.isInvalid())
7218       return nullptr;
7219     Vars.push_back(EVar.get());
7220   }
7221   return getDerived().RebuildOMPCopyprivateClause(
7222       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7223 }
7224 
7225 template <typename Derived>
TransformOMPFlushClause(OMPFlushClause * C)7226 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
7227   llvm::SmallVector<Expr *, 16> Vars;
7228   Vars.reserve(C->varlist_size());
7229   for (auto *VE : C->varlists()) {
7230     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7231     if (EVar.isInvalid())
7232       return nullptr;
7233     Vars.push_back(EVar.get());
7234   }
7235   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
7236                                             C->getLParenLoc(), C->getLocEnd());
7237 }
7238 
7239 //===----------------------------------------------------------------------===//
7240 // Expression transformation
7241 //===----------------------------------------------------------------------===//
7242 template<typename Derived>
7243 ExprResult
TransformPredefinedExpr(PredefinedExpr * E)7244 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
7245   if (!E->isTypeDependent())
7246     return E;
7247 
7248   return getDerived().RebuildPredefinedExpr(E->getLocation(),
7249                                             E->getIdentType());
7250 }
7251 
7252 template<typename Derived>
7253 ExprResult
TransformDeclRefExpr(DeclRefExpr * E)7254 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
7255   NestedNameSpecifierLoc QualifierLoc;
7256   if (E->getQualifierLoc()) {
7257     QualifierLoc
7258       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7259     if (!QualifierLoc)
7260       return ExprError();
7261   }
7262 
7263   ValueDecl *ND
7264     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
7265                                                          E->getDecl()));
7266   if (!ND)
7267     return ExprError();
7268 
7269   DeclarationNameInfo NameInfo = E->getNameInfo();
7270   if (NameInfo.getName()) {
7271     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7272     if (!NameInfo.getName())
7273       return ExprError();
7274   }
7275 
7276   if (!getDerived().AlwaysRebuild() &&
7277       QualifierLoc == E->getQualifierLoc() &&
7278       ND == E->getDecl() &&
7279       NameInfo.getName() == E->getDecl()->getDeclName() &&
7280       !E->hasExplicitTemplateArgs()) {
7281 
7282     // Mark it referenced in the new context regardless.
7283     // FIXME: this is a bit instantiation-specific.
7284     SemaRef.MarkDeclRefReferenced(E);
7285 
7286     return E;
7287   }
7288 
7289   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
7290   if (E->hasExplicitTemplateArgs()) {
7291     TemplateArgs = &TransArgs;
7292     TransArgs.setLAngleLoc(E->getLAngleLoc());
7293     TransArgs.setRAngleLoc(E->getRAngleLoc());
7294     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7295                                                 E->getNumTemplateArgs(),
7296                                                 TransArgs))
7297       return ExprError();
7298   }
7299 
7300   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
7301                                          TemplateArgs);
7302 }
7303 
7304 template<typename Derived>
7305 ExprResult
TransformIntegerLiteral(IntegerLiteral * E)7306 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
7307   return E;
7308 }
7309 
7310 template<typename Derived>
7311 ExprResult
TransformFloatingLiteral(FloatingLiteral * E)7312 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
7313   return E;
7314 }
7315 
7316 template<typename Derived>
7317 ExprResult
TransformImaginaryLiteral(ImaginaryLiteral * E)7318 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
7319   return E;
7320 }
7321 
7322 template<typename Derived>
7323 ExprResult
TransformStringLiteral(StringLiteral * E)7324 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
7325   return E;
7326 }
7327 
7328 template<typename Derived>
7329 ExprResult
TransformCharacterLiteral(CharacterLiteral * E)7330 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
7331   return E;
7332 }
7333 
7334 template<typename Derived>
7335 ExprResult
TransformUserDefinedLiteral(UserDefinedLiteral * E)7336 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
7337   if (FunctionDecl *FD = E->getDirectCallee())
7338     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
7339   return SemaRef.MaybeBindToTemporary(E);
7340 }
7341 
7342 template<typename Derived>
7343 ExprResult
TransformGenericSelectionExpr(GenericSelectionExpr * E)7344 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
7345   ExprResult ControllingExpr =
7346     getDerived().TransformExpr(E->getControllingExpr());
7347   if (ControllingExpr.isInvalid())
7348     return ExprError();
7349 
7350   SmallVector<Expr *, 4> AssocExprs;
7351   SmallVector<TypeSourceInfo *, 4> AssocTypes;
7352   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
7353     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
7354     if (TS) {
7355       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
7356       if (!AssocType)
7357         return ExprError();
7358       AssocTypes.push_back(AssocType);
7359     } else {
7360       AssocTypes.push_back(nullptr);
7361     }
7362 
7363     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
7364     if (AssocExpr.isInvalid())
7365       return ExprError();
7366     AssocExprs.push_back(AssocExpr.get());
7367   }
7368 
7369   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
7370                                                   E->getDefaultLoc(),
7371                                                   E->getRParenLoc(),
7372                                                   ControllingExpr.get(),
7373                                                   AssocTypes,
7374                                                   AssocExprs);
7375 }
7376 
7377 template<typename Derived>
7378 ExprResult
TransformParenExpr(ParenExpr * E)7379 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
7380   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7381   if (SubExpr.isInvalid())
7382     return ExprError();
7383 
7384   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
7385     return E;
7386 
7387   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
7388                                        E->getRParen());
7389 }
7390 
7391 /// \brief The operand of a unary address-of operator has special rules: it's
7392 /// allowed to refer to a non-static member of a class even if there's no 'this'
7393 /// object available.
7394 template<typename Derived>
7395 ExprResult
TransformAddressOfOperand(Expr * E)7396 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
7397   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
7398     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
7399   else
7400     return getDerived().TransformExpr(E);
7401 }
7402 
7403 template<typename Derived>
7404 ExprResult
TransformUnaryOperator(UnaryOperator * E)7405 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
7406   ExprResult SubExpr;
7407   if (E->getOpcode() == UO_AddrOf)
7408     SubExpr = TransformAddressOfOperand(E->getSubExpr());
7409   else
7410     SubExpr = TransformExpr(E->getSubExpr());
7411   if (SubExpr.isInvalid())
7412     return ExprError();
7413 
7414   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
7415     return E;
7416 
7417   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
7418                                            E->getOpcode(),
7419                                            SubExpr.get());
7420 }
7421 
7422 template<typename Derived>
7423 ExprResult
TransformOffsetOfExpr(OffsetOfExpr * E)7424 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
7425   // Transform the type.
7426   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
7427   if (!Type)
7428     return ExprError();
7429 
7430   // Transform all of the components into components similar to what the
7431   // parser uses.
7432   // FIXME: It would be slightly more efficient in the non-dependent case to
7433   // just map FieldDecls, rather than requiring the rebuilder to look for
7434   // the fields again. However, __builtin_offsetof is rare enough in
7435   // template code that we don't care.
7436   bool ExprChanged = false;
7437   typedef Sema::OffsetOfComponent Component;
7438   typedef OffsetOfExpr::OffsetOfNode Node;
7439   SmallVector<Component, 4> Components;
7440   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
7441     const Node &ON = E->getComponent(I);
7442     Component Comp;
7443     Comp.isBrackets = true;
7444     Comp.LocStart = ON.getSourceRange().getBegin();
7445     Comp.LocEnd = ON.getSourceRange().getEnd();
7446     switch (ON.getKind()) {
7447     case Node::Array: {
7448       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
7449       ExprResult Index = getDerived().TransformExpr(FromIndex);
7450       if (Index.isInvalid())
7451         return ExprError();
7452 
7453       ExprChanged = ExprChanged || Index.get() != FromIndex;
7454       Comp.isBrackets = true;
7455       Comp.U.E = Index.get();
7456       break;
7457     }
7458 
7459     case Node::Field:
7460     case Node::Identifier:
7461       Comp.isBrackets = false;
7462       Comp.U.IdentInfo = ON.getFieldName();
7463       if (!Comp.U.IdentInfo)
7464         continue;
7465 
7466       break;
7467 
7468     case Node::Base:
7469       // Will be recomputed during the rebuild.
7470       continue;
7471     }
7472 
7473     Components.push_back(Comp);
7474   }
7475 
7476   // If nothing changed, retain the existing expression.
7477   if (!getDerived().AlwaysRebuild() &&
7478       Type == E->getTypeSourceInfo() &&
7479       !ExprChanged)
7480     return E;
7481 
7482   // Build a new offsetof expression.
7483   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
7484                                           Components.data(), Components.size(),
7485                                           E->getRParenLoc());
7486 }
7487 
7488 template<typename Derived>
7489 ExprResult
TransformOpaqueValueExpr(OpaqueValueExpr * E)7490 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
7491   assert(getDerived().AlreadyTransformed(E->getType()) &&
7492          "opaque value expression requires transformation");
7493   return E;
7494 }
7495 
7496 template<typename Derived>
7497 ExprResult
TransformTypoExpr(TypoExpr * E)7498 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
7499   return E;
7500 }
7501 
7502 template<typename Derived>
7503 ExprResult
TransformPseudoObjectExpr(PseudoObjectExpr * E)7504 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
7505   // Rebuild the syntactic form.  The original syntactic form has
7506   // opaque-value expressions in it, so strip those away and rebuild
7507   // the result.  This is a really awful way of doing this, but the
7508   // better solution (rebuilding the semantic expressions and
7509   // rebinding OVEs as necessary) doesn't work; we'd need
7510   // TreeTransform to not strip away implicit conversions.
7511   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
7512   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
7513   if (result.isInvalid()) return ExprError();
7514 
7515   // If that gives us a pseudo-object result back, the pseudo-object
7516   // expression must have been an lvalue-to-rvalue conversion which we
7517   // should reapply.
7518   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
7519     result = SemaRef.checkPseudoObjectRValue(result.get());
7520 
7521   return result;
7522 }
7523 
7524 template<typename Derived>
7525 ExprResult
TransformUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)7526 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
7527                                                 UnaryExprOrTypeTraitExpr *E) {
7528   if (E->isArgumentType()) {
7529     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
7530 
7531     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7532     if (!NewT)
7533       return ExprError();
7534 
7535     if (!getDerived().AlwaysRebuild() && OldT == NewT)
7536       return E;
7537 
7538     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
7539                                                     E->getKind(),
7540                                                     E->getSourceRange());
7541   }
7542 
7543   // C++0x [expr.sizeof]p1:
7544   //   The operand is either an expression, which is an unevaluated operand
7545   //   [...]
7546   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
7547                                                Sema::ReuseLambdaContextDecl);
7548 
7549   // Try to recover if we have something like sizeof(T::X) where X is a type.
7550   // Notably, there must be *exactly* one set of parens if X is a type.
7551   TypeSourceInfo *RecoveryTSI = nullptr;
7552   ExprResult SubExpr;
7553   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
7554   if (auto *DRE =
7555           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
7556     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
7557         PE, DRE, false, &RecoveryTSI);
7558   else
7559     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
7560 
7561   if (RecoveryTSI) {
7562     return getDerived().RebuildUnaryExprOrTypeTrait(
7563         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
7564   } else if (SubExpr.isInvalid())
7565     return ExprError();
7566 
7567   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
7568     return E;
7569 
7570   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
7571                                                   E->getOperatorLoc(),
7572                                                   E->getKind(),
7573                                                   E->getSourceRange());
7574 }
7575 
7576 template<typename Derived>
7577 ExprResult
TransformArraySubscriptExpr(ArraySubscriptExpr * E)7578 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
7579   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7580   if (LHS.isInvalid())
7581     return ExprError();
7582 
7583   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7584   if (RHS.isInvalid())
7585     return ExprError();
7586 
7587 
7588   if (!getDerived().AlwaysRebuild() &&
7589       LHS.get() == E->getLHS() &&
7590       RHS.get() == E->getRHS())
7591     return E;
7592 
7593   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
7594                                            /*FIXME:*/E->getLHS()->getLocStart(),
7595                                                 RHS.get(),
7596                                                 E->getRBracketLoc());
7597 }
7598 
7599 template<typename Derived>
7600 ExprResult
TransformCallExpr(CallExpr * E)7601 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
7602   // Transform the callee.
7603   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
7604   if (Callee.isInvalid())
7605     return ExprError();
7606 
7607   // Transform arguments.
7608   bool ArgChanged = false;
7609   SmallVector<Expr*, 8> Args;
7610   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7611                                   &ArgChanged))
7612     return ExprError();
7613 
7614   if (!getDerived().AlwaysRebuild() &&
7615       Callee.get() == E->getCallee() &&
7616       !ArgChanged)
7617     return SemaRef.MaybeBindToTemporary(E);
7618 
7619   // FIXME: Wrong source location information for the '('.
7620   SourceLocation FakeLParenLoc
7621     = ((Expr *)Callee.get())->getSourceRange().getBegin();
7622   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
7623                                       Args,
7624                                       E->getRParenLoc());
7625 }
7626 
7627 template<typename Derived>
7628 ExprResult
TransformMemberExpr(MemberExpr * E)7629 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
7630   ExprResult Base = getDerived().TransformExpr(E->getBase());
7631   if (Base.isInvalid())
7632     return ExprError();
7633 
7634   NestedNameSpecifierLoc QualifierLoc;
7635   if (E->hasQualifier()) {
7636     QualifierLoc
7637       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7638 
7639     if (!QualifierLoc)
7640       return ExprError();
7641   }
7642   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
7643 
7644   ValueDecl *Member
7645     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
7646                                                          E->getMemberDecl()));
7647   if (!Member)
7648     return ExprError();
7649 
7650   NamedDecl *FoundDecl = E->getFoundDecl();
7651   if (FoundDecl == E->getMemberDecl()) {
7652     FoundDecl = Member;
7653   } else {
7654     FoundDecl = cast_or_null<NamedDecl>(
7655                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
7656     if (!FoundDecl)
7657       return ExprError();
7658   }
7659 
7660   if (!getDerived().AlwaysRebuild() &&
7661       Base.get() == E->getBase() &&
7662       QualifierLoc == E->getQualifierLoc() &&
7663       Member == E->getMemberDecl() &&
7664       FoundDecl == E->getFoundDecl() &&
7665       !E->hasExplicitTemplateArgs()) {
7666 
7667     // Mark it referenced in the new context regardless.
7668     // FIXME: this is a bit instantiation-specific.
7669     SemaRef.MarkMemberReferenced(E);
7670 
7671     return E;
7672   }
7673 
7674   TemplateArgumentListInfo TransArgs;
7675   if (E->hasExplicitTemplateArgs()) {
7676     TransArgs.setLAngleLoc(E->getLAngleLoc());
7677     TransArgs.setRAngleLoc(E->getRAngleLoc());
7678     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7679                                                 E->getNumTemplateArgs(),
7680                                                 TransArgs))
7681       return ExprError();
7682   }
7683 
7684   // FIXME: Bogus source location for the operator
7685   SourceLocation FakeOperatorLoc =
7686       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
7687 
7688   // FIXME: to do this check properly, we will need to preserve the
7689   // first-qualifier-in-scope here, just in case we had a dependent
7690   // base (and therefore couldn't do the check) and a
7691   // nested-name-qualifier (and therefore could do the lookup).
7692   NamedDecl *FirstQualifierInScope = nullptr;
7693 
7694   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
7695                                         E->isArrow(),
7696                                         QualifierLoc,
7697                                         TemplateKWLoc,
7698                                         E->getMemberNameInfo(),
7699                                         Member,
7700                                         FoundDecl,
7701                                         (E->hasExplicitTemplateArgs()
7702                                            ? &TransArgs : nullptr),
7703                                         FirstQualifierInScope);
7704 }
7705 
7706 template<typename Derived>
7707 ExprResult
TransformBinaryOperator(BinaryOperator * E)7708 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
7709   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7710   if (LHS.isInvalid())
7711     return ExprError();
7712 
7713   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7714   if (RHS.isInvalid())
7715     return ExprError();
7716 
7717   if (!getDerived().AlwaysRebuild() &&
7718       LHS.get() == E->getLHS() &&
7719       RHS.get() == E->getRHS())
7720     return E;
7721 
7722   Sema::FPContractStateRAII FPContractState(getSema());
7723   getSema().FPFeatures.fp_contract = E->isFPContractable();
7724 
7725   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
7726                                             LHS.get(), RHS.get());
7727 }
7728 
7729 template<typename Derived>
7730 ExprResult
TransformCompoundAssignOperator(CompoundAssignOperator * E)7731 TreeTransform<Derived>::TransformCompoundAssignOperator(
7732                                                       CompoundAssignOperator *E) {
7733   return getDerived().TransformBinaryOperator(E);
7734 }
7735 
7736 template<typename Derived>
7737 ExprResult TreeTransform<Derived>::
TransformBinaryConditionalOperator(BinaryConditionalOperator * e)7738 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
7739   // Just rebuild the common and RHS expressions and see whether we
7740   // get any changes.
7741 
7742   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
7743   if (commonExpr.isInvalid())
7744     return ExprError();
7745 
7746   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
7747   if (rhs.isInvalid())
7748     return ExprError();
7749 
7750   if (!getDerived().AlwaysRebuild() &&
7751       commonExpr.get() == e->getCommon() &&
7752       rhs.get() == e->getFalseExpr())
7753     return e;
7754 
7755   return getDerived().RebuildConditionalOperator(commonExpr.get(),
7756                                                  e->getQuestionLoc(),
7757                                                  nullptr,
7758                                                  e->getColonLoc(),
7759                                                  rhs.get());
7760 }
7761 
7762 template<typename Derived>
7763 ExprResult
TransformConditionalOperator(ConditionalOperator * E)7764 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
7765   ExprResult Cond = getDerived().TransformExpr(E->getCond());
7766   if (Cond.isInvalid())
7767     return ExprError();
7768 
7769   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7770   if (LHS.isInvalid())
7771     return ExprError();
7772 
7773   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7774   if (RHS.isInvalid())
7775     return ExprError();
7776 
7777   if (!getDerived().AlwaysRebuild() &&
7778       Cond.get() == E->getCond() &&
7779       LHS.get() == E->getLHS() &&
7780       RHS.get() == E->getRHS())
7781     return E;
7782 
7783   return getDerived().RebuildConditionalOperator(Cond.get(),
7784                                                  E->getQuestionLoc(),
7785                                                  LHS.get(),
7786                                                  E->getColonLoc(),
7787                                                  RHS.get());
7788 }
7789 
7790 template<typename Derived>
7791 ExprResult
TransformImplicitCastExpr(ImplicitCastExpr * E)7792 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
7793   // Implicit casts are eliminated during transformation, since they
7794   // will be recomputed by semantic analysis after transformation.
7795   return getDerived().TransformExpr(E->getSubExprAsWritten());
7796 }
7797 
7798 template<typename Derived>
7799 ExprResult
TransformCStyleCastExpr(CStyleCastExpr * E)7800 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
7801   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
7802   if (!Type)
7803     return ExprError();
7804 
7805   ExprResult SubExpr
7806     = getDerived().TransformExpr(E->getSubExprAsWritten());
7807   if (SubExpr.isInvalid())
7808     return ExprError();
7809 
7810   if (!getDerived().AlwaysRebuild() &&
7811       Type == E->getTypeInfoAsWritten() &&
7812       SubExpr.get() == E->getSubExpr())
7813     return E;
7814 
7815   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
7816                                             Type,
7817                                             E->getRParenLoc(),
7818                                             SubExpr.get());
7819 }
7820 
7821 template<typename Derived>
7822 ExprResult
TransformCompoundLiteralExpr(CompoundLiteralExpr * E)7823 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
7824   TypeSourceInfo *OldT = E->getTypeSourceInfo();
7825   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7826   if (!NewT)
7827     return ExprError();
7828 
7829   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
7830   if (Init.isInvalid())
7831     return ExprError();
7832 
7833   if (!getDerived().AlwaysRebuild() &&
7834       OldT == NewT &&
7835       Init.get() == E->getInitializer())
7836     return SemaRef.MaybeBindToTemporary(E);
7837 
7838   // Note: the expression type doesn't necessarily match the
7839   // type-as-written, but that's okay, because it should always be
7840   // derivable from the initializer.
7841 
7842   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
7843                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
7844                                                  Init.get());
7845 }
7846 
7847 template<typename Derived>
7848 ExprResult
TransformExtVectorElementExpr(ExtVectorElementExpr * E)7849 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
7850   ExprResult Base = getDerived().TransformExpr(E->getBase());
7851   if (Base.isInvalid())
7852     return ExprError();
7853 
7854   if (!getDerived().AlwaysRebuild() &&
7855       Base.get() == E->getBase())
7856     return E;
7857 
7858   // FIXME: Bad source location
7859   SourceLocation FakeOperatorLoc =
7860       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
7861   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
7862                                                   E->getAccessorLoc(),
7863                                                   E->getAccessor());
7864 }
7865 
7866 template<typename Derived>
7867 ExprResult
TransformInitListExpr(InitListExpr * E)7868 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
7869   if (InitListExpr *Syntactic = E->getSyntacticForm())
7870     E = Syntactic;
7871 
7872   bool InitChanged = false;
7873 
7874   SmallVector<Expr*, 4> Inits;
7875   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
7876                                   Inits, &InitChanged))
7877     return ExprError();
7878 
7879   if (!getDerived().AlwaysRebuild() && !InitChanged) {
7880     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
7881     // in some cases. We can't reuse it in general, because the syntactic and
7882     // semantic forms are linked, and we can't know that semantic form will
7883     // match even if the syntactic form does.
7884   }
7885 
7886   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
7887                                       E->getRBraceLoc(), E->getType());
7888 }
7889 
7890 template<typename Derived>
7891 ExprResult
TransformDesignatedInitExpr(DesignatedInitExpr * E)7892 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
7893   Designation Desig;
7894 
7895   // transform the initializer value
7896   ExprResult Init = getDerived().TransformExpr(E->getInit());
7897   if (Init.isInvalid())
7898     return ExprError();
7899 
7900   // transform the designators.
7901   SmallVector<Expr*, 4> ArrayExprs;
7902   bool ExprChanged = false;
7903   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
7904                                              DEnd = E->designators_end();
7905        D != DEnd; ++D) {
7906     if (D->isFieldDesignator()) {
7907       Desig.AddDesignator(Designator::getField(D->getFieldName(),
7908                                                D->getDotLoc(),
7909                                                D->getFieldLoc()));
7910       continue;
7911     }
7912 
7913     if (D->isArrayDesignator()) {
7914       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
7915       if (Index.isInvalid())
7916         return ExprError();
7917 
7918       Desig.AddDesignator(Designator::getArray(Index.get(),
7919                                                D->getLBracketLoc()));
7920 
7921       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
7922       ArrayExprs.push_back(Index.get());
7923       continue;
7924     }
7925 
7926     assert(D->isArrayRangeDesignator() && "New kind of designator?");
7927     ExprResult Start
7928       = getDerived().TransformExpr(E->getArrayRangeStart(*D));
7929     if (Start.isInvalid())
7930       return ExprError();
7931 
7932     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
7933     if (End.isInvalid())
7934       return ExprError();
7935 
7936     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
7937                                                   End.get(),
7938                                                   D->getLBracketLoc(),
7939                                                   D->getEllipsisLoc()));
7940 
7941     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
7942       End.get() != E->getArrayRangeEnd(*D);
7943 
7944     ArrayExprs.push_back(Start.get());
7945     ArrayExprs.push_back(End.get());
7946   }
7947 
7948   if (!getDerived().AlwaysRebuild() &&
7949       Init.get() == E->getInit() &&
7950       !ExprChanged)
7951     return E;
7952 
7953   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
7954                                                 E->getEqualOrColonLoc(),
7955                                                 E->usesGNUSyntax(), Init.get());
7956 }
7957 
7958 template<typename Derived>
7959 ExprResult
TransformImplicitValueInitExpr(ImplicitValueInitExpr * E)7960 TreeTransform<Derived>::TransformImplicitValueInitExpr(
7961                                                      ImplicitValueInitExpr *E) {
7962   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
7963 
7964   // FIXME: Will we ever have proper type location here? Will we actually
7965   // need to transform the type?
7966   QualType T = getDerived().TransformType(E->getType());
7967   if (T.isNull())
7968     return ExprError();
7969 
7970   if (!getDerived().AlwaysRebuild() &&
7971       T == E->getType())
7972     return E;
7973 
7974   return getDerived().RebuildImplicitValueInitExpr(T);
7975 }
7976 
7977 template<typename Derived>
7978 ExprResult
TransformVAArgExpr(VAArgExpr * E)7979 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
7980   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
7981   if (!TInfo)
7982     return ExprError();
7983 
7984   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7985   if (SubExpr.isInvalid())
7986     return ExprError();
7987 
7988   if (!getDerived().AlwaysRebuild() &&
7989       TInfo == E->getWrittenTypeInfo() &&
7990       SubExpr.get() == E->getSubExpr())
7991     return E;
7992 
7993   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
7994                                        TInfo, E->getRParenLoc());
7995 }
7996 
7997 template<typename Derived>
7998 ExprResult
TransformParenListExpr(ParenListExpr * E)7999 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
8000   bool ArgumentChanged = false;
8001   SmallVector<Expr*, 4> Inits;
8002   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
8003                      &ArgumentChanged))
8004     return ExprError();
8005 
8006   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
8007                                            Inits,
8008                                            E->getRParenLoc());
8009 }
8010 
8011 /// \brief Transform an address-of-label expression.
8012 ///
8013 /// By default, the transformation of an address-of-label expression always
8014 /// rebuilds the expression, so that the label identifier can be resolved to
8015 /// the corresponding label statement by semantic analysis.
8016 template<typename Derived>
8017 ExprResult
TransformAddrLabelExpr(AddrLabelExpr * E)8018 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
8019   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
8020                                         E->getLabel());
8021   if (!LD)
8022     return ExprError();
8023 
8024   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
8025                                            cast<LabelDecl>(LD));
8026 }
8027 
8028 template<typename Derived>
8029 ExprResult
TransformStmtExpr(StmtExpr * E)8030 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
8031   SemaRef.ActOnStartStmtExpr();
8032   StmtResult SubStmt
8033     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
8034   if (SubStmt.isInvalid()) {
8035     SemaRef.ActOnStmtExprError();
8036     return ExprError();
8037   }
8038 
8039   if (!getDerived().AlwaysRebuild() &&
8040       SubStmt.get() == E->getSubStmt()) {
8041     // Calling this an 'error' is unintuitive, but it does the right thing.
8042     SemaRef.ActOnStmtExprError();
8043     return SemaRef.MaybeBindToTemporary(E);
8044   }
8045 
8046   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
8047                                       SubStmt.get(),
8048                                       E->getRParenLoc());
8049 }
8050 
8051 template<typename Derived>
8052 ExprResult
TransformChooseExpr(ChooseExpr * E)8053 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
8054   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8055   if (Cond.isInvalid())
8056     return ExprError();
8057 
8058   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8059   if (LHS.isInvalid())
8060     return ExprError();
8061 
8062   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8063   if (RHS.isInvalid())
8064     return ExprError();
8065 
8066   if (!getDerived().AlwaysRebuild() &&
8067       Cond.get() == E->getCond() &&
8068       LHS.get() == E->getLHS() &&
8069       RHS.get() == E->getRHS())
8070     return E;
8071 
8072   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
8073                                         Cond.get(), LHS.get(), RHS.get(),
8074                                         E->getRParenLoc());
8075 }
8076 
8077 template<typename Derived>
8078 ExprResult
TransformGNUNullExpr(GNUNullExpr * E)8079 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
8080   return E;
8081 }
8082 
8083 template<typename Derived>
8084 ExprResult
TransformCXXOperatorCallExpr(CXXOperatorCallExpr * E)8085 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
8086   switch (E->getOperator()) {
8087   case OO_New:
8088   case OO_Delete:
8089   case OO_Array_New:
8090   case OO_Array_Delete:
8091     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
8092 
8093   case OO_Call: {
8094     // This is a call to an object's operator().
8095     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
8096 
8097     // Transform the object itself.
8098     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
8099     if (Object.isInvalid())
8100       return ExprError();
8101 
8102     // FIXME: Poor location information
8103     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
8104         static_cast<Expr *>(Object.get())->getLocEnd());
8105 
8106     // Transform the call arguments.
8107     SmallVector<Expr*, 8> Args;
8108     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
8109                                     Args))
8110       return ExprError();
8111 
8112     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
8113                                         Args,
8114                                         E->getLocEnd());
8115   }
8116 
8117 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
8118   case OO_##Name:
8119 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
8120 #include "clang/Basic/OperatorKinds.def"
8121   case OO_Subscript:
8122     // Handled below.
8123     break;
8124 
8125   case OO_Conditional:
8126     llvm_unreachable("conditional operator is not actually overloadable");
8127 
8128   case OO_None:
8129   case NUM_OVERLOADED_OPERATORS:
8130     llvm_unreachable("not an overloaded operator?");
8131   }
8132 
8133   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8134   if (Callee.isInvalid())
8135     return ExprError();
8136 
8137   ExprResult First;
8138   if (E->getOperator() == OO_Amp)
8139     First = getDerived().TransformAddressOfOperand(E->getArg(0));
8140   else
8141     First = getDerived().TransformExpr(E->getArg(0));
8142   if (First.isInvalid())
8143     return ExprError();
8144 
8145   ExprResult Second;
8146   if (E->getNumArgs() == 2) {
8147     Second = getDerived().TransformExpr(E->getArg(1));
8148     if (Second.isInvalid())
8149       return ExprError();
8150   }
8151 
8152   if (!getDerived().AlwaysRebuild() &&
8153       Callee.get() == E->getCallee() &&
8154       First.get() == E->getArg(0) &&
8155       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
8156     return SemaRef.MaybeBindToTemporary(E);
8157 
8158   Sema::FPContractStateRAII FPContractState(getSema());
8159   getSema().FPFeatures.fp_contract = E->isFPContractable();
8160 
8161   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
8162                                                  E->getOperatorLoc(),
8163                                                  Callee.get(),
8164                                                  First.get(),
8165                                                  Second.get());
8166 }
8167 
8168 template<typename Derived>
8169 ExprResult
TransformCXXMemberCallExpr(CXXMemberCallExpr * E)8170 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
8171   return getDerived().TransformCallExpr(E);
8172 }
8173 
8174 template<typename Derived>
8175 ExprResult
TransformCUDAKernelCallExpr(CUDAKernelCallExpr * E)8176 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
8177   // Transform the callee.
8178   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8179   if (Callee.isInvalid())
8180     return ExprError();
8181 
8182   // Transform exec config.
8183   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
8184   if (EC.isInvalid())
8185     return ExprError();
8186 
8187   // Transform arguments.
8188   bool ArgChanged = false;
8189   SmallVector<Expr*, 8> Args;
8190   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8191                                   &ArgChanged))
8192     return ExprError();
8193 
8194   if (!getDerived().AlwaysRebuild() &&
8195       Callee.get() == E->getCallee() &&
8196       !ArgChanged)
8197     return SemaRef.MaybeBindToTemporary(E);
8198 
8199   // FIXME: Wrong source location information for the '('.
8200   SourceLocation FakeLParenLoc
8201     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8202   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8203                                       Args,
8204                                       E->getRParenLoc(), EC.get());
8205 }
8206 
8207 template<typename Derived>
8208 ExprResult
TransformCXXNamedCastExpr(CXXNamedCastExpr * E)8209 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
8210   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8211   if (!Type)
8212     return ExprError();
8213 
8214   ExprResult SubExpr
8215     = getDerived().TransformExpr(E->getSubExprAsWritten());
8216   if (SubExpr.isInvalid())
8217     return ExprError();
8218 
8219   if (!getDerived().AlwaysRebuild() &&
8220       Type == E->getTypeInfoAsWritten() &&
8221       SubExpr.get() == E->getSubExpr())
8222     return E;
8223   return getDerived().RebuildCXXNamedCastExpr(
8224       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
8225       Type, E->getAngleBrackets().getEnd(),
8226       // FIXME. this should be '(' location
8227       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
8228 }
8229 
8230 template<typename Derived>
8231 ExprResult
TransformCXXStaticCastExpr(CXXStaticCastExpr * E)8232 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
8233   return getDerived().TransformCXXNamedCastExpr(E);
8234 }
8235 
8236 template<typename Derived>
8237 ExprResult
TransformCXXDynamicCastExpr(CXXDynamicCastExpr * E)8238 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
8239   return getDerived().TransformCXXNamedCastExpr(E);
8240 }
8241 
8242 template<typename Derived>
8243 ExprResult
TransformCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)8244 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
8245                                                       CXXReinterpretCastExpr *E) {
8246   return getDerived().TransformCXXNamedCastExpr(E);
8247 }
8248 
8249 template<typename Derived>
8250 ExprResult
TransformCXXConstCastExpr(CXXConstCastExpr * E)8251 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
8252   return getDerived().TransformCXXNamedCastExpr(E);
8253 }
8254 
8255 template<typename Derived>
8256 ExprResult
TransformCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)8257 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
8258                                                      CXXFunctionalCastExpr *E) {
8259   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8260   if (!Type)
8261     return ExprError();
8262 
8263   ExprResult SubExpr
8264     = getDerived().TransformExpr(E->getSubExprAsWritten());
8265   if (SubExpr.isInvalid())
8266     return ExprError();
8267 
8268   if (!getDerived().AlwaysRebuild() &&
8269       Type == E->getTypeInfoAsWritten() &&
8270       SubExpr.get() == E->getSubExpr())
8271     return E;
8272 
8273   return getDerived().RebuildCXXFunctionalCastExpr(Type,
8274                                                    E->getLParenLoc(),
8275                                                    SubExpr.get(),
8276                                                    E->getRParenLoc());
8277 }
8278 
8279 template<typename Derived>
8280 ExprResult
TransformCXXTypeidExpr(CXXTypeidExpr * E)8281 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
8282   if (E->isTypeOperand()) {
8283     TypeSourceInfo *TInfo
8284       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8285     if (!TInfo)
8286       return ExprError();
8287 
8288     if (!getDerived().AlwaysRebuild() &&
8289         TInfo == E->getTypeOperandSourceInfo())
8290       return E;
8291 
8292     return getDerived().RebuildCXXTypeidExpr(E->getType(),
8293                                              E->getLocStart(),
8294                                              TInfo,
8295                                              E->getLocEnd());
8296   }
8297 
8298   // We don't know whether the subexpression is potentially evaluated until
8299   // after we perform semantic analysis.  We speculatively assume it is
8300   // unevaluated; it will get fixed later if the subexpression is in fact
8301   // potentially evaluated.
8302   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8303                                                Sema::ReuseLambdaContextDecl);
8304 
8305   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8306   if (SubExpr.isInvalid())
8307     return ExprError();
8308 
8309   if (!getDerived().AlwaysRebuild() &&
8310       SubExpr.get() == E->getExprOperand())
8311     return E;
8312 
8313   return getDerived().RebuildCXXTypeidExpr(E->getType(),
8314                                            E->getLocStart(),
8315                                            SubExpr.get(),
8316                                            E->getLocEnd());
8317 }
8318 
8319 template<typename Derived>
8320 ExprResult
TransformCXXUuidofExpr(CXXUuidofExpr * E)8321 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
8322   if (E->isTypeOperand()) {
8323     TypeSourceInfo *TInfo
8324       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8325     if (!TInfo)
8326       return ExprError();
8327 
8328     if (!getDerived().AlwaysRebuild() &&
8329         TInfo == E->getTypeOperandSourceInfo())
8330       return E;
8331 
8332     return getDerived().RebuildCXXUuidofExpr(E->getType(),
8333                                              E->getLocStart(),
8334                                              TInfo,
8335                                              E->getLocEnd());
8336   }
8337 
8338   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8339 
8340   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8341   if (SubExpr.isInvalid())
8342     return ExprError();
8343 
8344   if (!getDerived().AlwaysRebuild() &&
8345       SubExpr.get() == E->getExprOperand())
8346     return E;
8347 
8348   return getDerived().RebuildCXXUuidofExpr(E->getType(),
8349                                            E->getLocStart(),
8350                                            SubExpr.get(),
8351                                            E->getLocEnd());
8352 }
8353 
8354 template<typename Derived>
8355 ExprResult
TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)8356 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
8357   return E;
8358 }
8359 
8360 template<typename Derived>
8361 ExprResult
TransformCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)8362 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
8363                                                      CXXNullPtrLiteralExpr *E) {
8364   return E;
8365 }
8366 
8367 template<typename Derived>
8368 ExprResult
TransformCXXThisExpr(CXXThisExpr * E)8369 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
8370   QualType T = getSema().getCurrentThisType();
8371 
8372   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
8373     // Make sure that we capture 'this'.
8374     getSema().CheckCXXThisCapture(E->getLocStart());
8375     return E;
8376   }
8377 
8378   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
8379 }
8380 
8381 template<typename Derived>
8382 ExprResult
TransformCXXThrowExpr(CXXThrowExpr * E)8383 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
8384   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8385   if (SubExpr.isInvalid())
8386     return ExprError();
8387 
8388   if (!getDerived().AlwaysRebuild() &&
8389       SubExpr.get() == E->getSubExpr())
8390     return E;
8391 
8392   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
8393                                           E->isThrownVariableInScope());
8394 }
8395 
8396 template<typename Derived>
8397 ExprResult
TransformCXXDefaultArgExpr(CXXDefaultArgExpr * E)8398 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
8399   ParmVarDecl *Param
8400     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
8401                                                            E->getParam()));
8402   if (!Param)
8403     return ExprError();
8404 
8405   if (!getDerived().AlwaysRebuild() &&
8406       Param == E->getParam())
8407     return E;
8408 
8409   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
8410 }
8411 
8412 template<typename Derived>
8413 ExprResult
TransformCXXDefaultInitExpr(CXXDefaultInitExpr * E)8414 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
8415   FieldDecl *Field
8416     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
8417                                                          E->getField()));
8418   if (!Field)
8419     return ExprError();
8420 
8421   if (!getDerived().AlwaysRebuild() && Field == E->getField())
8422     return E;
8423 
8424   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
8425 }
8426 
8427 template<typename Derived>
8428 ExprResult
TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)8429 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
8430                                                     CXXScalarValueInitExpr *E) {
8431   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
8432   if (!T)
8433     return ExprError();
8434 
8435   if (!getDerived().AlwaysRebuild() &&
8436       T == E->getTypeSourceInfo())
8437     return E;
8438 
8439   return getDerived().RebuildCXXScalarValueInitExpr(T,
8440                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
8441                                                     E->getRParenLoc());
8442 }
8443 
8444 template<typename Derived>
8445 ExprResult
TransformCXXNewExpr(CXXNewExpr * E)8446 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
8447   // Transform the type that we're allocating
8448   TypeSourceInfo *AllocTypeInfo
8449     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
8450   if (!AllocTypeInfo)
8451     return ExprError();
8452 
8453   // Transform the size of the array we're allocating (if any).
8454   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
8455   if (ArraySize.isInvalid())
8456     return ExprError();
8457 
8458   // Transform the placement arguments (if any).
8459   bool ArgumentChanged = false;
8460   SmallVector<Expr*, 8> PlacementArgs;
8461   if (getDerived().TransformExprs(E->getPlacementArgs(),
8462                                   E->getNumPlacementArgs(), true,
8463                                   PlacementArgs, &ArgumentChanged))
8464     return ExprError();
8465 
8466   // Transform the initializer (if any).
8467   Expr *OldInit = E->getInitializer();
8468   ExprResult NewInit;
8469   if (OldInit)
8470     NewInit = getDerived().TransformInitializer(OldInit, true);
8471   if (NewInit.isInvalid())
8472     return ExprError();
8473 
8474   // Transform new operator and delete operator.
8475   FunctionDecl *OperatorNew = nullptr;
8476   if (E->getOperatorNew()) {
8477     OperatorNew = cast_or_null<FunctionDecl>(
8478                                  getDerived().TransformDecl(E->getLocStart(),
8479                                                          E->getOperatorNew()));
8480     if (!OperatorNew)
8481       return ExprError();
8482   }
8483 
8484   FunctionDecl *OperatorDelete = nullptr;
8485   if (E->getOperatorDelete()) {
8486     OperatorDelete = cast_or_null<FunctionDecl>(
8487                                    getDerived().TransformDecl(E->getLocStart(),
8488                                                        E->getOperatorDelete()));
8489     if (!OperatorDelete)
8490       return ExprError();
8491   }
8492 
8493   if (!getDerived().AlwaysRebuild() &&
8494       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
8495       ArraySize.get() == E->getArraySize() &&
8496       NewInit.get() == OldInit &&
8497       OperatorNew == E->getOperatorNew() &&
8498       OperatorDelete == E->getOperatorDelete() &&
8499       !ArgumentChanged) {
8500     // Mark any declarations we need as referenced.
8501     // FIXME: instantiation-specific.
8502     if (OperatorNew)
8503       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
8504     if (OperatorDelete)
8505       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8506 
8507     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
8508       QualType ElementType
8509         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
8510       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
8511         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
8512         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
8513           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
8514         }
8515       }
8516     }
8517 
8518     return E;
8519   }
8520 
8521   QualType AllocType = AllocTypeInfo->getType();
8522   if (!ArraySize.get()) {
8523     // If no array size was specified, but the new expression was
8524     // instantiated with an array type (e.g., "new T" where T is
8525     // instantiated with "int[4]"), extract the outer bound from the
8526     // array type as our array size. We do this with constant and
8527     // dependently-sized array types.
8528     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
8529     if (!ArrayT) {
8530       // Do nothing
8531     } else if (const ConstantArrayType *ConsArrayT
8532                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
8533       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
8534                                          SemaRef.Context.getSizeType(),
8535                                          /*FIXME:*/ E->getLocStart());
8536       AllocType = ConsArrayT->getElementType();
8537     } else if (const DependentSizedArrayType *DepArrayT
8538                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
8539       if (DepArrayT->getSizeExpr()) {
8540         ArraySize = DepArrayT->getSizeExpr();
8541         AllocType = DepArrayT->getElementType();
8542       }
8543     }
8544   }
8545 
8546   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
8547                                         E->isGlobalNew(),
8548                                         /*FIXME:*/E->getLocStart(),
8549                                         PlacementArgs,
8550                                         /*FIXME:*/E->getLocStart(),
8551                                         E->getTypeIdParens(),
8552                                         AllocType,
8553                                         AllocTypeInfo,
8554                                         ArraySize.get(),
8555                                         E->getDirectInitRange(),
8556                                         NewInit.get());
8557 }
8558 
8559 template<typename Derived>
8560 ExprResult
TransformCXXDeleteExpr(CXXDeleteExpr * E)8561 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
8562   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
8563   if (Operand.isInvalid())
8564     return ExprError();
8565 
8566   // Transform the delete operator, if known.
8567   FunctionDecl *OperatorDelete = nullptr;
8568   if (E->getOperatorDelete()) {
8569     OperatorDelete = cast_or_null<FunctionDecl>(
8570                                    getDerived().TransformDecl(E->getLocStart(),
8571                                                        E->getOperatorDelete()));
8572     if (!OperatorDelete)
8573       return ExprError();
8574   }
8575 
8576   if (!getDerived().AlwaysRebuild() &&
8577       Operand.get() == E->getArgument() &&
8578       OperatorDelete == E->getOperatorDelete()) {
8579     // Mark any declarations we need as referenced.
8580     // FIXME: instantiation-specific.
8581     if (OperatorDelete)
8582       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8583 
8584     if (!E->getArgument()->isTypeDependent()) {
8585       QualType Destroyed = SemaRef.Context.getBaseElementType(
8586                                                          E->getDestroyedType());
8587       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
8588         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
8589         SemaRef.MarkFunctionReferenced(E->getLocStart(),
8590                                        SemaRef.LookupDestructor(Record));
8591       }
8592     }
8593 
8594     return E;
8595   }
8596 
8597   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
8598                                            E->isGlobalDelete(),
8599                                            E->isArrayForm(),
8600                                            Operand.get());
8601 }
8602 
8603 template<typename Derived>
8604 ExprResult
TransformCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)8605 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
8606                                                      CXXPseudoDestructorExpr *E) {
8607   ExprResult Base = getDerived().TransformExpr(E->getBase());
8608   if (Base.isInvalid())
8609     return ExprError();
8610 
8611   ParsedType ObjectTypePtr;
8612   bool MayBePseudoDestructor = false;
8613   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
8614                                               E->getOperatorLoc(),
8615                                         E->isArrow()? tok::arrow : tok::period,
8616                                               ObjectTypePtr,
8617                                               MayBePseudoDestructor);
8618   if (Base.isInvalid())
8619     return ExprError();
8620 
8621   QualType ObjectType = ObjectTypePtr.get();
8622   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
8623   if (QualifierLoc) {
8624     QualifierLoc
8625       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
8626     if (!QualifierLoc)
8627       return ExprError();
8628   }
8629   CXXScopeSpec SS;
8630   SS.Adopt(QualifierLoc);
8631 
8632   PseudoDestructorTypeStorage Destroyed;
8633   if (E->getDestroyedTypeInfo()) {
8634     TypeSourceInfo *DestroyedTypeInfo
8635       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
8636                                                 ObjectType, nullptr, SS);
8637     if (!DestroyedTypeInfo)
8638       return ExprError();
8639     Destroyed = DestroyedTypeInfo;
8640   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
8641     // We aren't likely to be able to resolve the identifier down to a type
8642     // now anyway, so just retain the identifier.
8643     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
8644                                             E->getDestroyedTypeLoc());
8645   } else {
8646     // Look for a destructor known with the given name.
8647     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
8648                                               *E->getDestroyedTypeIdentifier(),
8649                                                 E->getDestroyedTypeLoc(),
8650                                                 /*Scope=*/nullptr,
8651                                                 SS, ObjectTypePtr,
8652                                                 false);
8653     if (!T)
8654       return ExprError();
8655 
8656     Destroyed
8657       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
8658                                                  E->getDestroyedTypeLoc());
8659   }
8660 
8661   TypeSourceInfo *ScopeTypeInfo = nullptr;
8662   if (E->getScopeTypeInfo()) {
8663     CXXScopeSpec EmptySS;
8664     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
8665                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
8666     if (!ScopeTypeInfo)
8667       return ExprError();
8668   }
8669 
8670   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
8671                                                      E->getOperatorLoc(),
8672                                                      E->isArrow(),
8673                                                      SS,
8674                                                      ScopeTypeInfo,
8675                                                      E->getColonColonLoc(),
8676                                                      E->getTildeLoc(),
8677                                                      Destroyed);
8678 }
8679 
8680 template<typename Derived>
8681 ExprResult
TransformUnresolvedLookupExpr(UnresolvedLookupExpr * Old)8682 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
8683                                                   UnresolvedLookupExpr *Old) {
8684   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
8685                  Sema::LookupOrdinaryName);
8686 
8687   // Transform all the decls.
8688   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
8689          E = Old->decls_end(); I != E; ++I) {
8690     NamedDecl *InstD = static_cast<NamedDecl*>(
8691                                  getDerived().TransformDecl(Old->getNameLoc(),
8692                                                             *I));
8693     if (!InstD) {
8694       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
8695       // This can happen because of dependent hiding.
8696       if (isa<UsingShadowDecl>(*I))
8697         continue;
8698       else {
8699         R.clear();
8700         return ExprError();
8701       }
8702     }
8703 
8704     // Expand using declarations.
8705     if (isa<UsingDecl>(InstD)) {
8706       UsingDecl *UD = cast<UsingDecl>(InstD);
8707       for (auto *I : UD->shadows())
8708         R.addDecl(I);
8709       continue;
8710     }
8711 
8712     R.addDecl(InstD);
8713   }
8714 
8715   // Resolve a kind, but don't do any further analysis.  If it's
8716   // ambiguous, the callee needs to deal with it.
8717   R.resolveKind();
8718 
8719   // Rebuild the nested-name qualifier, if present.
8720   CXXScopeSpec SS;
8721   if (Old->getQualifierLoc()) {
8722     NestedNameSpecifierLoc QualifierLoc
8723       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
8724     if (!QualifierLoc)
8725       return ExprError();
8726 
8727     SS.Adopt(QualifierLoc);
8728   }
8729 
8730   if (Old->getNamingClass()) {
8731     CXXRecordDecl *NamingClass
8732       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
8733                                                             Old->getNameLoc(),
8734                                                         Old->getNamingClass()));
8735     if (!NamingClass) {
8736       R.clear();
8737       return ExprError();
8738     }
8739 
8740     R.setNamingClass(NamingClass);
8741   }
8742 
8743   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
8744 
8745   // If we have neither explicit template arguments, nor the template keyword,
8746   // it's a normal declaration name.
8747   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
8748     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
8749 
8750   // If we have template arguments, rebuild them, then rebuild the
8751   // templateid expression.
8752   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
8753   if (Old->hasExplicitTemplateArgs() &&
8754       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
8755                                               Old->getNumTemplateArgs(),
8756                                               TransArgs)) {
8757     R.clear();
8758     return ExprError();
8759   }
8760 
8761   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
8762                                             Old->requiresADL(), &TransArgs);
8763 }
8764 
8765 template<typename Derived>
8766 ExprResult
TransformTypeTraitExpr(TypeTraitExpr * E)8767 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
8768   bool ArgChanged = false;
8769   SmallVector<TypeSourceInfo *, 4> Args;
8770   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
8771     TypeSourceInfo *From = E->getArg(I);
8772     TypeLoc FromTL = From->getTypeLoc();
8773     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
8774       TypeLocBuilder TLB;
8775       TLB.reserve(FromTL.getFullDataSize());
8776       QualType To = getDerived().TransformType(TLB, FromTL);
8777       if (To.isNull())
8778         return ExprError();
8779 
8780       if (To == From->getType())
8781         Args.push_back(From);
8782       else {
8783         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8784         ArgChanged = true;
8785       }
8786       continue;
8787     }
8788 
8789     ArgChanged = true;
8790 
8791     // We have a pack expansion. Instantiate it.
8792     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
8793     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
8794     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
8795     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
8796 
8797     // Determine whether the set of unexpanded parameter packs can and should
8798     // be expanded.
8799     bool Expand = true;
8800     bool RetainExpansion = false;
8801     Optional<unsigned> OrigNumExpansions =
8802         ExpansionTL.getTypePtr()->getNumExpansions();
8803     Optional<unsigned> NumExpansions = OrigNumExpansions;
8804     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
8805                                              PatternTL.getSourceRange(),
8806                                              Unexpanded,
8807                                              Expand, RetainExpansion,
8808                                              NumExpansions))
8809       return ExprError();
8810 
8811     if (!Expand) {
8812       // The transform has determined that we should perform a simple
8813       // transformation on the pack expansion, producing another pack
8814       // expansion.
8815       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
8816 
8817       TypeLocBuilder TLB;
8818       TLB.reserve(From->getTypeLoc().getFullDataSize());
8819 
8820       QualType To = getDerived().TransformType(TLB, PatternTL);
8821       if (To.isNull())
8822         return ExprError();
8823 
8824       To = getDerived().RebuildPackExpansionType(To,
8825                                                  PatternTL.getSourceRange(),
8826                                                  ExpansionTL.getEllipsisLoc(),
8827                                                  NumExpansions);
8828       if (To.isNull())
8829         return ExprError();
8830 
8831       PackExpansionTypeLoc ToExpansionTL
8832         = TLB.push<PackExpansionTypeLoc>(To);
8833       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8834       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8835       continue;
8836     }
8837 
8838     // Expand the pack expansion by substituting for each argument in the
8839     // pack(s).
8840     for (unsigned I = 0; I != *NumExpansions; ++I) {
8841       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
8842       TypeLocBuilder TLB;
8843       TLB.reserve(PatternTL.getFullDataSize());
8844       QualType To = getDerived().TransformType(TLB, PatternTL);
8845       if (To.isNull())
8846         return ExprError();
8847 
8848       if (To->containsUnexpandedParameterPack()) {
8849         To = getDerived().RebuildPackExpansionType(To,
8850                                                    PatternTL.getSourceRange(),
8851                                                    ExpansionTL.getEllipsisLoc(),
8852                                                    NumExpansions);
8853         if (To.isNull())
8854           return ExprError();
8855 
8856         PackExpansionTypeLoc ToExpansionTL
8857           = TLB.push<PackExpansionTypeLoc>(To);
8858         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8859       }
8860 
8861       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8862     }
8863 
8864     if (!RetainExpansion)
8865       continue;
8866 
8867     // If we're supposed to retain a pack expansion, do so by temporarily
8868     // forgetting the partially-substituted parameter pack.
8869     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
8870 
8871     TypeLocBuilder TLB;
8872     TLB.reserve(From->getTypeLoc().getFullDataSize());
8873 
8874     QualType To = getDerived().TransformType(TLB, PatternTL);
8875     if (To.isNull())
8876       return ExprError();
8877 
8878     To = getDerived().RebuildPackExpansionType(To,
8879                                                PatternTL.getSourceRange(),
8880                                                ExpansionTL.getEllipsisLoc(),
8881                                                NumExpansions);
8882     if (To.isNull())
8883       return ExprError();
8884 
8885     PackExpansionTypeLoc ToExpansionTL
8886       = TLB.push<PackExpansionTypeLoc>(To);
8887     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8888     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8889   }
8890 
8891   if (!getDerived().AlwaysRebuild() && !ArgChanged)
8892     return E;
8893 
8894   return getDerived().RebuildTypeTrait(E->getTrait(),
8895                                        E->getLocStart(),
8896                                        Args,
8897                                        E->getLocEnd());
8898 }
8899 
8900 template<typename Derived>
8901 ExprResult
TransformArrayTypeTraitExpr(ArrayTypeTraitExpr * E)8902 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
8903   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
8904   if (!T)
8905     return ExprError();
8906 
8907   if (!getDerived().AlwaysRebuild() &&
8908       T == E->getQueriedTypeSourceInfo())
8909     return E;
8910 
8911   ExprResult SubExpr;
8912   {
8913     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8914     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
8915     if (SubExpr.isInvalid())
8916       return ExprError();
8917 
8918     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
8919       return E;
8920   }
8921 
8922   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
8923                                             E->getLocStart(),
8924                                             T,
8925                                             SubExpr.get(),
8926                                             E->getLocEnd());
8927 }
8928 
8929 template<typename Derived>
8930 ExprResult
TransformExpressionTraitExpr(ExpressionTraitExpr * E)8931 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
8932   ExprResult SubExpr;
8933   {
8934     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8935     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
8936     if (SubExpr.isInvalid())
8937       return ExprError();
8938 
8939     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
8940       return E;
8941   }
8942 
8943   return getDerived().RebuildExpressionTrait(
8944       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
8945 }
8946 
8947 template <typename Derived>
TransformParenDependentScopeDeclRefExpr(ParenExpr * PE,DependentScopeDeclRefExpr * DRE,bool AddrTaken,TypeSourceInfo ** RecoveryTSI)8948 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
8949     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
8950     TypeSourceInfo **RecoveryTSI) {
8951   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
8952       DRE, AddrTaken, RecoveryTSI);
8953 
8954   // Propagate both errors and recovered types, which return ExprEmpty.
8955   if (!NewDRE.isUsable())
8956     return NewDRE;
8957 
8958   // We got an expr, wrap it up in parens.
8959   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
8960     return PE;
8961   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
8962                                        PE->getRParen());
8963 }
8964 
8965 template <typename Derived>
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)8966 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8967     DependentScopeDeclRefExpr *E) {
8968   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
8969                                             nullptr);
8970 }
8971 
8972 template<typename Derived>
8973 ExprResult
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)8974 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8975                                                DependentScopeDeclRefExpr *E,
8976                                                bool IsAddressOfOperand,
8977                                                TypeSourceInfo **RecoveryTSI) {
8978   assert(E->getQualifierLoc());
8979   NestedNameSpecifierLoc QualifierLoc
8980   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8981   if (!QualifierLoc)
8982     return ExprError();
8983   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8984 
8985   // TODO: If this is a conversion-function-id, verify that the
8986   // destination type name (if present) resolves the same way after
8987   // instantiation as it did in the local scope.
8988 
8989   DeclarationNameInfo NameInfo
8990     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
8991   if (!NameInfo.getName())
8992     return ExprError();
8993 
8994   if (!E->hasExplicitTemplateArgs()) {
8995     if (!getDerived().AlwaysRebuild() &&
8996         QualifierLoc == E->getQualifierLoc() &&
8997         // Note: it is sufficient to compare the Name component of NameInfo:
8998         // if name has not changed, DNLoc has not changed either.
8999         NameInfo.getName() == E->getDeclName())
9000       return E;
9001 
9002     return getDerived().RebuildDependentScopeDeclRefExpr(
9003         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
9004         IsAddressOfOperand, RecoveryTSI);
9005   }
9006 
9007   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9008   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9009                                               E->getNumTemplateArgs(),
9010                                               TransArgs))
9011     return ExprError();
9012 
9013   return getDerived().RebuildDependentScopeDeclRefExpr(
9014       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
9015       RecoveryTSI);
9016 }
9017 
9018 template<typename Derived>
9019 ExprResult
TransformCXXConstructExpr(CXXConstructExpr * E)9020 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
9021   // CXXConstructExprs other than for list-initialization and
9022   // CXXTemporaryObjectExpr are always implicit, so when we have
9023   // a 1-argument construction we just transform that argument.
9024   if ((E->getNumArgs() == 1 ||
9025        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
9026       (!getDerived().DropCallArgument(E->getArg(0))) &&
9027       !E->isListInitialization())
9028     return getDerived().TransformExpr(E->getArg(0));
9029 
9030   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
9031 
9032   QualType T = getDerived().TransformType(E->getType());
9033   if (T.isNull())
9034     return ExprError();
9035 
9036   CXXConstructorDecl *Constructor
9037     = cast_or_null<CXXConstructorDecl>(
9038                                 getDerived().TransformDecl(E->getLocStart(),
9039                                                          E->getConstructor()));
9040   if (!Constructor)
9041     return ExprError();
9042 
9043   bool ArgumentChanged = false;
9044   SmallVector<Expr*, 8> Args;
9045   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9046                                   &ArgumentChanged))
9047     return ExprError();
9048 
9049   if (!getDerived().AlwaysRebuild() &&
9050       T == E->getType() &&
9051       Constructor == E->getConstructor() &&
9052       !ArgumentChanged) {
9053     // Mark the constructor as referenced.
9054     // FIXME: Instantiation-specific
9055     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9056     return E;
9057   }
9058 
9059   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
9060                                               Constructor, E->isElidable(),
9061                                               Args,
9062                                               E->hadMultipleCandidates(),
9063                                               E->isListInitialization(),
9064                                               E->isStdInitListInitialization(),
9065                                               E->requiresZeroInitialization(),
9066                                               E->getConstructionKind(),
9067                                               E->getParenOrBraceRange());
9068 }
9069 
9070 /// \brief Transform a C++ temporary-binding expression.
9071 ///
9072 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
9073 /// transform the subexpression and return that.
9074 template<typename Derived>
9075 ExprResult
TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)9076 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
9077   return getDerived().TransformExpr(E->getSubExpr());
9078 }
9079 
9080 /// \brief Transform a C++ expression that contains cleanups that should
9081 /// be run after the expression is evaluated.
9082 ///
9083 /// Since ExprWithCleanups nodes are implicitly generated, we
9084 /// just transform the subexpression and return that.
9085 template<typename Derived>
9086 ExprResult
TransformExprWithCleanups(ExprWithCleanups * E)9087 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
9088   return getDerived().TransformExpr(E->getSubExpr());
9089 }
9090 
9091 template<typename Derived>
9092 ExprResult
TransformCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)9093 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
9094                                                     CXXTemporaryObjectExpr *E) {
9095   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9096   if (!T)
9097     return ExprError();
9098 
9099   CXXConstructorDecl *Constructor
9100     = cast_or_null<CXXConstructorDecl>(
9101                                   getDerived().TransformDecl(E->getLocStart(),
9102                                                          E->getConstructor()));
9103   if (!Constructor)
9104     return ExprError();
9105 
9106   bool ArgumentChanged = false;
9107   SmallVector<Expr*, 8> Args;
9108   Args.reserve(E->getNumArgs());
9109   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9110                      &ArgumentChanged))
9111     return ExprError();
9112 
9113   if (!getDerived().AlwaysRebuild() &&
9114       T == E->getTypeSourceInfo() &&
9115       Constructor == E->getConstructor() &&
9116       !ArgumentChanged) {
9117     // FIXME: Instantiation-specific
9118     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9119     return SemaRef.MaybeBindToTemporary(E);
9120   }
9121 
9122   // FIXME: Pass in E->isListInitialization().
9123   return getDerived().RebuildCXXTemporaryObjectExpr(T,
9124                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9125                                                     Args,
9126                                                     E->getLocEnd());
9127 }
9128 
9129 template<typename Derived>
9130 ExprResult
TransformLambdaExpr(LambdaExpr * E)9131 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
9132   // Transform any init-capture expressions before entering the scope of the
9133   // lambda body, because they are not semantically within that scope.
9134   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
9135   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
9136       E->explicit_capture_begin());
9137   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9138                                     CEnd = E->capture_end();
9139        C != CEnd; ++C) {
9140     if (!C->isInitCapture())
9141       continue;
9142     EnterExpressionEvaluationContext EEEC(getSema(),
9143                                           Sema::PotentiallyEvaluated);
9144     ExprResult NewExprInitResult = getDerived().TransformInitializer(
9145         C->getCapturedVar()->getInit(),
9146         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
9147 
9148     if (NewExprInitResult.isInvalid())
9149       return ExprError();
9150     Expr *NewExprInit = NewExprInitResult.get();
9151 
9152     VarDecl *OldVD = C->getCapturedVar();
9153     QualType NewInitCaptureType =
9154         getSema().performLambdaInitCaptureInitialization(C->getLocation(),
9155             OldVD->getType()->isReferenceType(), OldVD->getIdentifier(),
9156             NewExprInit);
9157     NewExprInitResult = NewExprInit;
9158     InitCaptureExprsAndTypes[C - E->capture_begin()] =
9159         std::make_pair(NewExprInitResult, NewInitCaptureType);
9160   }
9161 
9162   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
9163   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
9164 
9165   // Transform the template parameters, and add them to the current
9166   // instantiation scope. The null case is handled correctly.
9167   LSI->GLTemplateParameterList = getDerived().TransformTemplateParameterList(
9168       E->getTemplateParameterList());
9169 
9170   // Transform the type of the original lambda's call operator.
9171   // The transformation MUST be done in the CurrentInstantiationScope since
9172   // it introduces a mapping of the original to the newly created
9173   // transformed parameters.
9174   TypeSourceInfo *NewCallOpTSI = nullptr;
9175   {
9176     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
9177     FunctionProtoTypeLoc OldCallOpFPTL =
9178         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
9179 
9180     TypeLocBuilder NewCallOpTLBuilder;
9181     SmallVector<QualType, 4> ExceptionStorage;
9182     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
9183     QualType NewCallOpType = TransformFunctionProtoType(
9184         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
9185         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
9186           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
9187                                               ExceptionStorage, Changed);
9188         });
9189     if (NewCallOpType.isNull())
9190       return ExprError();
9191     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
9192                                                         NewCallOpType);
9193   }
9194 
9195   // Create the local class that will describe the lambda.
9196   CXXRecordDecl *Class
9197     = getSema().createLambdaClosureType(E->getIntroducerRange(),
9198                                         NewCallOpTSI,
9199                                         /*KnownDependent=*/false,
9200                                         E->getCaptureDefault());
9201   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
9202 
9203   // Build the call operator.
9204   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
9205       Class, E->getIntroducerRange(), NewCallOpTSI,
9206       E->getCallOperator()->getLocEnd(),
9207       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams());
9208   LSI->CallOperator = NewCallOperator;
9209 
9210   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
9211 
9212   // TransformLambdaScope will manage the function scope, so we can disable the
9213   // cleanup.
9214   FuncScopeCleanup.disable();
9215 
9216   return getDerived().TransformLambdaScope(E, NewCallOperator,
9217       InitCaptureExprsAndTypes);
9218 }
9219 
9220 template<typename Derived>
9221 ExprResult
TransformLambdaScope(LambdaExpr * E,CXXMethodDecl * CallOperator,ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes)9222 TreeTransform<Derived>::TransformLambdaScope(LambdaExpr *E,
9223     CXXMethodDecl *CallOperator,
9224     ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes) {
9225   bool Invalid = false;
9226 
9227   // Introduce the context of the call operator.
9228   Sema::ContextRAII SavedContext(getSema(), CallOperator,
9229                                  /*NewThisContext*/false);
9230 
9231   LambdaScopeInfo *const LSI = getSema().getCurLambda();
9232   // Enter the scope of the lambda.
9233   getSema().buildLambdaScope(LSI, CallOperator, E->getIntroducerRange(),
9234                                  E->getCaptureDefault(),
9235                                  E->getCaptureDefaultLoc(),
9236                                  E->hasExplicitParameters(),
9237                                  E->hasExplicitResultType(),
9238                                  E->isMutable());
9239 
9240   // Transform captures.
9241   bool FinishedExplicitCaptures = false;
9242   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9243                                  CEnd = E->capture_end();
9244        C != CEnd; ++C) {
9245     // When we hit the first implicit capture, tell Sema that we've finished
9246     // the list of explicit captures.
9247     if (!FinishedExplicitCaptures && C->isImplicit()) {
9248       getSema().finishLambdaExplicitCaptures(LSI);
9249       FinishedExplicitCaptures = true;
9250     }
9251 
9252     // Capturing 'this' is trivial.
9253     if (C->capturesThis()) {
9254       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit());
9255       continue;
9256     }
9257     // Captured expression will be recaptured during captured variables
9258     // rebuilding.
9259     if (C->capturesVLAType())
9260       continue;
9261 
9262     // Rebuild init-captures, including the implied field declaration.
9263     if (C->isInitCapture()) {
9264 
9265       InitCaptureInfoTy InitExprTypePair =
9266           InitCaptureExprsAndTypes[C - E->capture_begin()];
9267       ExprResult Init = InitExprTypePair.first;
9268       QualType InitQualType = InitExprTypePair.second;
9269       if (Init.isInvalid() || InitQualType.isNull()) {
9270         Invalid = true;
9271         continue;
9272       }
9273       VarDecl *OldVD = C->getCapturedVar();
9274       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
9275           OldVD->getLocation(), InitExprTypePair.second,
9276           OldVD->getIdentifier(), Init.get());
9277       if (!NewVD)
9278         Invalid = true;
9279       else {
9280         getDerived().transformedLocalDecl(OldVD, NewVD);
9281       }
9282       getSema().buildInitCaptureField(LSI, NewVD);
9283       continue;
9284     }
9285 
9286     assert(C->capturesVariable() && "unexpected kind of lambda capture");
9287 
9288     // Determine the capture kind for Sema.
9289     Sema::TryCaptureKind Kind
9290       = C->isImplicit()? Sema::TryCapture_Implicit
9291                        : C->getCaptureKind() == LCK_ByCopy
9292                            ? Sema::TryCapture_ExplicitByVal
9293                            : Sema::TryCapture_ExplicitByRef;
9294     SourceLocation EllipsisLoc;
9295     if (C->isPackExpansion()) {
9296       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
9297       bool ShouldExpand = false;
9298       bool RetainExpansion = false;
9299       Optional<unsigned> NumExpansions;
9300       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
9301                                                C->getLocation(),
9302                                                Unexpanded,
9303                                                ShouldExpand, RetainExpansion,
9304                                                NumExpansions)) {
9305         Invalid = true;
9306         continue;
9307       }
9308 
9309       if (ShouldExpand) {
9310         // The transform has determined that we should perform an expansion;
9311         // transform and capture each of the arguments.
9312         // expansion of the pattern. Do so.
9313         VarDecl *Pack = C->getCapturedVar();
9314         for (unsigned I = 0; I != *NumExpansions; ++I) {
9315           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9316           VarDecl *CapturedVar
9317             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9318                                                                Pack));
9319           if (!CapturedVar) {
9320             Invalid = true;
9321             continue;
9322           }
9323 
9324           // Capture the transformed variable.
9325           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
9326         }
9327 
9328         // FIXME: Retain a pack expansion if RetainExpansion is true.
9329 
9330         continue;
9331       }
9332 
9333       EllipsisLoc = C->getEllipsisLoc();
9334     }
9335 
9336     // Transform the captured variable.
9337     VarDecl *CapturedVar
9338       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9339                                                          C->getCapturedVar()));
9340     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
9341       Invalid = true;
9342       continue;
9343     }
9344 
9345     // Capture the transformed variable.
9346     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
9347   }
9348   if (!FinishedExplicitCaptures)
9349     getSema().finishLambdaExplicitCaptures(LSI);
9350 
9351 
9352   // Enter a new evaluation context to insulate the lambda from any
9353   // cleanups from the enclosing full-expression.
9354   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
9355 
9356   if (Invalid) {
9357     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
9358                                /*IsInstantiation=*/true);
9359     return ExprError();
9360   }
9361 
9362   // Instantiate the body of the lambda expression.
9363   StmtResult Body = getDerived().TransformStmt(E->getBody());
9364   if (Body.isInvalid()) {
9365     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
9366                                /*IsInstantiation=*/true);
9367     return ExprError();
9368   }
9369 
9370   return getSema().ActOnLambdaExpr(E->getLocStart(), Body.get(),
9371                                    /*CurScope=*/nullptr,
9372                                    /*IsInstantiation=*/true);
9373 }
9374 
9375 template<typename Derived>
9376 ExprResult
TransformCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)9377 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
9378                                                   CXXUnresolvedConstructExpr *E) {
9379   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9380   if (!T)
9381     return ExprError();
9382 
9383   bool ArgumentChanged = false;
9384   SmallVector<Expr*, 8> Args;
9385   Args.reserve(E->arg_size());
9386   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
9387                                   &ArgumentChanged))
9388     return ExprError();
9389 
9390   if (!getDerived().AlwaysRebuild() &&
9391       T == E->getTypeSourceInfo() &&
9392       !ArgumentChanged)
9393     return E;
9394 
9395   // FIXME: we're faking the locations of the commas
9396   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
9397                                                         E->getLParenLoc(),
9398                                                         Args,
9399                                                         E->getRParenLoc());
9400 }
9401 
9402 template<typename Derived>
9403 ExprResult
TransformCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)9404 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
9405                                              CXXDependentScopeMemberExpr *E) {
9406   // Transform the base of the expression.
9407   ExprResult Base((Expr*) nullptr);
9408   Expr *OldBase;
9409   QualType BaseType;
9410   QualType ObjectType;
9411   if (!E->isImplicitAccess()) {
9412     OldBase = E->getBase();
9413     Base = getDerived().TransformExpr(OldBase);
9414     if (Base.isInvalid())
9415       return ExprError();
9416 
9417     // Start the member reference and compute the object's type.
9418     ParsedType ObjectTy;
9419     bool MayBePseudoDestructor = false;
9420     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9421                                                 E->getOperatorLoc(),
9422                                       E->isArrow()? tok::arrow : tok::period,
9423                                                 ObjectTy,
9424                                                 MayBePseudoDestructor);
9425     if (Base.isInvalid())
9426       return ExprError();
9427 
9428     ObjectType = ObjectTy.get();
9429     BaseType = ((Expr*) Base.get())->getType();
9430   } else {
9431     OldBase = nullptr;
9432     BaseType = getDerived().TransformType(E->getBaseType());
9433     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
9434   }
9435 
9436   // Transform the first part of the nested-name-specifier that qualifies
9437   // the member name.
9438   NamedDecl *FirstQualifierInScope
9439     = getDerived().TransformFirstQualifierInScope(
9440                                             E->getFirstQualifierFoundInScope(),
9441                                             E->getQualifierLoc().getBeginLoc());
9442 
9443   NestedNameSpecifierLoc QualifierLoc;
9444   if (E->getQualifier()) {
9445     QualifierLoc
9446       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
9447                                                      ObjectType,
9448                                                      FirstQualifierInScope);
9449     if (!QualifierLoc)
9450       return ExprError();
9451   }
9452 
9453   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9454 
9455   // TODO: If this is a conversion-function-id, verify that the
9456   // destination type name (if present) resolves the same way after
9457   // instantiation as it did in the local scope.
9458 
9459   DeclarationNameInfo NameInfo
9460     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
9461   if (!NameInfo.getName())
9462     return ExprError();
9463 
9464   if (!E->hasExplicitTemplateArgs()) {
9465     // This is a reference to a member without an explicitly-specified
9466     // template argument list. Optimize for this common case.
9467     if (!getDerived().AlwaysRebuild() &&
9468         Base.get() == OldBase &&
9469         BaseType == E->getBaseType() &&
9470         QualifierLoc == E->getQualifierLoc() &&
9471         NameInfo.getName() == E->getMember() &&
9472         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
9473       return E;
9474 
9475     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9476                                                        BaseType,
9477                                                        E->isArrow(),
9478                                                        E->getOperatorLoc(),
9479                                                        QualifierLoc,
9480                                                        TemplateKWLoc,
9481                                                        FirstQualifierInScope,
9482                                                        NameInfo,
9483                                                        /*TemplateArgs*/nullptr);
9484   }
9485 
9486   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9487   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9488                                               E->getNumTemplateArgs(),
9489                                               TransArgs))
9490     return ExprError();
9491 
9492   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9493                                                      BaseType,
9494                                                      E->isArrow(),
9495                                                      E->getOperatorLoc(),
9496                                                      QualifierLoc,
9497                                                      TemplateKWLoc,
9498                                                      FirstQualifierInScope,
9499                                                      NameInfo,
9500                                                      &TransArgs);
9501 }
9502 
9503 template<typename Derived>
9504 ExprResult
TransformUnresolvedMemberExpr(UnresolvedMemberExpr * Old)9505 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
9506   // Transform the base of the expression.
9507   ExprResult Base((Expr*) nullptr);
9508   QualType BaseType;
9509   if (!Old->isImplicitAccess()) {
9510     Base = getDerived().TransformExpr(Old->getBase());
9511     if (Base.isInvalid())
9512       return ExprError();
9513     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
9514                                                      Old->isArrow());
9515     if (Base.isInvalid())
9516       return ExprError();
9517     BaseType = Base.get()->getType();
9518   } else {
9519     BaseType = getDerived().TransformType(Old->getBaseType());
9520   }
9521 
9522   NestedNameSpecifierLoc QualifierLoc;
9523   if (Old->getQualifierLoc()) {
9524     QualifierLoc
9525     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9526     if (!QualifierLoc)
9527       return ExprError();
9528   }
9529 
9530   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9531 
9532   LookupResult R(SemaRef, Old->getMemberNameInfo(),
9533                  Sema::LookupOrdinaryName);
9534 
9535   // Transform all the decls.
9536   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
9537          E = Old->decls_end(); I != E; ++I) {
9538     NamedDecl *InstD = static_cast<NamedDecl*>(
9539                                 getDerived().TransformDecl(Old->getMemberLoc(),
9540                                                            *I));
9541     if (!InstD) {
9542       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9543       // This can happen because of dependent hiding.
9544       if (isa<UsingShadowDecl>(*I))
9545         continue;
9546       else {
9547         R.clear();
9548         return ExprError();
9549       }
9550     }
9551 
9552     // Expand using declarations.
9553     if (isa<UsingDecl>(InstD)) {
9554       UsingDecl *UD = cast<UsingDecl>(InstD);
9555       for (auto *I : UD->shadows())
9556         R.addDecl(I);
9557       continue;
9558     }
9559 
9560     R.addDecl(InstD);
9561   }
9562 
9563   R.resolveKind();
9564 
9565   // Determine the naming class.
9566   if (Old->getNamingClass()) {
9567     CXXRecordDecl *NamingClass
9568       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9569                                                           Old->getMemberLoc(),
9570                                                         Old->getNamingClass()));
9571     if (!NamingClass)
9572       return ExprError();
9573 
9574     R.setNamingClass(NamingClass);
9575   }
9576 
9577   TemplateArgumentListInfo TransArgs;
9578   if (Old->hasExplicitTemplateArgs()) {
9579     TransArgs.setLAngleLoc(Old->getLAngleLoc());
9580     TransArgs.setRAngleLoc(Old->getRAngleLoc());
9581     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9582                                                 Old->getNumTemplateArgs(),
9583                                                 TransArgs))
9584       return ExprError();
9585   }
9586 
9587   // FIXME: to do this check properly, we will need to preserve the
9588   // first-qualifier-in-scope here, just in case we had a dependent
9589   // base (and therefore couldn't do the check) and a
9590   // nested-name-qualifier (and therefore could do the lookup).
9591   NamedDecl *FirstQualifierInScope = nullptr;
9592 
9593   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
9594                                                   BaseType,
9595                                                   Old->getOperatorLoc(),
9596                                                   Old->isArrow(),
9597                                                   QualifierLoc,
9598                                                   TemplateKWLoc,
9599                                                   FirstQualifierInScope,
9600                                                   R,
9601                                               (Old->hasExplicitTemplateArgs()
9602                                                   ? &TransArgs : nullptr));
9603 }
9604 
9605 template<typename Derived>
9606 ExprResult
TransformCXXNoexceptExpr(CXXNoexceptExpr * E)9607 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
9608   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9609   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
9610   if (SubExpr.isInvalid())
9611     return ExprError();
9612 
9613   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
9614     return E;
9615 
9616   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
9617 }
9618 
9619 template<typename Derived>
9620 ExprResult
TransformPackExpansionExpr(PackExpansionExpr * E)9621 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
9622   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
9623   if (Pattern.isInvalid())
9624     return ExprError();
9625 
9626   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
9627     return E;
9628 
9629   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
9630                                            E->getNumExpansions());
9631 }
9632 
9633 template<typename Derived>
9634 ExprResult
TransformSizeOfPackExpr(SizeOfPackExpr * E)9635 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
9636   // If E is not value-dependent, then nothing will change when we transform it.
9637   // Note: This is an instantiation-centric view.
9638   if (!E->isValueDependent())
9639     return E;
9640 
9641   // Note: None of the implementations of TryExpandParameterPacks can ever
9642   // produce a diagnostic when given only a single unexpanded parameter pack,
9643   // so
9644   UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
9645   bool ShouldExpand = false;
9646   bool RetainExpansion = false;
9647   Optional<unsigned> NumExpansions;
9648   if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
9649                                            Unexpanded,
9650                                            ShouldExpand, RetainExpansion,
9651                                            NumExpansions))
9652     return ExprError();
9653 
9654   if (RetainExpansion)
9655     return E;
9656 
9657   NamedDecl *Pack = E->getPack();
9658   if (!ShouldExpand) {
9659     Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(),
9660                                                               Pack));
9661     if (!Pack)
9662       return ExprError();
9663   }
9664 
9665 
9666   // We now know the length of the parameter pack, so build a new expression
9667   // that stores that length.
9668   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
9669                                             E->getPackLoc(), E->getRParenLoc(),
9670                                             NumExpansions);
9671 }
9672 
9673 template<typename Derived>
9674 ExprResult
TransformSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)9675 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
9676                                           SubstNonTypeTemplateParmPackExpr *E) {
9677   // Default behavior is to do nothing with this transformation.
9678   return E;
9679 }
9680 
9681 template<typename Derived>
9682 ExprResult
TransformSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)9683 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
9684                                           SubstNonTypeTemplateParmExpr *E) {
9685   // Default behavior is to do nothing with this transformation.
9686   return E;
9687 }
9688 
9689 template<typename Derived>
9690 ExprResult
TransformFunctionParmPackExpr(FunctionParmPackExpr * E)9691 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
9692   // Default behavior is to do nothing with this transformation.
9693   return E;
9694 }
9695 
9696 template<typename Derived>
9697 ExprResult
TransformMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)9698 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
9699                                                   MaterializeTemporaryExpr *E) {
9700   return getDerived().TransformExpr(E->GetTemporaryExpr());
9701 }
9702 
9703 template<typename Derived>
9704 ExprResult
TransformCXXFoldExpr(CXXFoldExpr * E)9705 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
9706   Expr *Pattern = E->getPattern();
9707 
9708   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9709   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
9710   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9711 
9712   // Determine whether the set of unexpanded parameter packs can and should
9713   // be expanded.
9714   bool Expand = true;
9715   bool RetainExpansion = false;
9716   Optional<unsigned> NumExpansions;
9717   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
9718                                            Pattern->getSourceRange(),
9719                                            Unexpanded,
9720                                            Expand, RetainExpansion,
9721                                            NumExpansions))
9722     return true;
9723 
9724   if (!Expand) {
9725     // Do not expand any packs here, just transform and rebuild a fold
9726     // expression.
9727     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9728 
9729     ExprResult LHS =
9730         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
9731     if (LHS.isInvalid())
9732       return true;
9733 
9734     ExprResult RHS =
9735         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
9736     if (RHS.isInvalid())
9737       return true;
9738 
9739     if (!getDerived().AlwaysRebuild() &&
9740         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
9741       return E;
9742 
9743     return getDerived().RebuildCXXFoldExpr(
9744         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
9745         RHS.get(), E->getLocEnd());
9746   }
9747 
9748   // The transform has determined that we should perform an elementwise
9749   // expansion of the pattern. Do so.
9750   ExprResult Result = getDerived().TransformExpr(E->getInit());
9751   if (Result.isInvalid())
9752     return true;
9753   bool LeftFold = E->isLeftFold();
9754 
9755   // If we're retaining an expansion for a right fold, it is the innermost
9756   // component and takes the init (if any).
9757   if (!LeftFold && RetainExpansion) {
9758     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9759 
9760     ExprResult Out = getDerived().TransformExpr(Pattern);
9761     if (Out.isInvalid())
9762       return true;
9763 
9764     Result = getDerived().RebuildCXXFoldExpr(
9765         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
9766         Result.get(), E->getLocEnd());
9767     if (Result.isInvalid())
9768       return true;
9769   }
9770 
9771   for (unsigned I = 0; I != *NumExpansions; ++I) {
9772     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
9773         getSema(), LeftFold ? I : *NumExpansions - I - 1);
9774     ExprResult Out = getDerived().TransformExpr(Pattern);
9775     if (Out.isInvalid())
9776       return true;
9777 
9778     if (Out.get()->containsUnexpandedParameterPack()) {
9779       // We still have a pack; retain a pack expansion for this slice.
9780       Result = getDerived().RebuildCXXFoldExpr(
9781           E->getLocStart(),
9782           LeftFold ? Result.get() : Out.get(),
9783           E->getOperator(), E->getEllipsisLoc(),
9784           LeftFold ? Out.get() : Result.get(),
9785           E->getLocEnd());
9786     } else if (Result.isUsable()) {
9787       // We've got down to a single element; build a binary operator.
9788       Result = getDerived().RebuildBinaryOperator(
9789           E->getEllipsisLoc(), E->getOperator(),
9790           LeftFold ? Result.get() : Out.get(),
9791           LeftFold ? Out.get() : Result.get());
9792     } else
9793       Result = Out;
9794 
9795     if (Result.isInvalid())
9796       return true;
9797   }
9798 
9799   // If we're retaining an expansion for a left fold, it is the outermost
9800   // component and takes the complete expansion so far as its init (if any).
9801   if (LeftFold && RetainExpansion) {
9802     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9803 
9804     ExprResult Out = getDerived().TransformExpr(Pattern);
9805     if (Out.isInvalid())
9806       return true;
9807 
9808     Result = getDerived().RebuildCXXFoldExpr(
9809         E->getLocStart(), Result.get(),
9810         E->getOperator(), E->getEllipsisLoc(),
9811         Out.get(), E->getLocEnd());
9812     if (Result.isInvalid())
9813       return true;
9814   }
9815 
9816   // If we had no init and an empty pack, and we're not retaining an expansion,
9817   // then produce a fallback value or error.
9818   if (Result.isUnset())
9819     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
9820                                                 E->getOperator());
9821 
9822   return Result;
9823 }
9824 
9825 template<typename Derived>
9826 ExprResult
TransformCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)9827 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
9828     CXXStdInitializerListExpr *E) {
9829   return getDerived().TransformExpr(E->getSubExpr());
9830 }
9831 
9832 template<typename Derived>
9833 ExprResult
TransformObjCStringLiteral(ObjCStringLiteral * E)9834 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
9835   return SemaRef.MaybeBindToTemporary(E);
9836 }
9837 
9838 template<typename Derived>
9839 ExprResult
TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)9840 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
9841   return E;
9842 }
9843 
9844 template<typename Derived>
9845 ExprResult
TransformObjCBoxedExpr(ObjCBoxedExpr * E)9846 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
9847   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9848   if (SubExpr.isInvalid())
9849     return ExprError();
9850 
9851   if (!getDerived().AlwaysRebuild() &&
9852       SubExpr.get() == E->getSubExpr())
9853     return E;
9854 
9855   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
9856 }
9857 
9858 template<typename Derived>
9859 ExprResult
TransformObjCArrayLiteral(ObjCArrayLiteral * E)9860 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
9861   // Transform each of the elements.
9862   SmallVector<Expr *, 8> Elements;
9863   bool ArgChanged = false;
9864   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
9865                                   /*IsCall=*/false, Elements, &ArgChanged))
9866     return ExprError();
9867 
9868   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9869     return SemaRef.MaybeBindToTemporary(E);
9870 
9871   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
9872                                               Elements.data(),
9873                                               Elements.size());
9874 }
9875 
9876 template<typename Derived>
9877 ExprResult
TransformObjCDictionaryLiteral(ObjCDictionaryLiteral * E)9878 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
9879                                                     ObjCDictionaryLiteral *E) {
9880   // Transform each of the elements.
9881   SmallVector<ObjCDictionaryElement, 8> Elements;
9882   bool ArgChanged = false;
9883   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
9884     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
9885 
9886     if (OrigElement.isPackExpansion()) {
9887       // This key/value element is a pack expansion.
9888       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9889       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
9890       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
9891       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9892 
9893       // Determine whether the set of unexpanded parameter packs can
9894       // and should be expanded.
9895       bool Expand = true;
9896       bool RetainExpansion = false;
9897       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
9898       Optional<unsigned> NumExpansions = OrigNumExpansions;
9899       SourceRange PatternRange(OrigElement.Key->getLocStart(),
9900                                OrigElement.Value->getLocEnd());
9901      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
9902                                                PatternRange,
9903                                                Unexpanded,
9904                                                Expand, RetainExpansion,
9905                                                NumExpansions))
9906         return ExprError();
9907 
9908       if (!Expand) {
9909         // The transform has determined that we should perform a simple
9910         // transformation on the pack expansion, producing another pack
9911         // expansion.
9912         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9913         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9914         if (Key.isInvalid())
9915           return ExprError();
9916 
9917         if (Key.get() != OrigElement.Key)
9918           ArgChanged = true;
9919 
9920         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9921         if (Value.isInvalid())
9922           return ExprError();
9923 
9924         if (Value.get() != OrigElement.Value)
9925           ArgChanged = true;
9926 
9927         ObjCDictionaryElement Expansion = {
9928           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
9929         };
9930         Elements.push_back(Expansion);
9931         continue;
9932       }
9933 
9934       // Record right away that the argument was changed.  This needs
9935       // to happen even if the array expands to nothing.
9936       ArgChanged = true;
9937 
9938       // The transform has determined that we should perform an elementwise
9939       // expansion of the pattern. Do so.
9940       for (unsigned I = 0; I != *NumExpansions; ++I) {
9941         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9942         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9943         if (Key.isInvalid())
9944           return ExprError();
9945 
9946         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9947         if (Value.isInvalid())
9948           return ExprError();
9949 
9950         ObjCDictionaryElement Element = {
9951           Key.get(), Value.get(), SourceLocation(), NumExpansions
9952         };
9953 
9954         // If any unexpanded parameter packs remain, we still have a
9955         // pack expansion.
9956         // FIXME: Can this really happen?
9957         if (Key.get()->containsUnexpandedParameterPack() ||
9958             Value.get()->containsUnexpandedParameterPack())
9959           Element.EllipsisLoc = OrigElement.EllipsisLoc;
9960 
9961         Elements.push_back(Element);
9962       }
9963 
9964       // FIXME: Retain a pack expansion if RetainExpansion is true.
9965 
9966       // We've finished with this pack expansion.
9967       continue;
9968     }
9969 
9970     // Transform and check key.
9971     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9972     if (Key.isInvalid())
9973       return ExprError();
9974 
9975     if (Key.get() != OrigElement.Key)
9976       ArgChanged = true;
9977 
9978     // Transform and check value.
9979     ExprResult Value
9980       = getDerived().TransformExpr(OrigElement.Value);
9981     if (Value.isInvalid())
9982       return ExprError();
9983 
9984     if (Value.get() != OrigElement.Value)
9985       ArgChanged = true;
9986 
9987     ObjCDictionaryElement Element = {
9988       Key.get(), Value.get(), SourceLocation(), None
9989     };
9990     Elements.push_back(Element);
9991   }
9992 
9993   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9994     return SemaRef.MaybeBindToTemporary(E);
9995 
9996   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
9997                                                    Elements.data(),
9998                                                    Elements.size());
9999 }
10000 
10001 template<typename Derived>
10002 ExprResult
TransformObjCEncodeExpr(ObjCEncodeExpr * E)10003 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
10004   TypeSourceInfo *EncodedTypeInfo
10005     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
10006   if (!EncodedTypeInfo)
10007     return ExprError();
10008 
10009   if (!getDerived().AlwaysRebuild() &&
10010       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
10011     return E;
10012 
10013   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
10014                                             EncodedTypeInfo,
10015                                             E->getRParenLoc());
10016 }
10017 
10018 template<typename Derived>
10019 ExprResult TreeTransform<Derived>::
TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)10020 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
10021   // This is a kind of implicit conversion, and it needs to get dropped
10022   // and recomputed for the same general reasons that ImplicitCastExprs
10023   // do, as well a more specific one: this expression is only valid when
10024   // it appears *immediately* as an argument expression.
10025   return getDerived().TransformExpr(E->getSubExpr());
10026 }
10027 
10028 template<typename Derived>
10029 ExprResult TreeTransform<Derived>::
TransformObjCBridgedCastExpr(ObjCBridgedCastExpr * E)10030 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
10031   TypeSourceInfo *TSInfo
10032     = getDerived().TransformType(E->getTypeInfoAsWritten());
10033   if (!TSInfo)
10034     return ExprError();
10035 
10036   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
10037   if (Result.isInvalid())
10038     return ExprError();
10039 
10040   if (!getDerived().AlwaysRebuild() &&
10041       TSInfo == E->getTypeInfoAsWritten() &&
10042       Result.get() == E->getSubExpr())
10043     return E;
10044 
10045   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
10046                                       E->getBridgeKeywordLoc(), TSInfo,
10047                                       Result.get());
10048 }
10049 
10050 template<typename Derived>
10051 ExprResult
TransformObjCMessageExpr(ObjCMessageExpr * E)10052 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
10053   // Transform arguments.
10054   bool ArgChanged = false;
10055   SmallVector<Expr*, 8> Args;
10056   Args.reserve(E->getNumArgs());
10057   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
10058                                   &ArgChanged))
10059     return ExprError();
10060 
10061   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
10062     // Class message: transform the receiver type.
10063     TypeSourceInfo *ReceiverTypeInfo
10064       = getDerived().TransformType(E->getClassReceiverTypeInfo());
10065     if (!ReceiverTypeInfo)
10066       return ExprError();
10067 
10068     // If nothing changed, just retain the existing message send.
10069     if (!getDerived().AlwaysRebuild() &&
10070         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
10071       return SemaRef.MaybeBindToTemporary(E);
10072 
10073     // Build a new class message send.
10074     SmallVector<SourceLocation, 16> SelLocs;
10075     E->getSelectorLocs(SelLocs);
10076     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
10077                                                E->getSelector(),
10078                                                SelLocs,
10079                                                E->getMethodDecl(),
10080                                                E->getLeftLoc(),
10081                                                Args,
10082                                                E->getRightLoc());
10083   }
10084   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
10085            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
10086     // Build a new class message send to 'super'.
10087     SmallVector<SourceLocation, 16> SelLocs;
10088     E->getSelectorLocs(SelLocs);
10089     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
10090                                                E->getSelector(),
10091                                                SelLocs,
10092                                                E->getMethodDecl(),
10093                                                E->getLeftLoc(),
10094                                                Args,
10095                                                E->getRightLoc());
10096   }
10097 
10098   // Instance message: transform the receiver
10099   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
10100          "Only class and instance messages may be instantiated");
10101   ExprResult Receiver
10102     = getDerived().TransformExpr(E->getInstanceReceiver());
10103   if (Receiver.isInvalid())
10104     return ExprError();
10105 
10106   // If nothing changed, just retain the existing message send.
10107   if (!getDerived().AlwaysRebuild() &&
10108       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
10109     return SemaRef.MaybeBindToTemporary(E);
10110 
10111   // Build a new instance message send.
10112   SmallVector<SourceLocation, 16> SelLocs;
10113   E->getSelectorLocs(SelLocs);
10114   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
10115                                              E->getSelector(),
10116                                              SelLocs,
10117                                              E->getMethodDecl(),
10118                                              E->getLeftLoc(),
10119                                              Args,
10120                                              E->getRightLoc());
10121 }
10122 
10123 template<typename Derived>
10124 ExprResult
TransformObjCSelectorExpr(ObjCSelectorExpr * E)10125 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
10126   return E;
10127 }
10128 
10129 template<typename Derived>
10130 ExprResult
TransformObjCProtocolExpr(ObjCProtocolExpr * E)10131 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
10132   return E;
10133 }
10134 
10135 template<typename Derived>
10136 ExprResult
TransformObjCIvarRefExpr(ObjCIvarRefExpr * E)10137 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
10138   // Transform the base expression.
10139   ExprResult Base = getDerived().TransformExpr(E->getBase());
10140   if (Base.isInvalid())
10141     return ExprError();
10142 
10143   // We don't need to transform the ivar; it will never change.
10144 
10145   // If nothing changed, just retain the existing expression.
10146   if (!getDerived().AlwaysRebuild() &&
10147       Base.get() == E->getBase())
10148     return E;
10149 
10150   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
10151                                              E->getLocation(),
10152                                              E->isArrow(), E->isFreeIvar());
10153 }
10154 
10155 template<typename Derived>
10156 ExprResult
TransformObjCPropertyRefExpr(ObjCPropertyRefExpr * E)10157 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
10158   // 'super' and types never change. Property never changes. Just
10159   // retain the existing expression.
10160   if (!E->isObjectReceiver())
10161     return E;
10162 
10163   // Transform the base expression.
10164   ExprResult Base = getDerived().TransformExpr(E->getBase());
10165   if (Base.isInvalid())
10166     return ExprError();
10167 
10168   // We don't need to transform the property; it will never change.
10169 
10170   // If nothing changed, just retain the existing expression.
10171   if (!getDerived().AlwaysRebuild() &&
10172       Base.get() == E->getBase())
10173     return E;
10174 
10175   if (E->isExplicitProperty())
10176     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10177                                                    E->getExplicitProperty(),
10178                                                    E->getLocation());
10179 
10180   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10181                                                  SemaRef.Context.PseudoObjectTy,
10182                                                  E->getImplicitPropertyGetter(),
10183                                                  E->getImplicitPropertySetter(),
10184                                                  E->getLocation());
10185 }
10186 
10187 template<typename Derived>
10188 ExprResult
TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)10189 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
10190   // Transform the base expression.
10191   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
10192   if (Base.isInvalid())
10193     return ExprError();
10194 
10195   // Transform the key expression.
10196   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
10197   if (Key.isInvalid())
10198     return ExprError();
10199 
10200   // If nothing changed, just retain the existing expression.
10201   if (!getDerived().AlwaysRebuild() &&
10202       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
10203     return E;
10204 
10205   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
10206                                                   Base.get(), Key.get(),
10207                                                   E->getAtIndexMethodDecl(),
10208                                                   E->setAtIndexMethodDecl());
10209 }
10210 
10211 template<typename Derived>
10212 ExprResult
TransformObjCIsaExpr(ObjCIsaExpr * E)10213 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
10214   // Transform the base expression.
10215   ExprResult Base = getDerived().TransformExpr(E->getBase());
10216   if (Base.isInvalid())
10217     return ExprError();
10218 
10219   // If nothing changed, just retain the existing expression.
10220   if (!getDerived().AlwaysRebuild() &&
10221       Base.get() == E->getBase())
10222     return E;
10223 
10224   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
10225                                          E->getOpLoc(),
10226                                          E->isArrow());
10227 }
10228 
10229 template<typename Derived>
10230 ExprResult
TransformShuffleVectorExpr(ShuffleVectorExpr * E)10231 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
10232   bool ArgumentChanged = false;
10233   SmallVector<Expr*, 8> SubExprs;
10234   SubExprs.reserve(E->getNumSubExprs());
10235   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10236                                   SubExprs, &ArgumentChanged))
10237     return ExprError();
10238 
10239   if (!getDerived().AlwaysRebuild() &&
10240       !ArgumentChanged)
10241     return E;
10242 
10243   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
10244                                                SubExprs,
10245                                                E->getRParenLoc());
10246 }
10247 
10248 template<typename Derived>
10249 ExprResult
TransformConvertVectorExpr(ConvertVectorExpr * E)10250 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
10251   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
10252   if (SrcExpr.isInvalid())
10253     return ExprError();
10254 
10255   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10256   if (!Type)
10257     return ExprError();
10258 
10259   if (!getDerived().AlwaysRebuild() &&
10260       Type == E->getTypeSourceInfo() &&
10261       SrcExpr.get() == E->getSrcExpr())
10262     return E;
10263 
10264   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
10265                                                SrcExpr.get(), Type,
10266                                                E->getRParenLoc());
10267 }
10268 
10269 template<typename Derived>
10270 ExprResult
TransformBlockExpr(BlockExpr * E)10271 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
10272   BlockDecl *oldBlock = E->getBlockDecl();
10273 
10274   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
10275   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
10276 
10277   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
10278   blockScope->TheDecl->setBlockMissingReturnType(
10279                          oldBlock->blockMissingReturnType());
10280 
10281   SmallVector<ParmVarDecl*, 4> params;
10282   SmallVector<QualType, 4> paramTypes;
10283 
10284   // Parameter substitution.
10285   if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
10286                                                oldBlock->param_begin(),
10287                                                oldBlock->param_size(),
10288                                                nullptr, paramTypes, &params)) {
10289     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10290     return ExprError();
10291   }
10292 
10293   const FunctionProtoType *exprFunctionType = E->getFunctionType();
10294   QualType exprResultType =
10295       getDerived().TransformType(exprFunctionType->getReturnType());
10296 
10297   QualType functionType =
10298     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes,
10299                                           exprFunctionType->getExtProtoInfo());
10300   blockScope->FunctionType = functionType;
10301 
10302   // Set the parameters on the block decl.
10303   if (!params.empty())
10304     blockScope->TheDecl->setParams(params);
10305 
10306   if (!oldBlock->blockMissingReturnType()) {
10307     blockScope->HasImplicitReturnType = false;
10308     blockScope->ReturnType = exprResultType;
10309   }
10310 
10311   // Transform the body
10312   StmtResult body = getDerived().TransformStmt(E->getBody());
10313   if (body.isInvalid()) {
10314     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10315     return ExprError();
10316   }
10317 
10318 #ifndef NDEBUG
10319   // In builds with assertions, make sure that we captured everything we
10320   // captured before.
10321   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
10322     for (const auto &I : oldBlock->captures()) {
10323       VarDecl *oldCapture = I.getVariable();
10324 
10325       // Ignore parameter packs.
10326       if (isa<ParmVarDecl>(oldCapture) &&
10327           cast<ParmVarDecl>(oldCapture)->isParameterPack())
10328         continue;
10329 
10330       VarDecl *newCapture =
10331         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
10332                                                  oldCapture));
10333       assert(blockScope->CaptureMap.count(newCapture));
10334     }
10335     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
10336   }
10337 #endif
10338 
10339   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
10340                                     /*Scope=*/nullptr);
10341 }
10342 
10343 template<typename Derived>
10344 ExprResult
TransformAsTypeExpr(AsTypeExpr * E)10345 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
10346   llvm_unreachable("Cannot transform asType expressions yet");
10347 }
10348 
10349 template<typename Derived>
10350 ExprResult
TransformAtomicExpr(AtomicExpr * E)10351 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
10352   QualType RetTy = getDerived().TransformType(E->getType());
10353   bool ArgumentChanged = false;
10354   SmallVector<Expr*, 8> SubExprs;
10355   SubExprs.reserve(E->getNumSubExprs());
10356   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10357                                   SubExprs, &ArgumentChanged))
10358     return ExprError();
10359 
10360   if (!getDerived().AlwaysRebuild() &&
10361       !ArgumentChanged)
10362     return E;
10363 
10364   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
10365                                         RetTy, E->getOp(), E->getRParenLoc());
10366 }
10367 
10368 //===----------------------------------------------------------------------===//
10369 // Type reconstruction
10370 //===----------------------------------------------------------------------===//
10371 
10372 template<typename Derived>
RebuildPointerType(QualType PointeeType,SourceLocation Star)10373 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
10374                                                     SourceLocation Star) {
10375   return SemaRef.BuildPointerType(PointeeType, Star,
10376                                   getDerived().getBaseEntity());
10377 }
10378 
10379 template<typename Derived>
RebuildBlockPointerType(QualType PointeeType,SourceLocation Star)10380 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
10381                                                          SourceLocation Star) {
10382   return SemaRef.BuildBlockPointerType(PointeeType, Star,
10383                                        getDerived().getBaseEntity());
10384 }
10385 
10386 template<typename Derived>
10387 QualType
RebuildReferenceType(QualType ReferentType,bool WrittenAsLValue,SourceLocation Sigil)10388 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
10389                                              bool WrittenAsLValue,
10390                                              SourceLocation Sigil) {
10391   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
10392                                     Sigil, getDerived().getBaseEntity());
10393 }
10394 
10395 template<typename Derived>
10396 QualType
RebuildMemberPointerType(QualType PointeeType,QualType ClassType,SourceLocation Sigil)10397 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
10398                                                  QualType ClassType,
10399                                                  SourceLocation Sigil) {
10400   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
10401                                         getDerived().getBaseEntity());
10402 }
10403 
10404 template<typename Derived>
10405 QualType
RebuildArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt * Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)10406 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
10407                                          ArrayType::ArraySizeModifier SizeMod,
10408                                          const llvm::APInt *Size,
10409                                          Expr *SizeExpr,
10410                                          unsigned IndexTypeQuals,
10411                                          SourceRange BracketsRange) {
10412   if (SizeExpr || !Size)
10413     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
10414                                   IndexTypeQuals, BracketsRange,
10415                                   getDerived().getBaseEntity());
10416 
10417   QualType Types[] = {
10418     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
10419     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
10420     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
10421   };
10422   const unsigned NumTypes = llvm::array_lengthof(Types);
10423   QualType SizeType;
10424   for (unsigned I = 0; I != NumTypes; ++I)
10425     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
10426       SizeType = Types[I];
10427       break;
10428     }
10429 
10430   // Note that we can return a VariableArrayType here in the case where
10431   // the element type was a dependent VariableArrayType.
10432   IntegerLiteral *ArraySize
10433       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
10434                                /*FIXME*/BracketsRange.getBegin());
10435   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
10436                                 IndexTypeQuals, BracketsRange,
10437                                 getDerived().getBaseEntity());
10438 }
10439 
10440 template<typename Derived>
10441 QualType
RebuildConstantArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt & Size,unsigned IndexTypeQuals,SourceRange BracketsRange)10442 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
10443                                                  ArrayType::ArraySizeModifier SizeMod,
10444                                                  const llvm::APInt &Size,
10445                                                  unsigned IndexTypeQuals,
10446                                                  SourceRange BracketsRange) {
10447   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
10448                                         IndexTypeQuals, BracketsRange);
10449 }
10450 
10451 template<typename Derived>
10452 QualType
RebuildIncompleteArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,unsigned IndexTypeQuals,SourceRange BracketsRange)10453 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
10454                                           ArrayType::ArraySizeModifier SizeMod,
10455                                                  unsigned IndexTypeQuals,
10456                                                    SourceRange BracketsRange) {
10457   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
10458                                        IndexTypeQuals, BracketsRange);
10459 }
10460 
10461 template<typename Derived>
10462 QualType
RebuildVariableArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)10463 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
10464                                           ArrayType::ArraySizeModifier SizeMod,
10465                                                  Expr *SizeExpr,
10466                                                  unsigned IndexTypeQuals,
10467                                                  SourceRange BracketsRange) {
10468   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10469                                        SizeExpr,
10470                                        IndexTypeQuals, BracketsRange);
10471 }
10472 
10473 template<typename Derived>
10474 QualType
RebuildDependentSizedArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)10475 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
10476                                           ArrayType::ArraySizeModifier SizeMod,
10477                                                        Expr *SizeExpr,
10478                                                        unsigned IndexTypeQuals,
10479                                                    SourceRange BracketsRange) {
10480   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10481                                        SizeExpr,
10482                                        IndexTypeQuals, BracketsRange);
10483 }
10484 
10485 template<typename Derived>
RebuildVectorType(QualType ElementType,unsigned NumElements,VectorType::VectorKind VecKind)10486 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
10487                                                unsigned NumElements,
10488                                                VectorType::VectorKind VecKind) {
10489   // FIXME: semantic checking!
10490   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
10491 }
10492 
10493 template<typename Derived>
RebuildExtVectorType(QualType ElementType,unsigned NumElements,SourceLocation AttributeLoc)10494 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
10495                                                       unsigned NumElements,
10496                                                  SourceLocation AttributeLoc) {
10497   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
10498                           NumElements, true);
10499   IntegerLiteral *VectorSize
10500     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
10501                              AttributeLoc);
10502   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
10503 }
10504 
10505 template<typename Derived>
10506 QualType
RebuildDependentSizedExtVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc)10507 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
10508                                                            Expr *SizeExpr,
10509                                                   SourceLocation AttributeLoc) {
10510   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
10511 }
10512 
10513 template<typename Derived>
RebuildFunctionProtoType(QualType T,MutableArrayRef<QualType> ParamTypes,const FunctionProtoType::ExtProtoInfo & EPI)10514 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
10515     QualType T,
10516     MutableArrayRef<QualType> ParamTypes,
10517     const FunctionProtoType::ExtProtoInfo &EPI) {
10518   return SemaRef.BuildFunctionType(T, ParamTypes,
10519                                    getDerived().getBaseLocation(),
10520                                    getDerived().getBaseEntity(),
10521                                    EPI);
10522 }
10523 
10524 template<typename Derived>
RebuildFunctionNoProtoType(QualType T)10525 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
10526   return SemaRef.Context.getFunctionNoProtoType(T);
10527 }
10528 
10529 template<typename Derived>
RebuildUnresolvedUsingType(Decl * D)10530 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
10531   assert(D && "no decl found");
10532   if (D->isInvalidDecl()) return QualType();
10533 
10534   // FIXME: Doesn't account for ObjCInterfaceDecl!
10535   TypeDecl *Ty;
10536   if (isa<UsingDecl>(D)) {
10537     UsingDecl *Using = cast<UsingDecl>(D);
10538     assert(Using->hasTypename() &&
10539            "UnresolvedUsingTypenameDecl transformed to non-typename using");
10540 
10541     // A valid resolved using typename decl points to exactly one type decl.
10542     assert(++Using->shadow_begin() == Using->shadow_end());
10543     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
10544 
10545   } else {
10546     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
10547            "UnresolvedUsingTypenameDecl transformed to non-using decl");
10548     Ty = cast<UnresolvedUsingTypenameDecl>(D);
10549   }
10550 
10551   return SemaRef.Context.getTypeDeclType(Ty);
10552 }
10553 
10554 template<typename Derived>
RebuildTypeOfExprType(Expr * E,SourceLocation Loc)10555 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
10556                                                        SourceLocation Loc) {
10557   return SemaRef.BuildTypeofExprType(E, Loc);
10558 }
10559 
10560 template<typename Derived>
RebuildTypeOfType(QualType Underlying)10561 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
10562   return SemaRef.Context.getTypeOfType(Underlying);
10563 }
10564 
10565 template<typename Derived>
RebuildDecltypeType(Expr * E,SourceLocation Loc)10566 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
10567                                                      SourceLocation Loc) {
10568   return SemaRef.BuildDecltypeType(E, Loc);
10569 }
10570 
10571 template<typename Derived>
RebuildUnaryTransformType(QualType BaseType,UnaryTransformType::UTTKind UKind,SourceLocation Loc)10572 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
10573                                             UnaryTransformType::UTTKind UKind,
10574                                             SourceLocation Loc) {
10575   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
10576 }
10577 
10578 template<typename Derived>
RebuildTemplateSpecializationType(TemplateName Template,SourceLocation TemplateNameLoc,TemplateArgumentListInfo & TemplateArgs)10579 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
10580                                                       TemplateName Template,
10581                                              SourceLocation TemplateNameLoc,
10582                                      TemplateArgumentListInfo &TemplateArgs) {
10583   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
10584 }
10585 
10586 template<typename Derived>
RebuildAtomicType(QualType ValueType,SourceLocation KWLoc)10587 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
10588                                                    SourceLocation KWLoc) {
10589   return SemaRef.BuildAtomicType(ValueType, KWLoc);
10590 }
10591 
10592 template<typename Derived>
10593 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,bool TemplateKW,TemplateDecl * Template)10594 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10595                                             bool TemplateKW,
10596                                             TemplateDecl *Template) {
10597   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
10598                                                   Template);
10599 }
10600 
10601 template<typename Derived>
10602 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,const IdentifierInfo & Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)10603 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10604                                             const IdentifierInfo &Name,
10605                                             SourceLocation NameLoc,
10606                                             QualType ObjectType,
10607                                             NamedDecl *FirstQualifierInScope) {
10608   UnqualifiedId TemplateName;
10609   TemplateName.setIdentifier(&Name, NameLoc);
10610   Sema::TemplateTy Template;
10611   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10612   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10613                                        SS, TemplateKWLoc, TemplateName,
10614                                        ParsedType::make(ObjectType),
10615                                        /*EnteringContext=*/false,
10616                                        Template);
10617   return Template.get();
10618 }
10619 
10620 template<typename Derived>
10621 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,OverloadedOperatorKind Operator,SourceLocation NameLoc,QualType ObjectType)10622 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10623                                             OverloadedOperatorKind Operator,
10624                                             SourceLocation NameLoc,
10625                                             QualType ObjectType) {
10626   UnqualifiedId Name;
10627   // FIXME: Bogus location information.
10628   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
10629   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
10630   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10631   Sema::TemplateTy Template;
10632   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10633                                        SS, TemplateKWLoc, Name,
10634                                        ParsedType::make(ObjectType),
10635                                        /*EnteringContext=*/false,
10636                                        Template);
10637   return Template.get();
10638 }
10639 
10640 template<typename Derived>
10641 ExprResult
RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,SourceLocation OpLoc,Expr * OrigCallee,Expr * First,Expr * Second)10642 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
10643                                                    SourceLocation OpLoc,
10644                                                    Expr *OrigCallee,
10645                                                    Expr *First,
10646                                                    Expr *Second) {
10647   Expr *Callee = OrigCallee->IgnoreParenCasts();
10648   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
10649 
10650   if (First->getObjectKind() == OK_ObjCProperty) {
10651     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10652     if (BinaryOperator::isAssignmentOp(Opc))
10653       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
10654                                                  First, Second);
10655     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
10656     if (Result.isInvalid())
10657       return ExprError();
10658     First = Result.get();
10659   }
10660 
10661   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
10662     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
10663     if (Result.isInvalid())
10664       return ExprError();
10665     Second = Result.get();
10666   }
10667 
10668   // Determine whether this should be a builtin operation.
10669   if (Op == OO_Subscript) {
10670     if (!First->getType()->isOverloadableType() &&
10671         !Second->getType()->isOverloadableType())
10672       return getSema().CreateBuiltinArraySubscriptExpr(First,
10673                                                        Callee->getLocStart(),
10674                                                        Second, OpLoc);
10675   } else if (Op == OO_Arrow) {
10676     // -> is never a builtin operation.
10677     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
10678   } else if (Second == nullptr || isPostIncDec) {
10679     if (!First->getType()->isOverloadableType()) {
10680       // The argument is not of overloadable type, so try to create a
10681       // built-in unary operation.
10682       UnaryOperatorKind Opc
10683         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10684 
10685       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
10686     }
10687   } else {
10688     if (!First->getType()->isOverloadableType() &&
10689         !Second->getType()->isOverloadableType()) {
10690       // Neither of the arguments is an overloadable type, so try to
10691       // create a built-in binary operation.
10692       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10693       ExprResult Result
10694         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
10695       if (Result.isInvalid())
10696         return ExprError();
10697 
10698       return Result;
10699     }
10700   }
10701 
10702   // Compute the transformed set of functions (and function templates) to be
10703   // used during overload resolution.
10704   UnresolvedSet<16> Functions;
10705 
10706   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
10707     assert(ULE->requiresADL());
10708     Functions.append(ULE->decls_begin(), ULE->decls_end());
10709   } else {
10710     // If we've resolved this to a particular non-member function, just call
10711     // that function. If we resolved it to a member function,
10712     // CreateOverloaded* will find that function for us.
10713     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
10714     if (!isa<CXXMethodDecl>(ND))
10715       Functions.addDecl(ND);
10716   }
10717 
10718   // Add any functions found via argument-dependent lookup.
10719   Expr *Args[2] = { First, Second };
10720   unsigned NumArgs = 1 + (Second != nullptr);
10721 
10722   // Create the overloaded operator invocation for unary operators.
10723   if (NumArgs == 1 || isPostIncDec) {
10724     UnaryOperatorKind Opc
10725       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10726     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
10727   }
10728 
10729   if (Op == OO_Subscript) {
10730     SourceLocation LBrace;
10731     SourceLocation RBrace;
10732 
10733     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
10734         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
10735         LBrace = SourceLocation::getFromRawEncoding(
10736                     NameLoc.CXXOperatorName.BeginOpNameLoc);
10737         RBrace = SourceLocation::getFromRawEncoding(
10738                     NameLoc.CXXOperatorName.EndOpNameLoc);
10739     } else {
10740         LBrace = Callee->getLocStart();
10741         RBrace = OpLoc;
10742     }
10743 
10744     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
10745                                                       First, Second);
10746   }
10747 
10748   // Create the overloaded operator invocation for binary operators.
10749   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10750   ExprResult Result
10751     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
10752   if (Result.isInvalid())
10753     return ExprError();
10754 
10755   return Result;
10756 }
10757 
10758 template<typename Derived>
10759 ExprResult
RebuildCXXPseudoDestructorExpr(Expr * Base,SourceLocation OperatorLoc,bool isArrow,CXXScopeSpec & SS,TypeSourceInfo * ScopeType,SourceLocation CCLoc,SourceLocation TildeLoc,PseudoDestructorTypeStorage Destroyed)10760 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
10761                                                      SourceLocation OperatorLoc,
10762                                                        bool isArrow,
10763                                                        CXXScopeSpec &SS,
10764                                                      TypeSourceInfo *ScopeType,
10765                                                        SourceLocation CCLoc,
10766                                                        SourceLocation TildeLoc,
10767                                         PseudoDestructorTypeStorage Destroyed) {
10768   QualType BaseType = Base->getType();
10769   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
10770       (!isArrow && !BaseType->getAs<RecordType>()) ||
10771       (isArrow && BaseType->getAs<PointerType>() &&
10772        !BaseType->getAs<PointerType>()->getPointeeType()
10773                                               ->template getAs<RecordType>())){
10774     // This pseudo-destructor expression is still a pseudo-destructor.
10775     return SemaRef.BuildPseudoDestructorExpr(
10776         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
10777         CCLoc, TildeLoc, Destroyed);
10778   }
10779 
10780   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
10781   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
10782                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
10783   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
10784   NameInfo.setNamedTypeInfo(DestroyedType);
10785 
10786   // The scope type is now known to be a valid nested name specifier
10787   // component. Tack it on to the end of the nested name specifier.
10788   if (ScopeType) {
10789     if (!ScopeType->getType()->getAs<TagType>()) {
10790       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
10791                      diag::err_expected_class_or_namespace)
10792           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
10793       return ExprError();
10794     }
10795     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
10796               CCLoc);
10797   }
10798 
10799   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10800   return getSema().BuildMemberReferenceExpr(Base, BaseType,
10801                                             OperatorLoc, isArrow,
10802                                             SS, TemplateKWLoc,
10803                                             /*FIXME: FirstQualifier*/ nullptr,
10804                                             NameInfo,
10805                                             /*TemplateArgs*/ nullptr);
10806 }
10807 
10808 template<typename Derived>
10809 StmtResult
TransformCapturedStmt(CapturedStmt * S)10810 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
10811   SourceLocation Loc = S->getLocStart();
10812   CapturedDecl *CD = S->getCapturedDecl();
10813   unsigned NumParams = CD->getNumParams();
10814   unsigned ContextParamPos = CD->getContextParamPosition();
10815   SmallVector<Sema::CapturedParamNameType, 4> Params;
10816   for (unsigned I = 0; I < NumParams; ++I) {
10817     if (I != ContextParamPos) {
10818       Params.push_back(
10819              std::make_pair(
10820                   CD->getParam(I)->getName(),
10821                   getDerived().TransformType(CD->getParam(I)->getType())));
10822     } else {
10823       Params.push_back(std::make_pair(StringRef(), QualType()));
10824     }
10825   }
10826   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
10827                                      S->getCapturedRegionKind(), Params);
10828   StmtResult Body;
10829   {
10830     Sema::CompoundScopeRAII CompoundScope(getSema());
10831     Body = getDerived().TransformStmt(S->getCapturedStmt());
10832   }
10833 
10834   if (Body.isInvalid()) {
10835     getSema().ActOnCapturedRegionError();
10836     return StmtError();
10837   }
10838 
10839   return getSema().ActOnCapturedRegionEnd(Body.get());
10840 }
10841 
10842 } // end namespace clang
10843 
10844 #endif
10845