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