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