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