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 "CoroutineStmtBuilder.h"
18 #include "TypeLocBuilder.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/Expr.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/Stmt.h"
27 #include "clang/AST/StmtCXX.h"
28 #include "clang/AST/StmtObjC.h"
29 #include "clang/AST/StmtOpenMP.h"
30 #include "clang/Sema/Designator.h"
31 #include "clang/Sema/Lookup.h"
32 #include "clang/Sema/Ownership.h"
33 #include "clang/Sema/ParsedTemplate.h"
34 #include "clang/Sema/ScopeInfo.h"
35 #include "clang/Sema/SemaDiagnostic.h"
36 #include "clang/Sema/SemaInternal.h"
37 #include "llvm/ADT/ArrayRef.h"
38 #include "llvm/Support/ErrorHandling.h"
39 #include <algorithm>
40 
41 namespace clang {
42 using namespace sema;
43 
44 /// \brief A semantic tree transformation that allows one to transform one
45 /// abstract syntax tree into another.
46 ///
47 /// A new tree transformation is defined by creating a new subclass \c X of
48 /// \c TreeTransform<X> and then overriding certain operations to provide
49 /// behavior specific to that transformation. For example, template
50 /// instantiation is implemented as a tree transformation where the
51 /// transformation of TemplateTypeParmType nodes involves substituting the
52 /// template arguments for their corresponding template parameters; a similar
53 /// transformation is performed for non-type template parameters and
54 /// template template parameters.
55 ///
56 /// This tree-transformation template uses static polymorphism to allow
57 /// subclasses to customize any of its operations. Thus, a subclass can
58 /// override any of the transformation or rebuild operators by providing an
59 /// operation with the same signature as the default implementation. The
60 /// overridding function should not be virtual.
61 ///
62 /// Semantic tree transformations are split into two stages, either of which
63 /// can be replaced by a subclass. The "transform" step transforms an AST node
64 /// or the parts of an AST node using the various transformation functions,
65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
66 /// node of the appropriate kind from the pieces. The default transformation
67 /// routines recursively transform the operands to composite AST nodes (e.g.,
68 /// the pointee type of a PointerType node) and, if any of those operand nodes
69 /// were changed by the transformation, invokes the rebuild operation to create
70 /// a new AST node.
71 ///
72 /// Subclasses can customize the transformation at various levels. The
73 /// most coarse-grained transformations involve replacing TransformType(),
74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
76 /// new implementations.
77 ///
78 /// For more fine-grained transformations, subclasses can replace any of the
79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
81 /// replacing TransformTemplateTypeParmType() allows template instantiation
82 /// to substitute template arguments for their corresponding template
83 /// parameters. Additionally, subclasses can override the \c RebuildXXX
84 /// functions to control how AST nodes are rebuilt when their operands change.
85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
87 /// be able to use more efficient rebuild steps.
88 ///
89 /// There are a handful of other functions that can be overridden, allowing one
90 /// to avoid traversing nodes that don't need any transformation
91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
92 /// operands have not changed (\c AlwaysRebuild()), and customize the
93 /// default locations and entity names used for type-checking
94 /// (\c getBaseLocation(), \c getBaseEntity()).
95 template<typename Derived>
96 class TreeTransform {
97   /// \brief Private RAII object that helps us forget and then re-remember
98   /// the template argument corresponding to a partially-substituted parameter
99   /// pack.
100   class ForgetPartiallySubstitutedPackRAII {
101     Derived &Self;
102     TemplateArgument Old;
103 
104   public:
105     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
106       Old = Self.ForgetPartiallySubstitutedPack();
107     }
108 
109     ~ForgetPartiallySubstitutedPackRAII() {
110       Self.RememberPartiallySubstitutedPack(Old);
111     }
112   };
113 
114 protected:
115   Sema &SemaRef;
116 
117   /// \brief The set of local declarations that have been transformed, for
118   /// cases where we are forced to build new declarations within the transformer
119   /// rather than in the subclass (e.g., lambda closure types).
120   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
121 
122 public:
123   /// \brief Initializes a new tree transformer.
124   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
125 
126   /// \brief Retrieves a reference to the derived class.
127   Derived &getDerived() { return static_cast<Derived&>(*this); }
128 
129   /// \brief Retrieves a reference to the derived class.
130   const Derived &getDerived() const {
131     return static_cast<const Derived&>(*this);
132   }
133 
134   static inline ExprResult Owned(Expr *E) { return E; }
135   static inline StmtResult Owned(Stmt *S) { return S; }
136 
137   /// \brief Retrieves a reference to the semantic analysis object used for
138   /// this tree transform.
139   Sema &getSema() const { return SemaRef; }
140 
141   /// \brief Whether the transformation should always rebuild AST nodes, even
142   /// if none of the children have changed.
143   ///
144   /// Subclasses may override this function to specify when the transformation
145   /// should rebuild all AST nodes.
146   ///
147   /// We must always rebuild all AST nodes when performing variadic template
148   /// pack expansion, in order to avoid violating the AST invariant that each
149   /// statement node appears at most once in its containing declaration.
150   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
151 
152   /// \brief Returns the location of the entity being transformed, if that
153   /// information was not available elsewhere in the AST.
154   ///
155   /// By default, returns no source-location information. Subclasses can
156   /// provide an alternative implementation that provides better location
157   /// information.
158   SourceLocation getBaseLocation() { return SourceLocation(); }
159 
160   /// \brief Returns the name of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns an empty name. Subclasses can provide an alternative
164   /// implementation with a more precise name.
165   DeclarationName getBaseEntity() { return DeclarationName(); }
166 
167   /// \brief Sets the "base" location and entity when that
168   /// information is known based on another transformation.
169   ///
170   /// By default, the source location and entity are ignored. Subclasses can
171   /// override this function to provide a customized implementation.
172   void setBase(SourceLocation Loc, DeclarationName Entity) { }
173 
174   /// \brief RAII object that temporarily sets the base location and entity
175   /// used for reporting diagnostics in types.
176   class TemporaryBase {
177     TreeTransform &Self;
178     SourceLocation OldLocation;
179     DeclarationName OldEntity;
180 
181   public:
182     TemporaryBase(TreeTransform &Self, SourceLocation Location,
183                   DeclarationName Entity) : Self(Self) {
184       OldLocation = Self.getDerived().getBaseLocation();
185       OldEntity = Self.getDerived().getBaseEntity();
186 
187       if (Location.isValid())
188         Self.getDerived().setBase(Location, Entity);
189     }
190 
191     ~TemporaryBase() {
192       Self.getDerived().setBase(OldLocation, OldEntity);
193     }
194   };
195 
196   /// \brief Determine whether the given type \p T has already been
197   /// transformed.
198   ///
199   /// Subclasses can provide an alternative implementation of this routine
200   /// to short-circuit evaluation when it is known that a given type will
201   /// not change. For example, template instantiation need not traverse
202   /// non-dependent types.
203   bool AlreadyTransformed(QualType T) {
204     return T.isNull();
205   }
206 
207   /// \brief Determine whether the given call argument should be dropped, e.g.,
208   /// because it is a default argument.
209   ///
210   /// Subclasses can provide an alternative implementation of this routine to
211   /// determine which kinds of call arguments get dropped. By default,
212   /// CXXDefaultArgument nodes are dropped (prior to transformation).
213   bool DropCallArgument(Expr *E) {
214     return E->isDefaultArgument();
215   }
216 
217   /// \brief Determine whether we should expand a pack expansion with the
218   /// given set of parameter packs into separate arguments by repeatedly
219   /// transforming the pattern.
220   ///
221   /// By default, the transformer never tries to expand pack expansions.
222   /// Subclasses can override this routine to provide different behavior.
223   ///
224   /// \param EllipsisLoc The location of the ellipsis that identifies the
225   /// pack expansion.
226   ///
227   /// \param PatternRange The source range that covers the entire pattern of
228   /// the pack expansion.
229   ///
230   /// \param Unexpanded The set of unexpanded parameter packs within the
231   /// pattern.
232   ///
233   /// \param ShouldExpand Will be set to \c true if the transformer should
234   /// expand the corresponding pack expansions into separate arguments. When
235   /// set, \c NumExpansions must also be set.
236   ///
237   /// \param RetainExpansion Whether the caller should add an unexpanded
238   /// pack expansion after all of the expanded arguments. This is used
239   /// when extending explicitly-specified template argument packs per
240   /// C++0x [temp.arg.explicit]p9.
241   ///
242   /// \param NumExpansions The number of separate arguments that will be in
243   /// the expanded form of the corresponding pack expansion. This is both an
244   /// input and an output parameter, which can be set by the caller if the
245   /// number of expansions is known a priori (e.g., due to a prior substitution)
246   /// and will be set by the callee when the number of expansions is known.
247   /// The callee must set this value when \c ShouldExpand is \c true; it may
248   /// set this value in other cases.
249   ///
250   /// \returns true if an error occurred (e.g., because the parameter packs
251   /// are to be instantiated with arguments of different lengths), false
252   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
253   /// must be set.
254   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
255                                SourceRange PatternRange,
256                                ArrayRef<UnexpandedParameterPack> Unexpanded,
257                                bool &ShouldExpand,
258                                bool &RetainExpansion,
259                                Optional<unsigned> &NumExpansions) {
260     ShouldExpand = false;
261     return false;
262   }
263 
264   /// \brief "Forget" about the partially-substituted pack template argument,
265   /// when performing an instantiation that must preserve the parameter pack
266   /// use.
267   ///
268   /// This routine is meant to be overridden by the template instantiator.
269   TemplateArgument ForgetPartiallySubstitutedPack() {
270     return TemplateArgument();
271   }
272 
273   /// \brief "Remember" the partially-substituted pack template argument
274   /// after performing an instantiation that must preserve the parameter pack
275   /// use.
276   ///
277   /// This routine is meant to be overridden by the template instantiator.
278   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
279 
280   /// \brief Note to the derived class when a function parameter pack is
281   /// being expanded.
282   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
283 
284   /// \brief Transforms the given type into another type.
285   ///
286   /// By default, this routine transforms a type by creating a
287   /// TypeSourceInfo for it and delegating to the appropriate
288   /// function.  This is expensive, but we don't mind, because
289   /// this method is deprecated anyway;  all users should be
290   /// switched to storing TypeSourceInfos.
291   ///
292   /// \returns the transformed type.
293   QualType TransformType(QualType T);
294 
295   /// \brief Transforms the given type-with-location into a new
296   /// type-with-location.
297   ///
298   /// By default, this routine transforms a type by delegating to the
299   /// appropriate TransformXXXType to build a new type.  Subclasses
300   /// may override this function (to take over all type
301   /// transformations) or some set of the TransformXXXType functions
302   /// to alter the transformation.
303   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
304 
305   /// \brief Transform the given type-with-location into a new
306   /// type, collecting location information in the given builder
307   /// as necessary.
308   ///
309   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
310 
311   /// \brief Transform a type that is permitted to produce a
312   /// DeducedTemplateSpecializationType.
313   ///
314   /// This is used in the (relatively rare) contexts where it is acceptable
315   /// for transformation to produce a class template type with deduced
316   /// template arguments.
317   /// @{
318   QualType TransformTypeWithDeducedTST(QualType T);
319   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
320   /// @}
321 
322   /// \brief Transform the given statement.
323   ///
324   /// By default, this routine transforms a statement by delegating to the
325   /// appropriate TransformXXXStmt function to transform a specific kind of
326   /// statement or the TransformExpr() function to transform an expression.
327   /// Subclasses may override this function to transform statements using some
328   /// other mechanism.
329   ///
330   /// \returns the transformed statement.
331   StmtResult TransformStmt(Stmt *S);
332 
333   /// \brief Transform the given statement.
334   ///
335   /// By default, this routine transforms a statement by delegating to the
336   /// appropriate TransformOMPXXXClause function to transform a specific kind
337   /// of clause. Subclasses may override this function to transform statements
338   /// using some other mechanism.
339   ///
340   /// \returns the transformed OpenMP clause.
341   OMPClause *TransformOMPClause(OMPClause *S);
342 
343   /// \brief Transform the given attribute.
344   ///
345   /// By default, this routine transforms a statement by delegating to the
346   /// appropriate TransformXXXAttr function to transform a specific kind
347   /// of attribute. Subclasses may override this function to transform
348   /// attributed statements using some other mechanism.
349   ///
350   /// \returns the transformed attribute
351   const Attr *TransformAttr(const Attr *S);
352 
353 /// \brief Transform the specified attribute.
354 ///
355 /// Subclasses should override the transformation of attributes with a pragma
356 /// spelling to transform expressions stored within the attribute.
357 ///
358 /// \returns the transformed attribute.
359 #define ATTR(X)
360 #define PRAGMA_SPELLING_ATTR(X)                                                \
361   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
362 #include "clang/Basic/AttrList.inc"
363 
364   /// \brief Transform the given expression.
365   ///
366   /// By default, this routine transforms an expression by delegating to the
367   /// appropriate TransformXXXExpr function to build a new expression.
368   /// Subclasses may override this function to transform expressions using some
369   /// other mechanism.
370   ///
371   /// \returns the transformed expression.
372   ExprResult TransformExpr(Expr *E);
373 
374   /// \brief Transform the given initializer.
375   ///
376   /// By default, this routine transforms an initializer by stripping off the
377   /// semantic nodes added by initialization, then passing the result to
378   /// TransformExpr or TransformExprs.
379   ///
380   /// \returns the transformed initializer.
381   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
382 
383   /// \brief Transform the given list of expressions.
384   ///
385   /// This routine transforms a list of expressions by invoking
386   /// \c TransformExpr() for each subexpression. However, it also provides
387   /// support for variadic templates by expanding any pack expansions (if the
388   /// derived class permits such expansion) along the way. When pack expansions
389   /// are present, the number of outputs may not equal the number of inputs.
390   ///
391   /// \param Inputs The set of expressions to be transformed.
392   ///
393   /// \param NumInputs The number of expressions in \c Inputs.
394   ///
395   /// \param IsCall If \c true, then this transform is being performed on
396   /// function-call arguments, and any arguments that should be dropped, will
397   /// be.
398   ///
399   /// \param Outputs The transformed input expressions will be added to this
400   /// vector.
401   ///
402   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
403   /// due to transformation.
404   ///
405   /// \returns true if an error occurred, false otherwise.
406   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
407                       SmallVectorImpl<Expr *> &Outputs,
408                       bool *ArgChanged = nullptr);
409 
410   /// \brief Transform the given declaration, which is referenced from a type
411   /// or expression.
412   ///
413   /// By default, acts as the identity function on declarations, unless the
414   /// transformer has had to transform the declaration itself. Subclasses
415   /// may override this function to provide alternate behavior.
416   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
417     llvm::DenseMap<Decl *, Decl *>::iterator Known
418       = TransformedLocalDecls.find(D);
419     if (Known != TransformedLocalDecls.end())
420       return Known->second;
421 
422     return D;
423   }
424 
425   /// \brief Transform the specified condition.
426   ///
427   /// By default, this transforms the variable and expression and rebuilds
428   /// the condition.
429   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
430                                            Expr *Expr,
431                                            Sema::ConditionKind Kind);
432 
433   /// \brief Transform the attributes associated with the given declaration and
434   /// place them on the new declaration.
435   ///
436   /// By default, this operation does nothing. Subclasses may override this
437   /// behavior to transform attributes.
438   void transformAttrs(Decl *Old, Decl *New) { }
439 
440   /// \brief Note that a local declaration has been transformed by this
441   /// transformer.
442   ///
443   /// Local declarations are typically transformed via a call to
444   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
445   /// the transformer itself has to transform the declarations. This routine
446   /// can be overridden by a subclass that keeps track of such mappings.
447   void transformedLocalDecl(Decl *Old, Decl *New) {
448     TransformedLocalDecls[Old] = New;
449   }
450 
451   /// \brief Transform the definition of the given declaration.
452   ///
453   /// By default, invokes TransformDecl() to transform the declaration.
454   /// Subclasses may override this function to provide alternate behavior.
455   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
456     return getDerived().TransformDecl(Loc, D);
457   }
458 
459   /// \brief Transform the given declaration, which was the first part of a
460   /// nested-name-specifier in a member access expression.
461   ///
462   /// This specific declaration transformation only applies to the first
463   /// identifier in a nested-name-specifier of a member access expression, e.g.,
464   /// the \c T in \c x->T::member
465   ///
466   /// By default, invokes TransformDecl() to transform the declaration.
467   /// Subclasses may override this function to provide alternate behavior.
468   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
469     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
470   }
471 
472   /// Transform the set of declarations in an OverloadExpr.
473   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
474                                   LookupResult &R);
475 
476   /// \brief Transform the given nested-name-specifier with source-location
477   /// information.
478   ///
479   /// By default, transforms all of the types and declarations within the
480   /// nested-name-specifier. Subclasses may override this function to provide
481   /// alternate behavior.
482   NestedNameSpecifierLoc
483   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
484                                   QualType ObjectType = QualType(),
485                                   NamedDecl *FirstQualifierInScope = nullptr);
486 
487   /// \brief Transform the given declaration name.
488   ///
489   /// By default, transforms the types of conversion function, constructor,
490   /// and destructor names and then (if needed) rebuilds the declaration name.
491   /// Identifiers and selectors are returned unmodified. Sublcasses may
492   /// override this function to provide alternate behavior.
493   DeclarationNameInfo
494   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
495 
496   /// \brief Transform the given template name.
497   ///
498   /// \param SS The nested-name-specifier that qualifies the template
499   /// name. This nested-name-specifier must already have been transformed.
500   ///
501   /// \param Name The template name to transform.
502   ///
503   /// \param NameLoc The source location of the template name.
504   ///
505   /// \param ObjectType If we're translating a template name within a member
506   /// access expression, this is the type of the object whose member template
507   /// is being referenced.
508   ///
509   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
510   /// also refers to a name within the current (lexical) scope, this is the
511   /// declaration it refers to.
512   ///
513   /// By default, transforms the template name by transforming the declarations
514   /// and nested-name-specifiers that occur within the template name.
515   /// Subclasses may override this function to provide alternate behavior.
516   TemplateName
517   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
518                         SourceLocation NameLoc,
519                         QualType ObjectType = QualType(),
520                         NamedDecl *FirstQualifierInScope = nullptr,
521                         bool AllowInjectedClassName = false);
522 
523   /// \brief Transform the given template argument.
524   ///
525   /// By default, this operation transforms the type, expression, or
526   /// declaration stored within the template argument and constructs a
527   /// new template argument from the transformed result. Subclasses may
528   /// override this function to provide alternate behavior.
529   ///
530   /// Returns true if there was an error.
531   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
532                                  TemplateArgumentLoc &Output,
533                                  bool Uneval = false);
534 
535   /// \brief Transform the given set of template arguments.
536   ///
537   /// By default, this operation transforms all of the template arguments
538   /// in the input set using \c TransformTemplateArgument(), and appends
539   /// the transformed arguments to the output list.
540   ///
541   /// Note that this overload of \c TransformTemplateArguments() is merely
542   /// a convenience function. Subclasses that wish to override this behavior
543   /// should override the iterator-based member template version.
544   ///
545   /// \param Inputs The set of template arguments to be transformed.
546   ///
547   /// \param NumInputs The number of template arguments in \p Inputs.
548   ///
549   /// \param Outputs The set of transformed template arguments output by this
550   /// routine.
551   ///
552   /// Returns true if an error occurred.
553   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
554                                   unsigned NumInputs,
555                                   TemplateArgumentListInfo &Outputs,
556                                   bool Uneval = false) {
557     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
558                                       Uneval);
559   }
560 
561   /// \brief Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// \param First An iterator to the first template argument.
568   ///
569   /// \param Last An iterator one step past the last template argument.
570   ///
571   /// \param Outputs The set of transformed template arguments output by this
572   /// routine.
573   ///
574   /// Returns true if an error occurred.
575   template<typename InputIterator>
576   bool TransformTemplateArguments(InputIterator First,
577                                   InputIterator Last,
578                                   TemplateArgumentListInfo &Outputs,
579                                   bool Uneval = false);
580 
581   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
582   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
583                                  TemplateArgumentLoc &ArgLoc);
584 
585   /// \brief Fakes up a TypeSourceInfo for a type.
586   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
587     return SemaRef.Context.getTrivialTypeSourceInfo(T,
588                        getDerived().getBaseLocation());
589   }
590 
591 #define ABSTRACT_TYPELOC(CLASS, PARENT)
592 #define TYPELOC(CLASS, PARENT)                                   \
593   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
594 #include "clang/AST/TypeLocNodes.def"
595 
596   template<typename Fn>
597   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
598                                       FunctionProtoTypeLoc TL,
599                                       CXXRecordDecl *ThisContext,
600                                       unsigned ThisTypeQuals,
601                                       Fn TransformExceptionSpec);
602 
603   bool TransformExceptionSpec(SourceLocation Loc,
604                               FunctionProtoType::ExceptionSpecInfo &ESI,
605                               SmallVectorImpl<QualType> &Exceptions,
606                               bool &Changed);
607 
608   StmtResult TransformSEHHandler(Stmt *Handler);
609 
610   QualType
611   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
612                                       TemplateSpecializationTypeLoc TL,
613                                       TemplateName Template);
614 
615   QualType
616   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
617                                       DependentTemplateSpecializationTypeLoc TL,
618                                                TemplateName Template,
619                                                CXXScopeSpec &SS);
620 
621   QualType TransformDependentTemplateSpecializationType(
622       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
623       NestedNameSpecifierLoc QualifierLoc);
624 
625   /// \brief Transforms the parameters of a function type into the
626   /// given vectors.
627   ///
628   /// The result vectors should be kept in sync; null entries in the
629   /// variables vector are acceptable.
630   ///
631   /// Return true on error.
632   bool TransformFunctionTypeParams(
633       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
634       const QualType *ParamTypes,
635       const FunctionProtoType::ExtParameterInfo *ParamInfos,
636       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
637       Sema::ExtParameterInfoBuilder &PInfos);
638 
639   /// \brief Transforms a single function-type parameter.  Return null
640   /// on error.
641   ///
642   /// \param indexAdjustment - A number to add to the parameter's
643   ///   scope index;  can be negative
644   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
645                                           int indexAdjustment,
646                                           Optional<unsigned> NumExpansions,
647                                           bool ExpectParameterPack);
648 
649   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
650 
651   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
652   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
653 
654   TemplateParameterList *TransformTemplateParameterList(
655         TemplateParameterList *TPL) {
656     return TPL;
657   }
658 
659   ExprResult TransformAddressOfOperand(Expr *E);
660 
661   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
662                                                 bool IsAddressOfOperand,
663                                                 TypeSourceInfo **RecoveryTSI);
664 
665   ExprResult TransformParenDependentScopeDeclRefExpr(
666       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
667       TypeSourceInfo **RecoveryTSI);
668 
669   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
670 
671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
672 // amount of stack usage with clang.
673 #define STMT(Node, Parent)                        \
674   LLVM_ATTRIBUTE_NOINLINE \
675   StmtResult Transform##Node(Node *S);
676 #define EXPR(Node, Parent)                        \
677   LLVM_ATTRIBUTE_NOINLINE \
678   ExprResult Transform##Node(Node *E);
679 #define ABSTRACT_STMT(Stmt)
680 #include "clang/AST/StmtNodes.inc"
681 
682 #define OPENMP_CLAUSE(Name, Class)                        \
683   LLVM_ATTRIBUTE_NOINLINE \
684   OMPClause *Transform ## Class(Class *S);
685 #include "clang/Basic/OpenMPKinds.def"
686 
687   /// \brief Build a new qualified type given its unqualified type and type
688   /// qualifiers.
689   ///
690   /// By default, this routine adds type qualifiers only to types that can
691   /// have qualifiers, and silently suppresses those qualifiers that are not
692   /// permitted. Subclasses may override this routine to provide different
693   /// behavior.
694   QualType RebuildQualifiedType(QualType T, SourceLocation Loc,
695                                 Qualifiers Quals);
696 
697   /// \brief Build a new pointer type given its pointee type.
698   ///
699   /// By default, performs semantic analysis when building the pointer type.
700   /// Subclasses may override this routine to provide different behavior.
701   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
702 
703   /// \brief Build a new block pointer type given its pointee type.
704   ///
705   /// By default, performs semantic analysis when building the block pointer
706   /// type. Subclasses may override this routine to provide different behavior.
707   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
708 
709   /// \brief Build a new reference type given the type it references.
710   ///
711   /// By default, performs semantic analysis when building the
712   /// reference type. Subclasses may override this routine to provide
713   /// different behavior.
714   ///
715   /// \param LValue whether the type was written with an lvalue sigil
716   /// or an rvalue sigil.
717   QualType RebuildReferenceType(QualType ReferentType,
718                                 bool LValue,
719                                 SourceLocation Sigil);
720 
721   /// \brief Build a new member pointer type given the pointee type and the
722   /// class type it refers into.
723   ///
724   /// By default, performs semantic analysis when building the member pointer
725   /// type. Subclasses may override this routine to provide different behavior.
726   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
727                                     SourceLocation Sigil);
728 
729   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
730                                     SourceLocation ProtocolLAngleLoc,
731                                     ArrayRef<ObjCProtocolDecl *> Protocols,
732                                     ArrayRef<SourceLocation> ProtocolLocs,
733                                     SourceLocation ProtocolRAngleLoc);
734 
735   /// \brief Build an Objective-C object type.
736   ///
737   /// By default, performs semantic analysis when building the object type.
738   /// Subclasses may override this routine to provide different behavior.
739   QualType RebuildObjCObjectType(QualType BaseType,
740                                  SourceLocation Loc,
741                                  SourceLocation TypeArgsLAngleLoc,
742                                  ArrayRef<TypeSourceInfo *> TypeArgs,
743                                  SourceLocation TypeArgsRAngleLoc,
744                                  SourceLocation ProtocolLAngleLoc,
745                                  ArrayRef<ObjCProtocolDecl *> Protocols,
746                                  ArrayRef<SourceLocation> ProtocolLocs,
747                                  SourceLocation ProtocolRAngleLoc);
748 
749   /// \brief Build a new Objective-C object pointer type given the pointee type.
750   ///
751   /// By default, directly builds the pointer type, with no additional semantic
752   /// analysis.
753   QualType RebuildObjCObjectPointerType(QualType PointeeType,
754                                         SourceLocation Star);
755 
756   /// \brief Build a new array type given the element type, size
757   /// modifier, size of the array (if known), size expression, and index type
758   /// qualifiers.
759   ///
760   /// By default, performs semantic analysis when building the array type.
761   /// Subclasses may override this routine to provide different behavior.
762   /// Also by default, all of the other Rebuild*Array
763   QualType RebuildArrayType(QualType ElementType,
764                             ArrayType::ArraySizeModifier SizeMod,
765                             const llvm::APInt *Size,
766                             Expr *SizeExpr,
767                             unsigned IndexTypeQuals,
768                             SourceRange BracketsRange);
769 
770   /// \brief Build a new constant array type given the element type, size
771   /// modifier, (known) size of the array, and index type qualifiers.
772   ///
773   /// By default, performs semantic analysis when building the array type.
774   /// Subclasses may override this routine to provide different behavior.
775   QualType RebuildConstantArrayType(QualType ElementType,
776                                     ArrayType::ArraySizeModifier SizeMod,
777                                     const llvm::APInt &Size,
778                                     unsigned IndexTypeQuals,
779                                     SourceRange BracketsRange);
780 
781   /// \brief Build a new incomplete array type given the element type, size
782   /// modifier, and index type qualifiers.
783   ///
784   /// By default, performs semantic analysis when building the array type.
785   /// Subclasses may override this routine to provide different behavior.
786   QualType RebuildIncompleteArrayType(QualType ElementType,
787                                       ArrayType::ArraySizeModifier SizeMod,
788                                       unsigned IndexTypeQuals,
789                                       SourceRange BracketsRange);
790 
791   /// \brief Build a new variable-length array type given the element type,
792   /// size modifier, size expression, and index type qualifiers.
793   ///
794   /// By default, performs semantic analysis when building the array type.
795   /// Subclasses may override this routine to provide different behavior.
796   QualType RebuildVariableArrayType(QualType ElementType,
797                                     ArrayType::ArraySizeModifier SizeMod,
798                                     Expr *SizeExpr,
799                                     unsigned IndexTypeQuals,
800                                     SourceRange BracketsRange);
801 
802   /// \brief Build a new dependent-sized array type given the element type,
803   /// size modifier, size expression, and index type qualifiers.
804   ///
805   /// By default, performs semantic analysis when building the array type.
806   /// Subclasses may override this routine to provide different behavior.
807   QualType RebuildDependentSizedArrayType(QualType ElementType,
808                                           ArrayType::ArraySizeModifier SizeMod,
809                                           Expr *SizeExpr,
810                                           unsigned IndexTypeQuals,
811                                           SourceRange BracketsRange);
812 
813   /// \brief Build a new vector type given the element type and
814   /// number of elements.
815   ///
816   /// By default, performs semantic analysis when building the vector type.
817   /// Subclasses may override this routine to provide different behavior.
818   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
819                              VectorType::VectorKind VecKind);
820 
821   /// \brief Build a new extended vector type given the element type and
822   /// number of elements.
823   ///
824   /// By default, performs semantic analysis when building the vector type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
827                                 SourceLocation AttributeLoc);
828 
829   /// \brief Build a new potentially dependently-sized extended vector type
830   /// given the element type and number of elements.
831   ///
832   /// By default, performs semantic analysis when building the vector type.
833   /// Subclasses may override this routine to provide different behavior.
834   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
835                                               Expr *SizeExpr,
836                                               SourceLocation AttributeLoc);
837 
838   /// \brief Build a new function type.
839   ///
840   /// By default, performs semantic analysis when building the function type.
841   /// Subclasses may override this routine to provide different behavior.
842   QualType RebuildFunctionProtoType(QualType T,
843                                     MutableArrayRef<QualType> ParamTypes,
844                                     const FunctionProtoType::ExtProtoInfo &EPI);
845 
846   /// \brief Build a new unprototyped function type.
847   QualType RebuildFunctionNoProtoType(QualType ResultType);
848 
849   /// \brief Rebuild an unresolved typename type, given the decl that
850   /// the UnresolvedUsingTypenameDecl was transformed to.
851   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
852 
853   /// \brief Build a new typedef type.
854   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
855     return SemaRef.Context.getTypeDeclType(Typedef);
856   }
857 
858   /// \brief Build a new class/struct/union type.
859   QualType RebuildRecordType(RecordDecl *Record) {
860     return SemaRef.Context.getTypeDeclType(Record);
861   }
862 
863   /// \brief Build a new Enum type.
864   QualType RebuildEnumType(EnumDecl *Enum) {
865     return SemaRef.Context.getTypeDeclType(Enum);
866   }
867 
868   /// \brief Build a new typeof(expr) type.
869   ///
870   /// By default, performs semantic analysis when building the typeof type.
871   /// Subclasses may override this routine to provide different behavior.
872   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
873 
874   /// \brief Build a new typeof(type) type.
875   ///
876   /// By default, builds a new TypeOfType with the given underlying type.
877   QualType RebuildTypeOfType(QualType Underlying);
878 
879   /// \brief Build a new unary transform type.
880   QualType RebuildUnaryTransformType(QualType BaseType,
881                                      UnaryTransformType::UTTKind UKind,
882                                      SourceLocation Loc);
883 
884   /// \brief Build a new C++11 decltype type.
885   ///
886   /// By default, performs semantic analysis when building the decltype type.
887   /// Subclasses may override this routine to provide different behavior.
888   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
889 
890   /// \brief Build a new C++11 auto type.
891   ///
892   /// By default, builds a new AutoType with the given deduced type.
893   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
894     // Note, IsDependent is always false here: we implicitly convert an 'auto'
895     // which has been deduced to a dependent type into an undeduced 'auto', so
896     // that we'll retry deduction after the transformation.
897     return SemaRef.Context.getAutoType(Deduced, Keyword,
898                                        /*IsDependent*/ false);
899   }
900 
901   /// By default, builds a new DeducedTemplateSpecializationType with the given
902   /// deduced type.
903   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
904       QualType Deduced) {
905     return SemaRef.Context.getDeducedTemplateSpecializationType(
906         Template, Deduced, /*IsDependent*/ false);
907   }
908 
909   /// \brief Build a new template specialization type.
910   ///
911   /// By default, performs semantic analysis when building the template
912   /// specialization type. Subclasses may override this routine to provide
913   /// different behavior.
914   QualType RebuildTemplateSpecializationType(TemplateName Template,
915                                              SourceLocation TemplateLoc,
916                                              TemplateArgumentListInfo &Args);
917 
918   /// \brief Build a new parenthesized type.
919   ///
920   /// By default, builds a new ParenType type from the inner type.
921   /// Subclasses may override this routine to provide different behavior.
922   QualType RebuildParenType(QualType InnerType) {
923     return SemaRef.BuildParenType(InnerType);
924   }
925 
926   /// \brief Build a new qualified name type.
927   ///
928   /// By default, builds a new ElaboratedType type from the keyword,
929   /// the nested-name-specifier and the named type.
930   /// Subclasses may override this routine to provide different behavior.
931   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
932                                  ElaboratedTypeKeyword Keyword,
933                                  NestedNameSpecifierLoc QualifierLoc,
934                                  QualType Named) {
935     return SemaRef.Context.getElaboratedType(Keyword,
936                                          QualifierLoc.getNestedNameSpecifier(),
937                                              Named);
938   }
939 
940   /// \brief Build a new typename type that refers to a template-id.
941   ///
942   /// By default, builds a new DependentNameType type from the
943   /// nested-name-specifier and the given type. Subclasses may override
944   /// this routine to provide different behavior.
945   QualType RebuildDependentTemplateSpecializationType(
946                                           ElaboratedTypeKeyword Keyword,
947                                           NestedNameSpecifierLoc QualifierLoc,
948                                           const IdentifierInfo *Name,
949                                           SourceLocation NameLoc,
950                                           TemplateArgumentListInfo &Args,
951                                           bool AllowInjectedClassName) {
952     // Rebuild the template name.
953     // TODO: avoid TemplateName abstraction
954     CXXScopeSpec SS;
955     SS.Adopt(QualifierLoc);
956     TemplateName InstName
957       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
958                                          nullptr, AllowInjectedClassName);
959 
960     if (InstName.isNull())
961       return QualType();
962 
963     // If it's still dependent, make a dependent specialization.
964     if (InstName.getAsDependentTemplateName())
965       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
966                                           QualifierLoc.getNestedNameSpecifier(),
967                                                                     Name,
968                                                                     Args);
969 
970     // Otherwise, make an elaborated type wrapping a non-dependent
971     // specialization.
972     QualType T =
973     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
974     if (T.isNull()) return QualType();
975 
976     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
977       return T;
978 
979     return SemaRef.Context.getElaboratedType(Keyword,
980                                        QualifierLoc.getNestedNameSpecifier(),
981                                              T);
982   }
983 
984   /// \brief Build a new typename type that refers to an identifier.
985   ///
986   /// By default, performs semantic analysis when building the typename type
987   /// (or elaborated type). Subclasses may override this routine to provide
988   /// different behavior.
989   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
990                                     SourceLocation KeywordLoc,
991                                     NestedNameSpecifierLoc QualifierLoc,
992                                     const IdentifierInfo *Id,
993                                     SourceLocation IdLoc,
994                                     bool DeducedTSTContext) {
995     CXXScopeSpec SS;
996     SS.Adopt(QualifierLoc);
997 
998     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
999       // If the name is still dependent, just build a new dependent name type.
1000       if (!SemaRef.computeDeclContext(SS))
1001         return SemaRef.Context.getDependentNameType(Keyword,
1002                                           QualifierLoc.getNestedNameSpecifier(),
1003                                                     Id);
1004     }
1005 
1006     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1007       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1008                                              *Id, IdLoc);
1009       // If a dependent name resolves to a deduced template specialization type,
1010       // check that we're in one of the syntactic contexts permitting it.
1011       if (!DeducedTSTContext) {
1012         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1013                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1014           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1015             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1016                    Deduced->getTemplateName())
1017             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1018           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1019             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1020           return QualType();
1021         }
1022       }
1023       return T;
1024     }
1025 
1026     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1027 
1028     // We had a dependent elaborated-type-specifier that has been transformed
1029     // into a non-dependent elaborated-type-specifier. Find the tag we're
1030     // referring to.
1031     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1032     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1033     if (!DC)
1034       return QualType();
1035 
1036     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1037       return QualType();
1038 
1039     TagDecl *Tag = nullptr;
1040     SemaRef.LookupQualifiedName(Result, DC);
1041     switch (Result.getResultKind()) {
1042       case LookupResult::NotFound:
1043       case LookupResult::NotFoundInCurrentInstantiation:
1044         break;
1045 
1046       case LookupResult::Found:
1047         Tag = Result.getAsSingle<TagDecl>();
1048         break;
1049 
1050       case LookupResult::FoundOverloaded:
1051       case LookupResult::FoundUnresolvedValue:
1052         llvm_unreachable("Tag lookup cannot find non-tags");
1053 
1054       case LookupResult::Ambiguous:
1055         // Let the LookupResult structure handle ambiguities.
1056         return QualType();
1057     }
1058 
1059     if (!Tag) {
1060       // Check where the name exists but isn't a tag type and use that to emit
1061       // better diagnostics.
1062       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1063       SemaRef.LookupQualifiedName(Result, DC);
1064       switch (Result.getResultKind()) {
1065         case LookupResult::Found:
1066         case LookupResult::FoundOverloaded:
1067         case LookupResult::FoundUnresolvedValue: {
1068           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1069           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1070           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1071                                                                << NTK << Kind;
1072           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1073           break;
1074         }
1075         default:
1076           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1077               << Kind << Id << DC << QualifierLoc.getSourceRange();
1078           break;
1079       }
1080       return QualType();
1081     }
1082 
1083     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1084                                               IdLoc, Id)) {
1085       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1086       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1087       return QualType();
1088     }
1089 
1090     // Build the elaborated-type-specifier type.
1091     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1092     return SemaRef.Context.getElaboratedType(Keyword,
1093                                          QualifierLoc.getNestedNameSpecifier(),
1094                                              T);
1095   }
1096 
1097   /// \brief Build a new pack expansion type.
1098   ///
1099   /// By default, builds a new PackExpansionType type from the given pattern.
1100   /// Subclasses may override this routine to provide different behavior.
1101   QualType RebuildPackExpansionType(QualType Pattern,
1102                                     SourceRange PatternRange,
1103                                     SourceLocation EllipsisLoc,
1104                                     Optional<unsigned> NumExpansions) {
1105     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1106                                         NumExpansions);
1107   }
1108 
1109   /// \brief Build a new atomic type given its value type.
1110   ///
1111   /// By default, performs semantic analysis when building the atomic type.
1112   /// Subclasses may override this routine to provide different behavior.
1113   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1114 
1115   /// \brief Build a new pipe type given its value type.
1116   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1117                            bool isReadPipe);
1118 
1119   /// \brief Build a new template name given a nested name specifier, a flag
1120   /// indicating whether the "template" keyword was provided, and the template
1121   /// that the template name refers to.
1122   ///
1123   /// By default, builds the new template name directly. Subclasses may override
1124   /// this routine to provide different behavior.
1125   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1126                                    bool TemplateKW,
1127                                    TemplateDecl *Template);
1128 
1129   /// \brief Build a new template name given a nested name specifier and the
1130   /// name that is referred to as a template.
1131   ///
1132   /// By default, performs semantic analysis to determine whether the name can
1133   /// be resolved to a specific template, then builds the appropriate kind of
1134   /// template name. Subclasses may override this routine to provide different
1135   /// behavior.
1136   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1137                                    const IdentifierInfo &Name,
1138                                    SourceLocation NameLoc,
1139                                    QualType ObjectType,
1140                                    NamedDecl *FirstQualifierInScope,
1141                                    bool AllowInjectedClassName);
1142 
1143   /// \brief Build a new template name given a nested name specifier and the
1144   /// overloaded operator name that is referred to as a template.
1145   ///
1146   /// By default, performs semantic analysis to determine whether the name can
1147   /// be resolved to a specific template, then builds the appropriate kind of
1148   /// template name. Subclasses may override this routine to provide different
1149   /// behavior.
1150   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1151                                    OverloadedOperatorKind Operator,
1152                                    SourceLocation NameLoc,
1153                                    QualType ObjectType,
1154                                    bool AllowInjectedClassName);
1155 
1156   /// \brief Build a new template name given a template template parameter pack
1157   /// and the
1158   ///
1159   /// By default, performs semantic analysis to determine whether the name can
1160   /// be resolved to a specific template, then builds the appropriate kind of
1161   /// template name. Subclasses may override this routine to provide different
1162   /// behavior.
1163   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1164                                    const TemplateArgument &ArgPack) {
1165     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1166   }
1167 
1168   /// \brief Build a new compound statement.
1169   ///
1170   /// By default, performs semantic analysis to build the new statement.
1171   /// Subclasses may override this routine to provide different behavior.
1172   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1173                                        MultiStmtArg Statements,
1174                                        SourceLocation RBraceLoc,
1175                                        bool IsStmtExpr) {
1176     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1177                                        IsStmtExpr);
1178   }
1179 
1180   /// \brief Build a new case 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 RebuildCaseStmt(SourceLocation CaseLoc,
1185                                    Expr *LHS,
1186                                    SourceLocation EllipsisLoc,
1187                                    Expr *RHS,
1188                                    SourceLocation ColonLoc) {
1189     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1190                                    ColonLoc);
1191   }
1192 
1193   /// \brief Attach the body to a new case statement.
1194   ///
1195   /// By default, performs semantic analysis to build the new statement.
1196   /// Subclasses may override this routine to provide different behavior.
1197   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1198     getSema().ActOnCaseStmtBody(S, Body);
1199     return S;
1200   }
1201 
1202   /// \brief Build a new default statement.
1203   ///
1204   /// By default, performs semantic analysis to build the new statement.
1205   /// Subclasses may override this routine to provide different behavior.
1206   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1207                                       SourceLocation ColonLoc,
1208                                       Stmt *SubStmt) {
1209     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1210                                       /*CurScope=*/nullptr);
1211   }
1212 
1213   /// \brief Build a new label statement.
1214   ///
1215   /// By default, performs semantic analysis to build the new statement.
1216   /// Subclasses may override this routine to provide different behavior.
1217   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1218                               SourceLocation ColonLoc, Stmt *SubStmt) {
1219     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1220   }
1221 
1222   /// \brief Build a new label statement.
1223   ///
1224   /// By default, performs semantic analysis to build the new statement.
1225   /// Subclasses may override this routine to provide different behavior.
1226   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1227                                    ArrayRef<const Attr*> Attrs,
1228                                    Stmt *SubStmt) {
1229     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1230   }
1231 
1232   /// \brief Build a new "if" statement.
1233   ///
1234   /// By default, performs semantic analysis to build the new statement.
1235   /// Subclasses may override this routine to provide different behavior.
1236   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1237                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1238                            SourceLocation ElseLoc, Stmt *Else) {
1239     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1240                                  ElseLoc, Else);
1241   }
1242 
1243   /// \brief Start building a new switch statement.
1244   ///
1245   /// By default, performs semantic analysis to build the new statement.
1246   /// Subclasses may override this routine to provide different behavior.
1247   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1248                                     Sema::ConditionResult Cond) {
1249     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1250   }
1251 
1252   /// \brief Attach the body to the switch statement.
1253   ///
1254   /// By default, performs semantic analysis to build the new statement.
1255   /// Subclasses may override this routine to provide different behavior.
1256   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1257                                    Stmt *Switch, Stmt *Body) {
1258     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1259   }
1260 
1261   /// \brief Build a new while statement.
1262   ///
1263   /// By default, performs semantic analysis to build the new statement.
1264   /// Subclasses may override this routine to provide different behavior.
1265   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1266                               Sema::ConditionResult Cond, Stmt *Body) {
1267     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1268   }
1269 
1270   /// \brief Build a new do-while statement.
1271   ///
1272   /// By default, performs semantic analysis to build the new statement.
1273   /// Subclasses may override this routine to provide different behavior.
1274   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1275                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1276                            Expr *Cond, SourceLocation RParenLoc) {
1277     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1278                                  Cond, RParenLoc);
1279   }
1280 
1281   /// \brief Build a new for statement.
1282   ///
1283   /// By default, performs semantic analysis to build the new statement.
1284   /// Subclasses may override this routine to provide different behavior.
1285   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1286                             Stmt *Init, Sema::ConditionResult Cond,
1287                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1288                             Stmt *Body) {
1289     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1290                                   Inc, RParenLoc, Body);
1291   }
1292 
1293   /// \brief Build a new goto statement.
1294   ///
1295   /// By default, performs semantic analysis to build the new statement.
1296   /// Subclasses may override this routine to provide different behavior.
1297   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1298                              LabelDecl *Label) {
1299     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1300   }
1301 
1302   /// \brief Build a new indirect goto statement.
1303   ///
1304   /// By default, performs semantic analysis to build the new statement.
1305   /// Subclasses may override this routine to provide different behavior.
1306   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1307                                      SourceLocation StarLoc,
1308                                      Expr *Target) {
1309     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1310   }
1311 
1312   /// \brief Build a new return statement.
1313   ///
1314   /// By default, performs semantic analysis to build the new statement.
1315   /// Subclasses may override this routine to provide different behavior.
1316   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1317     return getSema().BuildReturnStmt(ReturnLoc, Result);
1318   }
1319 
1320   /// \brief Build a new declaration statement.
1321   ///
1322   /// By default, performs semantic analysis to build the new statement.
1323   /// Subclasses may override this routine to provide different behavior.
1324   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1325                              SourceLocation StartLoc, SourceLocation EndLoc) {
1326     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1327     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1328   }
1329 
1330   /// \brief Build a new inline asm statement.
1331   ///
1332   /// By default, performs semantic analysis to build the new statement.
1333   /// Subclasses may override this routine to provide different behavior.
1334   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1335                                bool IsVolatile, unsigned NumOutputs,
1336                                unsigned NumInputs, IdentifierInfo **Names,
1337                                MultiExprArg Constraints, MultiExprArg Exprs,
1338                                Expr *AsmString, MultiExprArg Clobbers,
1339                                SourceLocation RParenLoc) {
1340     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1341                                      NumInputs, Names, Constraints, Exprs,
1342                                      AsmString, Clobbers, RParenLoc);
1343   }
1344 
1345   /// \brief Build a new MS style inline asm statement.
1346   ///
1347   /// By default, performs semantic analysis to build the new statement.
1348   /// Subclasses may override this routine to provide different behavior.
1349   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1350                               ArrayRef<Token> AsmToks,
1351                               StringRef AsmString,
1352                               unsigned NumOutputs, unsigned NumInputs,
1353                               ArrayRef<StringRef> Constraints,
1354                               ArrayRef<StringRef> Clobbers,
1355                               ArrayRef<Expr*> Exprs,
1356                               SourceLocation EndLoc) {
1357     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1358                                     NumOutputs, NumInputs,
1359                                     Constraints, Clobbers, Exprs, EndLoc);
1360   }
1361 
1362   /// \brief Build a new co_return statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1367                                  bool IsImplicit) {
1368     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1369   }
1370 
1371   /// \brief Build a new co_await expression.
1372   ///
1373   /// By default, performs semantic analysis to build the new expression.
1374   /// Subclasses may override this routine to provide different behavior.
1375   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1376                                 bool IsImplicit) {
1377     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1378   }
1379 
1380   /// \brief Build a new co_await expression.
1381   ///
1382   /// By default, performs semantic analysis to build the new expression.
1383   /// Subclasses may override this routine to provide different behavior.
1384   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1385                                          Expr *Result,
1386                                          UnresolvedLookupExpr *Lookup) {
1387     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1388   }
1389 
1390   /// \brief Build a new co_yield expression.
1391   ///
1392   /// By default, performs semantic analysis to build the new expression.
1393   /// Subclasses may override this routine to provide different behavior.
1394   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1395     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1396   }
1397 
1398   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1399     return getSema().BuildCoroutineBodyStmt(Args);
1400   }
1401 
1402   /// \brief Build a new Objective-C \@try statement.
1403   ///
1404   /// By default, performs semantic analysis to build the new statement.
1405   /// Subclasses may override this routine to provide different behavior.
1406   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1407                                         Stmt *TryBody,
1408                                         MultiStmtArg CatchStmts,
1409                                         Stmt *Finally) {
1410     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1411                                         Finally);
1412   }
1413 
1414   /// \brief Rebuild an Objective-C exception declaration.
1415   ///
1416   /// By default, performs semantic analysis to build the new declaration.
1417   /// Subclasses may override this routine to provide different behavior.
1418   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1419                                     TypeSourceInfo *TInfo, QualType T) {
1420     return getSema().BuildObjCExceptionDecl(TInfo, T,
1421                                             ExceptionDecl->getInnerLocStart(),
1422                                             ExceptionDecl->getLocation(),
1423                                             ExceptionDecl->getIdentifier());
1424   }
1425 
1426   /// \brief Build a new Objective-C \@catch statement.
1427   ///
1428   /// By default, performs semantic analysis to build the new statement.
1429   /// Subclasses may override this routine to provide different behavior.
1430   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1431                                           SourceLocation RParenLoc,
1432                                           VarDecl *Var,
1433                                           Stmt *Body) {
1434     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1435                                           Var, Body);
1436   }
1437 
1438   /// \brief Build a new Objective-C \@finally statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1443                                             Stmt *Body) {
1444     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1445   }
1446 
1447   /// \brief Build a new Objective-C \@throw statement.
1448   ///
1449   /// By default, performs semantic analysis to build the new statement.
1450   /// Subclasses may override this routine to provide different behavior.
1451   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1452                                           Expr *Operand) {
1453     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1454   }
1455 
1456   /// \brief Build a new OpenMP executable directive.
1457   ///
1458   /// By default, performs semantic analysis to build the new statement.
1459   /// Subclasses may override this routine to provide different behavior.
1460   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1461                                            DeclarationNameInfo DirName,
1462                                            OpenMPDirectiveKind CancelRegion,
1463                                            ArrayRef<OMPClause *> Clauses,
1464                                            Stmt *AStmt, SourceLocation StartLoc,
1465                                            SourceLocation EndLoc) {
1466     return getSema().ActOnOpenMPExecutableDirective(
1467         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1468   }
1469 
1470   /// \brief Build a new OpenMP 'if' clause.
1471   ///
1472   /// By default, performs semantic analysis to build the new OpenMP clause.
1473   /// Subclasses may override this routine to provide different behavior.
1474   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1475                                 Expr *Condition, SourceLocation StartLoc,
1476                                 SourceLocation LParenLoc,
1477                                 SourceLocation NameModifierLoc,
1478                                 SourceLocation ColonLoc,
1479                                 SourceLocation EndLoc) {
1480     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1481                                          LParenLoc, NameModifierLoc, ColonLoc,
1482                                          EndLoc);
1483   }
1484 
1485   /// \brief Build a new OpenMP 'final' clause.
1486   ///
1487   /// By default, performs semantic analysis to build the new OpenMP clause.
1488   /// Subclasses may override this routine to provide different behavior.
1489   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1490                                    SourceLocation LParenLoc,
1491                                    SourceLocation EndLoc) {
1492     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1493                                             EndLoc);
1494   }
1495 
1496   /// \brief Build a new OpenMP 'num_threads' clause.
1497   ///
1498   /// By default, performs semantic analysis to build the new OpenMP clause.
1499   /// Subclasses may override this routine to provide different behavior.
1500   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1501                                         SourceLocation StartLoc,
1502                                         SourceLocation LParenLoc,
1503                                         SourceLocation EndLoc) {
1504     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1505                                                  LParenLoc, EndLoc);
1506   }
1507 
1508   /// \brief Build a new OpenMP 'safelen' clause.
1509   ///
1510   /// By default, performs semantic analysis to build the new OpenMP clause.
1511   /// Subclasses may override this routine to provide different behavior.
1512   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1513                                      SourceLocation LParenLoc,
1514                                      SourceLocation EndLoc) {
1515     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1516   }
1517 
1518   /// \brief Build a new OpenMP 'simdlen' clause.
1519   ///
1520   /// By default, performs semantic analysis to build the new OpenMP clause.
1521   /// Subclasses may override this routine to provide different behavior.
1522   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1523                                      SourceLocation LParenLoc,
1524                                      SourceLocation EndLoc) {
1525     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1526   }
1527 
1528   /// \brief Build a new OpenMP 'collapse' clause.
1529   ///
1530   /// By default, performs semantic analysis to build the new OpenMP clause.
1531   /// Subclasses may override this routine to provide different behavior.
1532   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1533                                       SourceLocation LParenLoc,
1534                                       SourceLocation EndLoc) {
1535     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1536                                                EndLoc);
1537   }
1538 
1539   /// \brief Build a new OpenMP 'default' clause.
1540   ///
1541   /// By default, performs semantic analysis to build the new OpenMP clause.
1542   /// Subclasses may override this routine to provide different behavior.
1543   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1544                                      SourceLocation KindKwLoc,
1545                                      SourceLocation StartLoc,
1546                                      SourceLocation LParenLoc,
1547                                      SourceLocation EndLoc) {
1548     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1549                                               StartLoc, LParenLoc, EndLoc);
1550   }
1551 
1552   /// \brief Build a new OpenMP 'proc_bind' clause.
1553   ///
1554   /// By default, performs semantic analysis to build the new OpenMP clause.
1555   /// Subclasses may override this routine to provide different behavior.
1556   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1557                                       SourceLocation KindKwLoc,
1558                                       SourceLocation StartLoc,
1559                                       SourceLocation LParenLoc,
1560                                       SourceLocation EndLoc) {
1561     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1562                                                StartLoc, LParenLoc, EndLoc);
1563   }
1564 
1565   /// \brief Build a new OpenMP 'schedule' clause.
1566   ///
1567   /// By default, performs semantic analysis to build the new OpenMP clause.
1568   /// Subclasses may override this routine to provide different behavior.
1569   OMPClause *RebuildOMPScheduleClause(
1570       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1571       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1572       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1573       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1574     return getSema().ActOnOpenMPScheduleClause(
1575         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1576         CommaLoc, EndLoc);
1577   }
1578 
1579   /// \brief Build a new OpenMP 'ordered' clause.
1580   ///
1581   /// By default, performs semantic analysis to build the new OpenMP clause.
1582   /// Subclasses may override this routine to provide different behavior.
1583   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1584                                      SourceLocation EndLoc,
1585                                      SourceLocation LParenLoc, Expr *Num) {
1586     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1587   }
1588 
1589   /// \brief Build a new OpenMP 'private' clause.
1590   ///
1591   /// By default, performs semantic analysis to build the new OpenMP clause.
1592   /// Subclasses may override this routine to provide different behavior.
1593   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1594                                      SourceLocation StartLoc,
1595                                      SourceLocation LParenLoc,
1596                                      SourceLocation EndLoc) {
1597     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1598                                               EndLoc);
1599   }
1600 
1601   /// \brief Build a new OpenMP 'firstprivate' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1606                                           SourceLocation StartLoc,
1607                                           SourceLocation LParenLoc,
1608                                           SourceLocation EndLoc) {
1609     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1610                                                    EndLoc);
1611   }
1612 
1613   /// \brief Build a new OpenMP 'lastprivate' clause.
1614   ///
1615   /// By default, performs semantic analysis to build the new OpenMP clause.
1616   /// Subclasses may override this routine to provide different behavior.
1617   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1618                                          SourceLocation StartLoc,
1619                                          SourceLocation LParenLoc,
1620                                          SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1622                                                   EndLoc);
1623   }
1624 
1625   /// \brief Build a new OpenMP 'shared' clause.
1626   ///
1627   /// By default, performs semantic analysis to build the new OpenMP clause.
1628   /// Subclasses may override this routine to provide different behavior.
1629   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1630                                     SourceLocation StartLoc,
1631                                     SourceLocation LParenLoc,
1632                                     SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1634                                              EndLoc);
1635   }
1636 
1637   /// \brief Build a new OpenMP 'reduction' clause.
1638   ///
1639   /// By default, performs semantic analysis to build the new statement.
1640   /// Subclasses may override this routine to provide different behavior.
1641   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1642                                        SourceLocation StartLoc,
1643                                        SourceLocation LParenLoc,
1644                                        SourceLocation ColonLoc,
1645                                        SourceLocation EndLoc,
1646                                        CXXScopeSpec &ReductionIdScopeSpec,
1647                                        const DeclarationNameInfo &ReductionId,
1648                                        ArrayRef<Expr *> UnresolvedReductions) {
1649     return getSema().ActOnOpenMPReductionClause(
1650         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1651         ReductionId, UnresolvedReductions);
1652   }
1653 
1654   /// \brief Build a new OpenMP 'linear' clause.
1655   ///
1656   /// By default, performs semantic analysis to build the new OpenMP clause.
1657   /// Subclasses may override this routine to provide different behavior.
1658   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1659                                     SourceLocation StartLoc,
1660                                     SourceLocation LParenLoc,
1661                                     OpenMPLinearClauseKind Modifier,
1662                                     SourceLocation ModifierLoc,
1663                                     SourceLocation ColonLoc,
1664                                     SourceLocation EndLoc) {
1665     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1666                                              Modifier, ModifierLoc, ColonLoc,
1667                                              EndLoc);
1668   }
1669 
1670   /// \brief Build a new OpenMP 'aligned' clause.
1671   ///
1672   /// By default, performs semantic analysis to build the new OpenMP clause.
1673   /// Subclasses may override this routine to provide different behavior.
1674   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1675                                      SourceLocation StartLoc,
1676                                      SourceLocation LParenLoc,
1677                                      SourceLocation ColonLoc,
1678                                      SourceLocation EndLoc) {
1679     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1680                                               LParenLoc, ColonLoc, EndLoc);
1681   }
1682 
1683   /// \brief Build a new OpenMP 'copyin' clause.
1684   ///
1685   /// By default, performs semantic analysis to build the new OpenMP clause.
1686   /// Subclasses may override this routine to provide different behavior.
1687   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1688                                     SourceLocation StartLoc,
1689                                     SourceLocation LParenLoc,
1690                                     SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1692                                              EndLoc);
1693   }
1694 
1695   /// \brief Build a new OpenMP 'copyprivate' clause.
1696   ///
1697   /// By default, performs semantic analysis to build the new OpenMP clause.
1698   /// Subclasses may override this routine to provide different behavior.
1699   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1700                                          SourceLocation StartLoc,
1701                                          SourceLocation LParenLoc,
1702                                          SourceLocation EndLoc) {
1703     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1704                                                   EndLoc);
1705   }
1706 
1707   /// \brief Build a new OpenMP 'flush' pseudo clause.
1708   ///
1709   /// By default, performs semantic analysis to build the new OpenMP clause.
1710   /// Subclasses may override this routine to provide different behavior.
1711   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1712                                    SourceLocation StartLoc,
1713                                    SourceLocation LParenLoc,
1714                                    SourceLocation EndLoc) {
1715     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1716                                             EndLoc);
1717   }
1718 
1719   /// \brief Build a new OpenMP 'depend' pseudo clause.
1720   ///
1721   /// By default, performs semantic analysis to build the new OpenMP clause.
1722   /// Subclasses may override this routine to provide different behavior.
1723   OMPClause *
1724   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1725                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1726                          SourceLocation StartLoc, SourceLocation LParenLoc,
1727                          SourceLocation EndLoc) {
1728     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1729                                              StartLoc, LParenLoc, EndLoc);
1730   }
1731 
1732   /// \brief Build a new OpenMP 'device' clause.
1733   ///
1734   /// By default, performs semantic analysis to build the new statement.
1735   /// Subclasses may override this routine to provide different behavior.
1736   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1737                                     SourceLocation LParenLoc,
1738                                     SourceLocation EndLoc) {
1739     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1740                                              EndLoc);
1741   }
1742 
1743   /// \brief Build a new OpenMP 'map' clause.
1744   ///
1745   /// By default, performs semantic analysis to build the new OpenMP clause.
1746   /// Subclasses may override this routine to provide different behavior.
1747   OMPClause *
1748   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1749                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1750                       SourceLocation MapLoc, SourceLocation ColonLoc,
1751                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1752                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1753     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1754                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1755                                           VarList, StartLoc, LParenLoc, EndLoc);
1756   }
1757 
1758   /// \brief Build a new OpenMP 'num_teams' clause.
1759   ///
1760   /// By default, performs semantic analysis to build the new statement.
1761   /// Subclasses may override this routine to provide different behavior.
1762   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1763                                       SourceLocation LParenLoc,
1764                                       SourceLocation EndLoc) {
1765     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1766                                                EndLoc);
1767   }
1768 
1769   /// \brief Build a new OpenMP 'thread_limit' clause.
1770   ///
1771   /// By default, performs semantic analysis to build the new statement.
1772   /// Subclasses may override this routine to provide different behavior.
1773   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1774                                          SourceLocation StartLoc,
1775                                          SourceLocation LParenLoc,
1776                                          SourceLocation EndLoc) {
1777     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1778                                                   LParenLoc, EndLoc);
1779   }
1780 
1781   /// \brief Build a new OpenMP 'priority' clause.
1782   ///
1783   /// By default, performs semantic analysis to build the new statement.
1784   /// Subclasses may override this routine to provide different behavior.
1785   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1786                                       SourceLocation LParenLoc,
1787                                       SourceLocation EndLoc) {
1788     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1789                                                EndLoc);
1790   }
1791 
1792   /// \brief Build a new OpenMP 'grainsize' clause.
1793   ///
1794   /// By default, performs semantic analysis to build the new statement.
1795   /// Subclasses may override this routine to provide different behavior.
1796   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1797                                        SourceLocation LParenLoc,
1798                                        SourceLocation EndLoc) {
1799     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1800                                                 EndLoc);
1801   }
1802 
1803   /// \brief Build a new OpenMP 'num_tasks' clause.
1804   ///
1805   /// By default, performs semantic analysis to build the new statement.
1806   /// Subclasses may override this routine to provide different behavior.
1807   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1808                                       SourceLocation LParenLoc,
1809                                       SourceLocation EndLoc) {
1810     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1811                                                EndLoc);
1812   }
1813 
1814   /// \brief Build a new OpenMP 'hint' clause.
1815   ///
1816   /// By default, performs semantic analysis to build the new statement.
1817   /// Subclasses may override this routine to provide different behavior.
1818   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1819                                   SourceLocation LParenLoc,
1820                                   SourceLocation EndLoc) {
1821     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1822   }
1823 
1824   /// \brief Build a new OpenMP 'dist_schedule' clause.
1825   ///
1826   /// By default, performs semantic analysis to build the new OpenMP clause.
1827   /// Subclasses may override this routine to provide different behavior.
1828   OMPClause *
1829   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1830                                Expr *ChunkSize, SourceLocation StartLoc,
1831                                SourceLocation LParenLoc, SourceLocation KindLoc,
1832                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1833     return getSema().ActOnOpenMPDistScheduleClause(
1834         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1835   }
1836 
1837   /// \brief Build a new OpenMP 'to' clause.
1838   ///
1839   /// By default, performs semantic analysis to build the new statement.
1840   /// Subclasses may override this routine to provide different behavior.
1841   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1842                                 SourceLocation StartLoc,
1843                                 SourceLocation LParenLoc,
1844                                 SourceLocation EndLoc) {
1845     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1846   }
1847 
1848   /// \brief Build a new OpenMP 'from' clause.
1849   ///
1850   /// By default, performs semantic analysis to build the new statement.
1851   /// Subclasses may override this routine to provide different behavior.
1852   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1853                                   SourceLocation StartLoc,
1854                                   SourceLocation LParenLoc,
1855                                   SourceLocation EndLoc) {
1856     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1857                                            EndLoc);
1858   }
1859 
1860   /// Build a new OpenMP 'use_device_ptr' clause.
1861   ///
1862   /// By default, performs semantic analysis to build the new OpenMP clause.
1863   /// Subclasses may override this routine to provide different behavior.
1864   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1865                                           SourceLocation StartLoc,
1866                                           SourceLocation LParenLoc,
1867                                           SourceLocation EndLoc) {
1868     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1869                                                    EndLoc);
1870   }
1871 
1872   /// Build a new OpenMP 'is_device_ptr' clause.
1873   ///
1874   /// By default, performs semantic analysis to build the new OpenMP clause.
1875   /// Subclasses may override this routine to provide different behavior.
1876   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1877                                          SourceLocation StartLoc,
1878                                          SourceLocation LParenLoc,
1879                                          SourceLocation EndLoc) {
1880     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1881                                                   EndLoc);
1882   }
1883 
1884   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1885   ///
1886   /// By default, performs semantic analysis to build the new statement.
1887   /// Subclasses may override this routine to provide different behavior.
1888   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1889                                               Expr *object) {
1890     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1891   }
1892 
1893   /// \brief Build a new Objective-C \@synchronized statement.
1894   ///
1895   /// By default, performs semantic analysis to build the new statement.
1896   /// Subclasses may override this routine to provide different behavior.
1897   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1898                                            Expr *Object, Stmt *Body) {
1899     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1900   }
1901 
1902   /// \brief Build a new Objective-C \@autoreleasepool statement.
1903   ///
1904   /// By default, performs semantic analysis to build the new statement.
1905   /// Subclasses may override this routine to provide different behavior.
1906   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1907                                             Stmt *Body) {
1908     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1909   }
1910 
1911   /// \brief Build a new Objective-C fast enumeration statement.
1912   ///
1913   /// By default, performs semantic analysis to build the new statement.
1914   /// Subclasses may override this routine to provide different behavior.
1915   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1916                                           Stmt *Element,
1917                                           Expr *Collection,
1918                                           SourceLocation RParenLoc,
1919                                           Stmt *Body) {
1920     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1921                                                 Element,
1922                                                 Collection,
1923                                                 RParenLoc);
1924     if (ForEachStmt.isInvalid())
1925       return StmtError();
1926 
1927     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1928   }
1929 
1930   /// \brief Build a new C++ exception declaration.
1931   ///
1932   /// By default, performs semantic analysis to build the new decaration.
1933   /// Subclasses may override this routine to provide different behavior.
1934   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1935                                 TypeSourceInfo *Declarator,
1936                                 SourceLocation StartLoc,
1937                                 SourceLocation IdLoc,
1938                                 IdentifierInfo *Id) {
1939     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1940                                                        StartLoc, IdLoc, Id);
1941     if (Var)
1942       getSema().CurContext->addDecl(Var);
1943     return Var;
1944   }
1945 
1946   /// \brief Build a new C++ catch statement.
1947   ///
1948   /// By default, performs semantic analysis to build the new statement.
1949   /// Subclasses may override this routine to provide different behavior.
1950   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1951                                  VarDecl *ExceptionDecl,
1952                                  Stmt *Handler) {
1953     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1954                                                       Handler));
1955   }
1956 
1957   /// \brief Build a new C++ try statement.
1958   ///
1959   /// By default, performs semantic analysis to build the new statement.
1960   /// Subclasses may override this routine to provide different behavior.
1961   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1962                                ArrayRef<Stmt *> Handlers) {
1963     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1964   }
1965 
1966   /// \brief Build a new C++0x range-based for statement.
1967   ///
1968   /// By default, performs semantic analysis to build the new statement.
1969   /// Subclasses may override this routine to provide different behavior.
1970   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1971                                     SourceLocation CoawaitLoc,
1972                                     SourceLocation ColonLoc,
1973                                     Stmt *Range, Stmt *Begin, Stmt *End,
1974                                     Expr *Cond, Expr *Inc,
1975                                     Stmt *LoopVar,
1976                                     SourceLocation RParenLoc) {
1977     // If we've just learned that the range is actually an Objective-C
1978     // collection, treat this as an Objective-C fast enumeration loop.
1979     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1980       if (RangeStmt->isSingleDecl()) {
1981         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1982           if (RangeVar->isInvalidDecl())
1983             return StmtError();
1984 
1985           Expr *RangeExpr = RangeVar->getInit();
1986           if (!RangeExpr->isTypeDependent() &&
1987               RangeExpr->getType()->isObjCObjectPointerType())
1988             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1989                                                         RParenLoc);
1990         }
1991       }
1992     }
1993 
1994     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
1995                                           Range, Begin, End,
1996                                           Cond, Inc, LoopVar, RParenLoc,
1997                                           Sema::BFRK_Rebuild);
1998   }
1999 
2000   /// \brief Build a new C++0x range-based for statement.
2001   ///
2002   /// By default, performs semantic analysis to build the new statement.
2003   /// Subclasses may override this routine to provide different behavior.
2004   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2005                                           bool IsIfExists,
2006                                           NestedNameSpecifierLoc QualifierLoc,
2007                                           DeclarationNameInfo NameInfo,
2008                                           Stmt *Nested) {
2009     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2010                                                 QualifierLoc, NameInfo, Nested);
2011   }
2012 
2013   /// \brief Attach body to a C++0x range-based for statement.
2014   ///
2015   /// By default, performs semantic analysis to finish the new statement.
2016   /// Subclasses may override this routine to provide different behavior.
2017   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2018     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2019   }
2020 
2021   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2022                                Stmt *TryBlock, Stmt *Handler) {
2023     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2024   }
2025 
2026   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2027                                   Stmt *Block) {
2028     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2029   }
2030 
2031   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2032     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2033   }
2034 
2035   /// \brief Build a new predefined expression.
2036   ///
2037   /// By default, performs semantic analysis to build the new expression.
2038   /// Subclasses may override this routine to provide different behavior.
2039   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2040                                    PredefinedExpr::IdentType IT) {
2041     return getSema().BuildPredefinedExpr(Loc, IT);
2042   }
2043 
2044   /// \brief Build a new expression that references a declaration.
2045   ///
2046   /// By default, performs semantic analysis to build the new expression.
2047   /// Subclasses may override this routine to provide different behavior.
2048   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2049                                         LookupResult &R,
2050                                         bool RequiresADL) {
2051     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2052   }
2053 
2054 
2055   /// \brief Build a new expression that references a declaration.
2056   ///
2057   /// By default, performs semantic analysis to build the new expression.
2058   /// Subclasses may override this routine to provide different behavior.
2059   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2060                                 ValueDecl *VD,
2061                                 const DeclarationNameInfo &NameInfo,
2062                                 TemplateArgumentListInfo *TemplateArgs) {
2063     CXXScopeSpec SS;
2064     SS.Adopt(QualifierLoc);
2065 
2066     // FIXME: loses template args.
2067 
2068     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2069   }
2070 
2071   /// \brief Build a new expression in parentheses.
2072   ///
2073   /// By default, performs semantic analysis to build the new expression.
2074   /// Subclasses may override this routine to provide different behavior.
2075   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2076                                     SourceLocation RParen) {
2077     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2078   }
2079 
2080   /// \brief Build a new pseudo-destructor expression.
2081   ///
2082   /// By default, performs semantic analysis to build the new expression.
2083   /// Subclasses may override this routine to provide different behavior.
2084   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2085                                             SourceLocation OperatorLoc,
2086                                             bool isArrow,
2087                                             CXXScopeSpec &SS,
2088                                             TypeSourceInfo *ScopeType,
2089                                             SourceLocation CCLoc,
2090                                             SourceLocation TildeLoc,
2091                                         PseudoDestructorTypeStorage Destroyed);
2092 
2093   /// \brief Build a new unary operator expression.
2094   ///
2095   /// By default, performs semantic analysis to build the new expression.
2096   /// Subclasses may override this routine to provide different behavior.
2097   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2098                                         UnaryOperatorKind Opc,
2099                                         Expr *SubExpr) {
2100     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2101   }
2102 
2103   /// \brief Build a new builtin offsetof expression.
2104   ///
2105   /// By default, performs semantic analysis to build the new expression.
2106   /// Subclasses may override this routine to provide different behavior.
2107   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2108                                  TypeSourceInfo *Type,
2109                                  ArrayRef<Sema::OffsetOfComponent> Components,
2110                                  SourceLocation RParenLoc) {
2111     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2112                                           RParenLoc);
2113   }
2114 
2115   /// \brief Build a new sizeof, alignof or vec_step expression with a
2116   /// type argument.
2117   ///
2118   /// By default, performs semantic analysis to build the new expression.
2119   /// Subclasses may override this routine to provide different behavior.
2120   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2121                                          SourceLocation OpLoc,
2122                                          UnaryExprOrTypeTrait ExprKind,
2123                                          SourceRange R) {
2124     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2125   }
2126 
2127   /// \brief Build a new sizeof, alignof or vec step expression with an
2128   /// expression argument.
2129   ///
2130   /// By default, performs semantic analysis to build the new expression.
2131   /// Subclasses may override this routine to provide different behavior.
2132   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2133                                          UnaryExprOrTypeTrait ExprKind,
2134                                          SourceRange R) {
2135     ExprResult Result
2136       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2137     if (Result.isInvalid())
2138       return ExprError();
2139 
2140     return Result;
2141   }
2142 
2143   /// \brief Build a new array subscript expression.
2144   ///
2145   /// By default, performs semantic analysis to build the new expression.
2146   /// Subclasses may override this routine to provide different behavior.
2147   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2148                                              SourceLocation LBracketLoc,
2149                                              Expr *RHS,
2150                                              SourceLocation RBracketLoc) {
2151     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2152                                              LBracketLoc, RHS,
2153                                              RBracketLoc);
2154   }
2155 
2156   /// \brief Build a new array section expression.
2157   ///
2158   /// By default, performs semantic analysis to build the new expression.
2159   /// Subclasses may override this routine to provide different behavior.
2160   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2161                                         Expr *LowerBound,
2162                                         SourceLocation ColonLoc, Expr *Length,
2163                                         SourceLocation RBracketLoc) {
2164     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2165                                               ColonLoc, Length, RBracketLoc);
2166   }
2167 
2168   /// \brief Build a new call expression.
2169   ///
2170   /// By default, performs semantic analysis to build the new expression.
2171   /// Subclasses may override this routine to provide different behavior.
2172   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2173                                    MultiExprArg Args,
2174                                    SourceLocation RParenLoc,
2175                                    Expr *ExecConfig = nullptr) {
2176     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2177                                    Args, RParenLoc, ExecConfig);
2178   }
2179 
2180   /// \brief Build a new member access expression.
2181   ///
2182   /// By default, performs semantic analysis to build the new expression.
2183   /// Subclasses may override this routine to provide different behavior.
2184   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2185                                bool isArrow,
2186                                NestedNameSpecifierLoc QualifierLoc,
2187                                SourceLocation TemplateKWLoc,
2188                                const DeclarationNameInfo &MemberNameInfo,
2189                                ValueDecl *Member,
2190                                NamedDecl *FoundDecl,
2191                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2192                                NamedDecl *FirstQualifierInScope) {
2193     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2194                                                                       isArrow);
2195     if (!Member->getDeclName()) {
2196       // We have a reference to an unnamed field.  This is always the
2197       // base of an anonymous struct/union member access, i.e. the
2198       // field is always of record type.
2199       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
2200       assert(Member->getType()->isRecordType() &&
2201              "unnamed member not of record type?");
2202 
2203       BaseResult =
2204         getSema().PerformObjectMemberConversion(BaseResult.get(),
2205                                                 QualifierLoc.getNestedNameSpecifier(),
2206                                                 FoundDecl, Member);
2207       if (BaseResult.isInvalid())
2208         return ExprError();
2209       Base = BaseResult.get();
2210       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
2211       MemberExpr *ME = new (getSema().Context)
2212           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
2213                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
2214       return ME;
2215     }
2216 
2217     CXXScopeSpec SS;
2218     SS.Adopt(QualifierLoc);
2219 
2220     Base = BaseResult.get();
2221     QualType BaseType = Base->getType();
2222 
2223     if (isArrow && !BaseType->isPointerType())
2224       return ExprError();
2225 
2226     // FIXME: this involves duplicating earlier analysis in a lot of
2227     // cases; we should avoid this when possible.
2228     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2229     R.addDecl(FoundDecl);
2230     R.resolveKind();
2231 
2232     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2233                                               SS, TemplateKWLoc,
2234                                               FirstQualifierInScope,
2235                                               R, ExplicitTemplateArgs,
2236                                               /*S*/nullptr);
2237   }
2238 
2239   /// \brief Build a new binary operator expression.
2240   ///
2241   /// By default, performs semantic analysis to build the new expression.
2242   /// Subclasses may override this routine to provide different behavior.
2243   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2244                                          BinaryOperatorKind Opc,
2245                                          Expr *LHS, Expr *RHS) {
2246     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2247   }
2248 
2249   /// \brief Build a new conditional operator expression.
2250   ///
2251   /// By default, performs semantic analysis to build the new expression.
2252   /// Subclasses may override this routine to provide different behavior.
2253   ExprResult RebuildConditionalOperator(Expr *Cond,
2254                                         SourceLocation QuestionLoc,
2255                                         Expr *LHS,
2256                                         SourceLocation ColonLoc,
2257                                         Expr *RHS) {
2258     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2259                                         LHS, RHS);
2260   }
2261 
2262   /// \brief Build a new C-style cast expression.
2263   ///
2264   /// By default, performs semantic analysis to build the new expression.
2265   /// Subclasses may override this routine to provide different behavior.
2266   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2267                                          TypeSourceInfo *TInfo,
2268                                          SourceLocation RParenLoc,
2269                                          Expr *SubExpr) {
2270     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2271                                          SubExpr);
2272   }
2273 
2274   /// \brief Build a new compound literal expression.
2275   ///
2276   /// By default, performs semantic analysis to build the new expression.
2277   /// Subclasses may override this routine to provide different behavior.
2278   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2279                                               TypeSourceInfo *TInfo,
2280                                               SourceLocation RParenLoc,
2281                                               Expr *Init) {
2282     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2283                                               Init);
2284   }
2285 
2286   /// \brief Build a new extended vector element access expression.
2287   ///
2288   /// By default, performs semantic analysis to build the new expression.
2289   /// Subclasses may override this routine to provide different behavior.
2290   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2291                                                SourceLocation OpLoc,
2292                                                SourceLocation AccessorLoc,
2293                                                IdentifierInfo &Accessor) {
2294 
2295     CXXScopeSpec SS;
2296     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2297     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2298                                               OpLoc, /*IsArrow*/ false,
2299                                               SS, SourceLocation(),
2300                                               /*FirstQualifierInScope*/ nullptr,
2301                                               NameInfo,
2302                                               /* TemplateArgs */ nullptr,
2303                                               /*S*/ nullptr);
2304   }
2305 
2306   /// \brief Build a new initializer list expression.
2307   ///
2308   /// By default, performs semantic analysis to build the new expression.
2309   /// Subclasses may override this routine to provide different behavior.
2310   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2311                              MultiExprArg Inits,
2312                              SourceLocation RBraceLoc,
2313                              QualType ResultTy) {
2314     ExprResult Result
2315       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2316     if (Result.isInvalid() || ResultTy->isDependentType())
2317       return Result;
2318 
2319     // Patch in the result type we were given, which may have been computed
2320     // when the initial InitListExpr was built.
2321     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
2322     ILE->setType(ResultTy);
2323     return Result;
2324   }
2325 
2326   /// \brief Build a new designated initializer expression.
2327   ///
2328   /// By default, performs semantic analysis to build the new expression.
2329   /// Subclasses may override this routine to provide different behavior.
2330   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2331                                              MultiExprArg ArrayExprs,
2332                                              SourceLocation EqualOrColonLoc,
2333                                              bool GNUSyntax,
2334                                              Expr *Init) {
2335     ExprResult Result
2336       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2337                                            Init);
2338     if (Result.isInvalid())
2339       return ExprError();
2340 
2341     return Result;
2342   }
2343 
2344   /// \brief Build a new value-initialized expression.
2345   ///
2346   /// By default, builds the implicit value initialization without performing
2347   /// any semantic analysis. Subclasses may override this routine to provide
2348   /// different behavior.
2349   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2350     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2351   }
2352 
2353   /// \brief Build a new \c va_arg expression.
2354   ///
2355   /// By default, performs semantic analysis to build the new expression.
2356   /// Subclasses may override this routine to provide different behavior.
2357   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2358                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2359                                     SourceLocation RParenLoc) {
2360     return getSema().BuildVAArgExpr(BuiltinLoc,
2361                                     SubExpr, TInfo,
2362                                     RParenLoc);
2363   }
2364 
2365   /// \brief Build a new expression list in parentheses.
2366   ///
2367   /// By default, performs semantic analysis to build the new expression.
2368   /// Subclasses may override this routine to provide different behavior.
2369   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2370                                   MultiExprArg SubExprs,
2371                                   SourceLocation RParenLoc) {
2372     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2373   }
2374 
2375   /// \brief Build a new address-of-label expression.
2376   ///
2377   /// By default, performs semantic analysis, using the name of the label
2378   /// rather than attempting to map the label statement itself.
2379   /// Subclasses may override this routine to provide different behavior.
2380   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2381                                   SourceLocation LabelLoc, LabelDecl *Label) {
2382     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2383   }
2384 
2385   /// \brief Build a new GNU statement expression.
2386   ///
2387   /// By default, performs semantic analysis to build the new expression.
2388   /// Subclasses may override this routine to provide different behavior.
2389   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2390                                    Stmt *SubStmt,
2391                                    SourceLocation RParenLoc) {
2392     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2393   }
2394 
2395   /// \brief Build a new __builtin_choose_expr expression.
2396   ///
2397   /// By default, performs semantic analysis to build the new expression.
2398   /// Subclasses may override this routine to provide different behavior.
2399   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2400                                      Expr *Cond, Expr *LHS, Expr *RHS,
2401                                      SourceLocation RParenLoc) {
2402     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2403                                    Cond, LHS, RHS,
2404                                    RParenLoc);
2405   }
2406 
2407   /// \brief Build a new generic selection expression.
2408   ///
2409   /// By default, performs semantic analysis to build the new expression.
2410   /// Subclasses may override this routine to provide different behavior.
2411   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2412                                          SourceLocation DefaultLoc,
2413                                          SourceLocation RParenLoc,
2414                                          Expr *ControllingExpr,
2415                                          ArrayRef<TypeSourceInfo *> Types,
2416                                          ArrayRef<Expr *> Exprs) {
2417     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2418                                                 ControllingExpr, Types, Exprs);
2419   }
2420 
2421   /// \brief Build a new overloaded operator call expression.
2422   ///
2423   /// By default, performs semantic analysis to build the new expression.
2424   /// The semantic analysis provides the behavior of template instantiation,
2425   /// copying with transformations that turn what looks like an overloaded
2426   /// operator call into a use of a builtin operator, performing
2427   /// argument-dependent lookup, etc. Subclasses may override this routine to
2428   /// provide different behavior.
2429   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2430                                               SourceLocation OpLoc,
2431                                               Expr *Callee,
2432                                               Expr *First,
2433                                               Expr *Second);
2434 
2435   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2436   /// reinterpret_cast.
2437   ///
2438   /// By default, this routine dispatches to one of the more-specific routines
2439   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2440   /// Subclasses may override this routine to provide different behavior.
2441   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2442                                            Stmt::StmtClass Class,
2443                                            SourceLocation LAngleLoc,
2444                                            TypeSourceInfo *TInfo,
2445                                            SourceLocation RAngleLoc,
2446                                            SourceLocation LParenLoc,
2447                                            Expr *SubExpr,
2448                                            SourceLocation RParenLoc) {
2449     switch (Class) {
2450     case Stmt::CXXStaticCastExprClass:
2451       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2452                                                    RAngleLoc, LParenLoc,
2453                                                    SubExpr, RParenLoc);
2454 
2455     case Stmt::CXXDynamicCastExprClass:
2456       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2457                                                     RAngleLoc, LParenLoc,
2458                                                     SubExpr, RParenLoc);
2459 
2460     case Stmt::CXXReinterpretCastExprClass:
2461       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2462                                                         RAngleLoc, LParenLoc,
2463                                                         SubExpr,
2464                                                         RParenLoc);
2465 
2466     case Stmt::CXXConstCastExprClass:
2467       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2468                                                    RAngleLoc, LParenLoc,
2469                                                    SubExpr, RParenLoc);
2470 
2471     default:
2472       llvm_unreachable("Invalid C++ named cast");
2473     }
2474   }
2475 
2476   /// \brief Build a new C++ static_cast 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 RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2481                                             SourceLocation LAngleLoc,
2482                                             TypeSourceInfo *TInfo,
2483                                             SourceLocation RAngleLoc,
2484                                             SourceLocation LParenLoc,
2485                                             Expr *SubExpr,
2486                                             SourceLocation RParenLoc) {
2487     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2488                                        TInfo, SubExpr,
2489                                        SourceRange(LAngleLoc, RAngleLoc),
2490                                        SourceRange(LParenLoc, RParenLoc));
2491   }
2492 
2493   /// \brief Build a new C++ dynamic_cast expression.
2494   ///
2495   /// By default, performs semantic analysis to build the new expression.
2496   /// Subclasses may override this routine to provide different behavior.
2497   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2498                                              SourceLocation LAngleLoc,
2499                                              TypeSourceInfo *TInfo,
2500                                              SourceLocation RAngleLoc,
2501                                              SourceLocation LParenLoc,
2502                                              Expr *SubExpr,
2503                                              SourceLocation RParenLoc) {
2504     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2505                                        TInfo, SubExpr,
2506                                        SourceRange(LAngleLoc, RAngleLoc),
2507                                        SourceRange(LParenLoc, RParenLoc));
2508   }
2509 
2510   /// \brief Build a new C++ reinterpret_cast expression.
2511   ///
2512   /// By default, performs semantic analysis to build the new expression.
2513   /// Subclasses may override this routine to provide different behavior.
2514   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2515                                                  SourceLocation LAngleLoc,
2516                                                  TypeSourceInfo *TInfo,
2517                                                  SourceLocation RAngleLoc,
2518                                                  SourceLocation LParenLoc,
2519                                                  Expr *SubExpr,
2520                                                  SourceLocation RParenLoc) {
2521     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2522                                        TInfo, SubExpr,
2523                                        SourceRange(LAngleLoc, RAngleLoc),
2524                                        SourceRange(LParenLoc, RParenLoc));
2525   }
2526 
2527   /// \brief Build a new C++ const_cast expression.
2528   ///
2529   /// By default, performs semantic analysis to build the new expression.
2530   /// Subclasses may override this routine to provide different behavior.
2531   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2532                                            SourceLocation LAngleLoc,
2533                                            TypeSourceInfo *TInfo,
2534                                            SourceLocation RAngleLoc,
2535                                            SourceLocation LParenLoc,
2536                                            Expr *SubExpr,
2537                                            SourceLocation RParenLoc) {
2538     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2539                                        TInfo, SubExpr,
2540                                        SourceRange(LAngleLoc, RAngleLoc),
2541                                        SourceRange(LParenLoc, RParenLoc));
2542   }
2543 
2544   /// \brief Build a new C++ functional-style cast expression.
2545   ///
2546   /// By default, performs semantic analysis to build the new expression.
2547   /// Subclasses may override this routine to provide different behavior.
2548   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2549                                           SourceLocation LParenLoc,
2550                                           Expr *Sub,
2551                                           SourceLocation RParenLoc) {
2552     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2553                                                MultiExprArg(&Sub, 1),
2554                                                RParenLoc);
2555   }
2556 
2557   /// \brief Build a new C++ typeid(type) expression.
2558   ///
2559   /// By default, performs semantic analysis to build the new expression.
2560   /// Subclasses may override this routine to provide different behavior.
2561   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2562                                         SourceLocation TypeidLoc,
2563                                         TypeSourceInfo *Operand,
2564                                         SourceLocation RParenLoc) {
2565     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2566                                     RParenLoc);
2567   }
2568 
2569 
2570   /// \brief Build a new C++ typeid(expr) expression.
2571   ///
2572   /// By default, performs semantic analysis to build the new expression.
2573   /// Subclasses may override this routine to provide different behavior.
2574   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2575                                         SourceLocation TypeidLoc,
2576                                         Expr *Operand,
2577                                         SourceLocation RParenLoc) {
2578     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2579                                     RParenLoc);
2580   }
2581 
2582   /// \brief Build a new C++ __uuidof(type) expression.
2583   ///
2584   /// By default, performs semantic analysis to build the new expression.
2585   /// Subclasses may override this routine to provide different behavior.
2586   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2587                                         SourceLocation TypeidLoc,
2588                                         TypeSourceInfo *Operand,
2589                                         SourceLocation RParenLoc) {
2590     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2591                                     RParenLoc);
2592   }
2593 
2594   /// \brief Build a new C++ __uuidof(expr) expression.
2595   ///
2596   /// By default, performs semantic analysis to build the new expression.
2597   /// Subclasses may override this routine to provide different behavior.
2598   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2599                                         SourceLocation TypeidLoc,
2600                                         Expr *Operand,
2601                                         SourceLocation RParenLoc) {
2602     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2603                                     RParenLoc);
2604   }
2605 
2606   /// \brief Build a new C++ "this" expression.
2607   ///
2608   /// By default, builds a new "this" expression without performing any
2609   /// semantic analysis. Subclasses may override this routine to provide
2610   /// different behavior.
2611   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2612                                 QualType ThisType,
2613                                 bool isImplicit) {
2614     getSema().CheckCXXThisCapture(ThisLoc);
2615     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2616   }
2617 
2618   /// \brief Build a new C++ throw expression.
2619   ///
2620   /// By default, performs semantic analysis to build the new expression.
2621   /// Subclasses may override this routine to provide different behavior.
2622   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2623                                  bool IsThrownVariableInScope) {
2624     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2625   }
2626 
2627   /// \brief Build a new C++ default-argument expression.
2628   ///
2629   /// By default, builds a new default-argument expression, which does not
2630   /// require any semantic analysis. Subclasses may override this routine to
2631   /// provide different behavior.
2632   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2633                                             ParmVarDecl *Param) {
2634     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2635   }
2636 
2637   /// \brief Build a new C++11 default-initialization expression.
2638   ///
2639   /// By default, builds a new default field initialization expression, which
2640   /// does not require any semantic analysis. Subclasses may override this
2641   /// routine to provide different behavior.
2642   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2643                                        FieldDecl *Field) {
2644     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2645   }
2646 
2647   /// \brief Build a new C++ zero-initialization expression.
2648   ///
2649   /// By default, performs semantic analysis to build the new expression.
2650   /// Subclasses may override this routine to provide different behavior.
2651   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2652                                            SourceLocation LParenLoc,
2653                                            SourceLocation RParenLoc) {
2654     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2655                                                None, RParenLoc);
2656   }
2657 
2658   /// \brief Build a new C++ "new" expression.
2659   ///
2660   /// By default, performs semantic analysis to build the new expression.
2661   /// Subclasses may override this routine to provide different behavior.
2662   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2663                                bool UseGlobal,
2664                                SourceLocation PlacementLParen,
2665                                MultiExprArg PlacementArgs,
2666                                SourceLocation PlacementRParen,
2667                                SourceRange TypeIdParens,
2668                                QualType AllocatedType,
2669                                TypeSourceInfo *AllocatedTypeInfo,
2670                                Expr *ArraySize,
2671                                SourceRange DirectInitRange,
2672                                Expr *Initializer) {
2673     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2674                                  PlacementLParen,
2675                                  PlacementArgs,
2676                                  PlacementRParen,
2677                                  TypeIdParens,
2678                                  AllocatedType,
2679                                  AllocatedTypeInfo,
2680                                  ArraySize,
2681                                  DirectInitRange,
2682                                  Initializer);
2683   }
2684 
2685   /// \brief Build a new C++ "delete" expression.
2686   ///
2687   /// By default, performs semantic analysis to build the new expression.
2688   /// Subclasses may override this routine to provide different behavior.
2689   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2690                                         bool IsGlobalDelete,
2691                                         bool IsArrayForm,
2692                                         Expr *Operand) {
2693     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2694                                     Operand);
2695   }
2696 
2697   /// \brief Build a new type trait expression.
2698   ///
2699   /// By default, performs semantic analysis to build the new expression.
2700   /// Subclasses may override this routine to provide different behavior.
2701   ExprResult RebuildTypeTrait(TypeTrait Trait,
2702                               SourceLocation StartLoc,
2703                               ArrayRef<TypeSourceInfo *> Args,
2704                               SourceLocation RParenLoc) {
2705     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2706   }
2707 
2708   /// \brief Build a new array type trait expression.
2709   ///
2710   /// By default, performs semantic analysis to build the new expression.
2711   /// Subclasses may override this routine to provide different behavior.
2712   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2713                                    SourceLocation StartLoc,
2714                                    TypeSourceInfo *TSInfo,
2715                                    Expr *DimExpr,
2716                                    SourceLocation RParenLoc) {
2717     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2718   }
2719 
2720   /// \brief Build a new expression trait expression.
2721   ///
2722   /// By default, performs semantic analysis to build the new expression.
2723   /// Subclasses may override this routine to provide different behavior.
2724   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2725                                    SourceLocation StartLoc,
2726                                    Expr *Queried,
2727                                    SourceLocation RParenLoc) {
2728     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2729   }
2730 
2731   /// \brief Build a new (previously unresolved) declaration reference
2732   /// expression.
2733   ///
2734   /// By default, performs semantic analysis to build the new expression.
2735   /// Subclasses may override this routine to provide different behavior.
2736   ExprResult RebuildDependentScopeDeclRefExpr(
2737                                           NestedNameSpecifierLoc QualifierLoc,
2738                                           SourceLocation TemplateKWLoc,
2739                                        const DeclarationNameInfo &NameInfo,
2740                               const TemplateArgumentListInfo *TemplateArgs,
2741                                           bool IsAddressOfOperand,
2742                                           TypeSourceInfo **RecoveryTSI) {
2743     CXXScopeSpec SS;
2744     SS.Adopt(QualifierLoc);
2745 
2746     if (TemplateArgs || TemplateKWLoc.isValid())
2747       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2748                                                     TemplateArgs);
2749 
2750     return getSema().BuildQualifiedDeclarationNameExpr(
2751         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2752   }
2753 
2754   /// \brief Build a new template-id expression.
2755   ///
2756   /// By default, performs semantic analysis to build the new expression.
2757   /// Subclasses may override this routine to provide different behavior.
2758   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2759                                    SourceLocation TemplateKWLoc,
2760                                    LookupResult &R,
2761                                    bool RequiresADL,
2762                               const TemplateArgumentListInfo *TemplateArgs) {
2763     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2764                                          TemplateArgs);
2765   }
2766 
2767   /// \brief Build a new object-construction expression.
2768   ///
2769   /// By default, performs semantic analysis to build the new expression.
2770   /// Subclasses may override this routine to provide different behavior.
2771   ExprResult RebuildCXXConstructExpr(QualType T,
2772                                      SourceLocation Loc,
2773                                      CXXConstructorDecl *Constructor,
2774                                      bool IsElidable,
2775                                      MultiExprArg Args,
2776                                      bool HadMultipleCandidates,
2777                                      bool ListInitialization,
2778                                      bool StdInitListInitialization,
2779                                      bool RequiresZeroInit,
2780                              CXXConstructExpr::ConstructionKind ConstructKind,
2781                                      SourceRange ParenRange) {
2782     SmallVector<Expr*, 8> ConvertedArgs;
2783     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2784                                           ConvertedArgs))
2785       return ExprError();
2786 
2787     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2788                                            IsElidable,
2789                                            ConvertedArgs,
2790                                            HadMultipleCandidates,
2791                                            ListInitialization,
2792                                            StdInitListInitialization,
2793                                            RequiresZeroInit, ConstructKind,
2794                                            ParenRange);
2795   }
2796 
2797   /// \brief Build a new implicit construction via inherited constructor
2798   /// expression.
2799   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2800                                              CXXConstructorDecl *Constructor,
2801                                              bool ConstructsVBase,
2802                                              bool InheritedFromVBase) {
2803     return new (getSema().Context) CXXInheritedCtorInitExpr(
2804         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2805   }
2806 
2807   /// \brief Build a new object-construction expression.
2808   ///
2809   /// By default, performs semantic analysis to build the new expression.
2810   /// Subclasses may override this routine to provide different behavior.
2811   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2812                                            SourceLocation LParenLoc,
2813                                            MultiExprArg Args,
2814                                            SourceLocation RParenLoc) {
2815     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2816                                                LParenLoc,
2817                                                Args,
2818                                                RParenLoc);
2819   }
2820 
2821   /// \brief Build a new object-construction expression.
2822   ///
2823   /// By default, performs semantic analysis to build the new expression.
2824   /// Subclasses may override this routine to provide different behavior.
2825   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2826                                                SourceLocation LParenLoc,
2827                                                MultiExprArg Args,
2828                                                SourceLocation RParenLoc) {
2829     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2830                                                LParenLoc,
2831                                                Args,
2832                                                RParenLoc);
2833   }
2834 
2835   /// \brief Build a new member reference expression.
2836   ///
2837   /// By default, performs semantic analysis to build the new expression.
2838   /// Subclasses may override this routine to provide different behavior.
2839   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2840                                                 QualType BaseType,
2841                                                 bool IsArrow,
2842                                                 SourceLocation OperatorLoc,
2843                                           NestedNameSpecifierLoc QualifierLoc,
2844                                                 SourceLocation TemplateKWLoc,
2845                                             NamedDecl *FirstQualifierInScope,
2846                                    const DeclarationNameInfo &MemberNameInfo,
2847                               const TemplateArgumentListInfo *TemplateArgs) {
2848     CXXScopeSpec SS;
2849     SS.Adopt(QualifierLoc);
2850 
2851     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2852                                             OperatorLoc, IsArrow,
2853                                             SS, TemplateKWLoc,
2854                                             FirstQualifierInScope,
2855                                             MemberNameInfo,
2856                                             TemplateArgs, /*S*/nullptr);
2857   }
2858 
2859   /// \brief Build a new member reference expression.
2860   ///
2861   /// By default, performs semantic analysis to build the new expression.
2862   /// Subclasses may override this routine to provide different behavior.
2863   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2864                                          SourceLocation OperatorLoc,
2865                                          bool IsArrow,
2866                                          NestedNameSpecifierLoc QualifierLoc,
2867                                          SourceLocation TemplateKWLoc,
2868                                          NamedDecl *FirstQualifierInScope,
2869                                          LookupResult &R,
2870                                 const TemplateArgumentListInfo *TemplateArgs) {
2871     CXXScopeSpec SS;
2872     SS.Adopt(QualifierLoc);
2873 
2874     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2875                                             OperatorLoc, IsArrow,
2876                                             SS, TemplateKWLoc,
2877                                             FirstQualifierInScope,
2878                                             R, TemplateArgs, /*S*/nullptr);
2879   }
2880 
2881   /// \brief Build a new noexcept expression.
2882   ///
2883   /// By default, performs semantic analysis to build the new expression.
2884   /// Subclasses may override this routine to provide different behavior.
2885   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2886     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2887   }
2888 
2889   /// \brief Build a new expression to compute the length of a parameter pack.
2890   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2891                                    NamedDecl *Pack,
2892                                    SourceLocation PackLoc,
2893                                    SourceLocation RParenLoc,
2894                                    Optional<unsigned> Length,
2895                                    ArrayRef<TemplateArgument> PartialArgs) {
2896     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2897                                   RParenLoc, Length, PartialArgs);
2898   }
2899 
2900   /// \brief Build a new Objective-C boxed expression.
2901   ///
2902   /// By default, performs semantic analysis to build the new expression.
2903   /// Subclasses may override this routine to provide different behavior.
2904   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2905     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2906   }
2907 
2908   /// \brief Build a new Objective-C array literal.
2909   ///
2910   /// By default, performs semantic analysis to build the new expression.
2911   /// Subclasses may override this routine to provide different behavior.
2912   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2913                                      Expr **Elements, unsigned NumElements) {
2914     return getSema().BuildObjCArrayLiteral(Range,
2915                                            MultiExprArg(Elements, NumElements));
2916   }
2917 
2918   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2919                                          Expr *Base, Expr *Key,
2920                                          ObjCMethodDecl *getterMethod,
2921                                          ObjCMethodDecl *setterMethod) {
2922     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2923                                                    getterMethod, setterMethod);
2924   }
2925 
2926   /// \brief Build a new Objective-C dictionary literal.
2927   ///
2928   /// By default, performs semantic analysis to build the new expression.
2929   /// Subclasses may override this routine to provide different behavior.
2930   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2931                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2932     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2933   }
2934 
2935   /// \brief Build a new Objective-C \@encode expression.
2936   ///
2937   /// By default, performs semantic analysis to build the new expression.
2938   /// Subclasses may override this routine to provide different behavior.
2939   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2940                                          TypeSourceInfo *EncodeTypeInfo,
2941                                          SourceLocation RParenLoc) {
2942     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2943   }
2944 
2945   /// \brief Build a new Objective-C class message.
2946   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2947                                           Selector Sel,
2948                                           ArrayRef<SourceLocation> SelectorLocs,
2949                                           ObjCMethodDecl *Method,
2950                                           SourceLocation LBracLoc,
2951                                           MultiExprArg Args,
2952                                           SourceLocation RBracLoc) {
2953     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2954                                      ReceiverTypeInfo->getType(),
2955                                      /*SuperLoc=*/SourceLocation(),
2956                                      Sel, Method, LBracLoc, SelectorLocs,
2957                                      RBracLoc, Args);
2958   }
2959 
2960   /// \brief Build a new Objective-C instance message.
2961   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2962                                           Selector Sel,
2963                                           ArrayRef<SourceLocation> SelectorLocs,
2964                                           ObjCMethodDecl *Method,
2965                                           SourceLocation LBracLoc,
2966                                           MultiExprArg Args,
2967                                           SourceLocation RBracLoc) {
2968     return SemaRef.BuildInstanceMessage(Receiver,
2969                                         Receiver->getType(),
2970                                         /*SuperLoc=*/SourceLocation(),
2971                                         Sel, Method, LBracLoc, SelectorLocs,
2972                                         RBracLoc, Args);
2973   }
2974 
2975   /// \brief Build a new Objective-C instance/class message to 'super'.
2976   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
2977                                     Selector Sel,
2978                                     ArrayRef<SourceLocation> SelectorLocs,
2979                                     QualType SuperType,
2980                                     ObjCMethodDecl *Method,
2981                                     SourceLocation LBracLoc,
2982                                     MultiExprArg Args,
2983                                     SourceLocation RBracLoc) {
2984     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
2985                                           SuperType,
2986                                           SuperLoc,
2987                                           Sel, Method, LBracLoc, SelectorLocs,
2988                                           RBracLoc, Args)
2989                                       : SemaRef.BuildClassMessage(nullptr,
2990                                           SuperType,
2991                                           SuperLoc,
2992                                           Sel, Method, LBracLoc, SelectorLocs,
2993                                           RBracLoc, Args);
2994 
2995 
2996   }
2997 
2998   /// \brief Build a new Objective-C ivar reference expression.
2999   ///
3000   /// By default, performs semantic analysis to build the new expression.
3001   /// Subclasses may override this routine to provide different behavior.
3002   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3003                                           SourceLocation IvarLoc,
3004                                           bool IsArrow, bool IsFreeIvar) {
3005     CXXScopeSpec SS;
3006     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3007     ExprResult Result = getSema().BuildMemberReferenceExpr(
3008         BaseArg, BaseArg->getType(),
3009         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3010         /*FirstQualifierInScope=*/nullptr, NameInfo,
3011         /*TemplateArgs=*/nullptr,
3012         /*S=*/nullptr);
3013     if (IsFreeIvar && Result.isUsable())
3014       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3015     return Result;
3016   }
3017 
3018   /// \brief Build a new Objective-C property reference expression.
3019   ///
3020   /// By default, performs semantic analysis to build the new expression.
3021   /// Subclasses may override this routine to provide different behavior.
3022   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3023                                         ObjCPropertyDecl *Property,
3024                                         SourceLocation PropertyLoc) {
3025     CXXScopeSpec SS;
3026     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3027     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3028                                               /*FIXME:*/PropertyLoc,
3029                                               /*IsArrow=*/false,
3030                                               SS, SourceLocation(),
3031                                               /*FirstQualifierInScope=*/nullptr,
3032                                               NameInfo,
3033                                               /*TemplateArgs=*/nullptr,
3034                                               /*S=*/nullptr);
3035   }
3036 
3037   /// \brief Build a new Objective-C property reference expression.
3038   ///
3039   /// By default, performs semantic analysis to build the new expression.
3040   /// Subclasses may override this routine to provide different behavior.
3041   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3042                                         ObjCMethodDecl *Getter,
3043                                         ObjCMethodDecl *Setter,
3044                                         SourceLocation PropertyLoc) {
3045     // Since these expressions can only be value-dependent, we do not
3046     // need to perform semantic analysis again.
3047     return Owned(
3048       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3049                                                   VK_LValue, OK_ObjCProperty,
3050                                                   PropertyLoc, Base));
3051   }
3052 
3053   /// \brief Build a new Objective-C "isa" expression.
3054   ///
3055   /// By default, performs semantic analysis to build the new expression.
3056   /// Subclasses may override this routine to provide different behavior.
3057   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3058                                 SourceLocation OpLoc, bool IsArrow) {
3059     CXXScopeSpec SS;
3060     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3061     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3062                                               OpLoc, IsArrow,
3063                                               SS, SourceLocation(),
3064                                               /*FirstQualifierInScope=*/nullptr,
3065                                               NameInfo,
3066                                               /*TemplateArgs=*/nullptr,
3067                                               /*S=*/nullptr);
3068   }
3069 
3070   /// \brief Build a new shuffle vector expression.
3071   ///
3072   /// By default, performs semantic analysis to build the new expression.
3073   /// Subclasses may override this routine to provide different behavior.
3074   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3075                                       MultiExprArg SubExprs,
3076                                       SourceLocation RParenLoc) {
3077     // Find the declaration for __builtin_shufflevector
3078     const IdentifierInfo &Name
3079       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3080     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3081     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3082     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3083 
3084     // Build a reference to the __builtin_shufflevector builtin
3085     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3086     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3087                                                   SemaRef.Context.BuiltinFnTy,
3088                                                   VK_RValue, BuiltinLoc);
3089     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3090     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3091                                        CK_BuiltinFnToFnPtr).get();
3092 
3093     // Build the CallExpr
3094     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3095         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3096         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3097 
3098     // Type-check the __builtin_shufflevector expression.
3099     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3100   }
3101 
3102   /// \brief Build a new convert vector expression.
3103   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3104                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3105                                       SourceLocation RParenLoc) {
3106     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3107                                          BuiltinLoc, RParenLoc);
3108   }
3109 
3110   /// \brief Build a new template argument pack expansion.
3111   ///
3112   /// By default, performs semantic analysis to build a new pack expansion
3113   /// for a template argument. Subclasses may override this routine to provide
3114   /// different behavior.
3115   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3116                                            SourceLocation EllipsisLoc,
3117                                            Optional<unsigned> NumExpansions) {
3118     switch (Pattern.getArgument().getKind()) {
3119     case TemplateArgument::Expression: {
3120       ExprResult Result
3121         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3122                                        EllipsisLoc, NumExpansions);
3123       if (Result.isInvalid())
3124         return TemplateArgumentLoc();
3125 
3126       return TemplateArgumentLoc(Result.get(), Result.get());
3127     }
3128 
3129     case TemplateArgument::Template:
3130       return TemplateArgumentLoc(TemplateArgument(
3131                                           Pattern.getArgument().getAsTemplate(),
3132                                                   NumExpansions),
3133                                  Pattern.getTemplateQualifierLoc(),
3134                                  Pattern.getTemplateNameLoc(),
3135                                  EllipsisLoc);
3136 
3137     case TemplateArgument::Null:
3138     case TemplateArgument::Integral:
3139     case TemplateArgument::Declaration:
3140     case TemplateArgument::Pack:
3141     case TemplateArgument::TemplateExpansion:
3142     case TemplateArgument::NullPtr:
3143       llvm_unreachable("Pack expansion pattern has no parameter packs");
3144 
3145     case TemplateArgument::Type:
3146       if (TypeSourceInfo *Expansion
3147             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3148                                            EllipsisLoc,
3149                                            NumExpansions))
3150         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3151                                    Expansion);
3152       break;
3153     }
3154 
3155     return TemplateArgumentLoc();
3156   }
3157 
3158   /// \brief Build a new expression pack expansion.
3159   ///
3160   /// By default, performs semantic analysis to build a new pack expansion
3161   /// for an expression. Subclasses may override this routine to provide
3162   /// different behavior.
3163   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3164                                   Optional<unsigned> NumExpansions) {
3165     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3166   }
3167 
3168   /// \brief Build a new C++1z fold-expression.
3169   ///
3170   /// By default, performs semantic analysis in order to build a new fold
3171   /// expression.
3172   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3173                                 BinaryOperatorKind Operator,
3174                                 SourceLocation EllipsisLoc, Expr *RHS,
3175                                 SourceLocation RParenLoc) {
3176     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3177                                       RHS, RParenLoc);
3178   }
3179 
3180   /// \brief Build an empty C++1z fold-expression with the given operator.
3181   ///
3182   /// By default, produces the fallback value for the fold-expression, or
3183   /// produce an error if there is no fallback value.
3184   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3185                                      BinaryOperatorKind Operator) {
3186     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3187   }
3188 
3189   /// \brief Build a new atomic operation expression.
3190   ///
3191   /// By default, performs semantic analysis to build the new expression.
3192   /// Subclasses may override this routine to provide different behavior.
3193   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3194                                MultiExprArg SubExprs,
3195                                QualType RetTy,
3196                                AtomicExpr::AtomicOp Op,
3197                                SourceLocation RParenLoc) {
3198     // Just create the expression; there is not any interesting semantic
3199     // analysis here because we can't actually build an AtomicExpr until
3200     // we are sure it is semantically sound.
3201     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3202                                             RParenLoc);
3203   }
3204 
3205 private:
3206   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3207                                      QualType ObjectType,
3208                                      NamedDecl *FirstQualifierInScope,
3209                                      CXXScopeSpec &SS);
3210 
3211   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3212                                              QualType ObjectType,
3213                                              NamedDecl *FirstQualifierInScope,
3214                                              CXXScopeSpec &SS);
3215 
3216   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3217                                             NamedDecl *FirstQualifierInScope,
3218                                             CXXScopeSpec &SS);
3219 
3220   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3221                                       DependentNameTypeLoc TL,
3222                                       bool DeducibleTSTContext);
3223 };
3224 
3225 template<typename Derived>
3226 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3227   if (!S)
3228     return S;
3229 
3230   switch (S->getStmtClass()) {
3231   case Stmt::NoStmtClass: break;
3232 
3233   // Transform individual statement nodes
3234 #define STMT(Node, Parent)                                              \
3235   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3236 #define ABSTRACT_STMT(Node)
3237 #define EXPR(Node, Parent)
3238 #include "clang/AST/StmtNodes.inc"
3239 
3240   // Transform expressions by calling TransformExpr.
3241 #define STMT(Node, Parent)
3242 #define ABSTRACT_STMT(Stmt)
3243 #define EXPR(Node, Parent) case Stmt::Node##Class:
3244 #include "clang/AST/StmtNodes.inc"
3245     {
3246       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3247       if (E.isInvalid())
3248         return StmtError();
3249 
3250       return getSema().ActOnExprStmt(E);
3251     }
3252   }
3253 
3254   return S;
3255 }
3256 
3257 template<typename Derived>
3258 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3259   if (!S)
3260     return S;
3261 
3262   switch (S->getClauseKind()) {
3263   default: break;
3264   // Transform individual clause nodes
3265 #define OPENMP_CLAUSE(Name, Class)                                             \
3266   case OMPC_ ## Name :                                                         \
3267     return getDerived().Transform ## Class(cast<Class>(S));
3268 #include "clang/Basic/OpenMPKinds.def"
3269   }
3270 
3271   return S;
3272 }
3273 
3274 
3275 template<typename Derived>
3276 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3277   if (!E)
3278     return E;
3279 
3280   switch (E->getStmtClass()) {
3281     case Stmt::NoStmtClass: break;
3282 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3283 #define ABSTRACT_STMT(Stmt)
3284 #define EXPR(Node, Parent)                                              \
3285     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3286 #include "clang/AST/StmtNodes.inc"
3287   }
3288 
3289   return E;
3290 }
3291 
3292 template<typename Derived>
3293 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3294                                                         bool NotCopyInit) {
3295   // Initializers are instantiated like expressions, except that various outer
3296   // layers are stripped.
3297   if (!Init)
3298     return Init;
3299 
3300   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3301     Init = ExprTemp->getSubExpr();
3302 
3303   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3304     Init = AIL->getCommonExpr();
3305 
3306   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3307     Init = MTE->GetTemporaryExpr();
3308 
3309   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3310     Init = Binder->getSubExpr();
3311 
3312   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3313     Init = ICE->getSubExprAsWritten();
3314 
3315   if (CXXStdInitializerListExpr *ILE =
3316           dyn_cast<CXXStdInitializerListExpr>(Init))
3317     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3318 
3319   // If this is copy-initialization, we only need to reconstruct
3320   // InitListExprs. Other forms of copy-initialization will be a no-op if
3321   // the initializer is already the right type.
3322   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3323   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3324     return getDerived().TransformExpr(Init);
3325 
3326   // Revert value-initialization back to empty parens.
3327   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3328     SourceRange Parens = VIE->getSourceRange();
3329     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3330                                              Parens.getEnd());
3331   }
3332 
3333   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3334   if (isa<ImplicitValueInitExpr>(Init))
3335     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3336                                              SourceLocation());
3337 
3338   // Revert initialization by constructor back to a parenthesized or braced list
3339   // of expressions. Any other form of initializer can just be reused directly.
3340   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3341     return getDerived().TransformExpr(Init);
3342 
3343   // If the initialization implicitly converted an initializer list to a
3344   // std::initializer_list object, unwrap the std::initializer_list too.
3345   if (Construct && Construct->isStdInitListInitialization())
3346     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3347 
3348   SmallVector<Expr*, 8> NewArgs;
3349   bool ArgChanged = false;
3350   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3351                                   /*IsCall*/true, NewArgs, &ArgChanged))
3352     return ExprError();
3353 
3354   // If this was list initialization, revert to list form.
3355   if (Construct->isListInitialization())
3356     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3357                                         Construct->getLocEnd(),
3358                                         Construct->getType());
3359 
3360   // Build a ParenListExpr to represent anything else.
3361   SourceRange Parens = Construct->getParenOrBraceRange();
3362   if (Parens.isInvalid()) {
3363     // This was a variable declaration's initialization for which no initializer
3364     // was specified.
3365     assert(NewArgs.empty() &&
3366            "no parens or braces but have direct init with arguments?");
3367     return ExprEmpty();
3368   }
3369   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3370                                            Parens.getEnd());
3371 }
3372 
3373 template<typename Derived>
3374 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3375                                             unsigned NumInputs,
3376                                             bool IsCall,
3377                                       SmallVectorImpl<Expr *> &Outputs,
3378                                             bool *ArgChanged) {
3379   for (unsigned I = 0; I != NumInputs; ++I) {
3380     // If requested, drop call arguments that need to be dropped.
3381     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3382       if (ArgChanged)
3383         *ArgChanged = true;
3384 
3385       break;
3386     }
3387 
3388     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3389       Expr *Pattern = Expansion->getPattern();
3390 
3391       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3392       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3393       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3394 
3395       // Determine whether the set of unexpanded parameter packs can and should
3396       // be expanded.
3397       bool Expand = true;
3398       bool RetainExpansion = false;
3399       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3400       Optional<unsigned> NumExpansions = OrigNumExpansions;
3401       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3402                                                Pattern->getSourceRange(),
3403                                                Unexpanded,
3404                                                Expand, RetainExpansion,
3405                                                NumExpansions))
3406         return true;
3407 
3408       if (!Expand) {
3409         // The transform has determined that we should perform a simple
3410         // transformation on the pack expansion, producing another pack
3411         // expansion.
3412         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3413         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3414         if (OutPattern.isInvalid())
3415           return true;
3416 
3417         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3418                                                 Expansion->getEllipsisLoc(),
3419                                                            NumExpansions);
3420         if (Out.isInvalid())
3421           return true;
3422 
3423         if (ArgChanged)
3424           *ArgChanged = true;
3425         Outputs.push_back(Out.get());
3426         continue;
3427       }
3428 
3429       // Record right away that the argument was changed.  This needs
3430       // to happen even if the array expands to nothing.
3431       if (ArgChanged) *ArgChanged = true;
3432 
3433       // The transform has determined that we should perform an elementwise
3434       // expansion of the pattern. Do so.
3435       for (unsigned I = 0; I != *NumExpansions; ++I) {
3436         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3437         ExprResult Out = getDerived().TransformExpr(Pattern);
3438         if (Out.isInvalid())
3439           return true;
3440 
3441         if (Out.get()->containsUnexpandedParameterPack()) {
3442           Out = getDerived().RebuildPackExpansion(
3443               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3444           if (Out.isInvalid())
3445             return true;
3446         }
3447 
3448         Outputs.push_back(Out.get());
3449       }
3450 
3451       // If we're supposed to retain a pack expansion, do so by temporarily
3452       // forgetting the partially-substituted parameter pack.
3453       if (RetainExpansion) {
3454         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3455 
3456         ExprResult Out = getDerived().TransformExpr(Pattern);
3457         if (Out.isInvalid())
3458           return true;
3459 
3460         Out = getDerived().RebuildPackExpansion(
3461             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3462         if (Out.isInvalid())
3463           return true;
3464 
3465         Outputs.push_back(Out.get());
3466       }
3467 
3468       continue;
3469     }
3470 
3471     ExprResult Result =
3472       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3473              : getDerived().TransformExpr(Inputs[I]);
3474     if (Result.isInvalid())
3475       return true;
3476 
3477     if (Result.get() != Inputs[I] && ArgChanged)
3478       *ArgChanged = true;
3479 
3480     Outputs.push_back(Result.get());
3481   }
3482 
3483   return false;
3484 }
3485 
3486 template <typename Derived>
3487 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3488     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3489   if (Var) {
3490     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3491         getDerived().TransformDefinition(Var->getLocation(), Var));
3492 
3493     if (!ConditionVar)
3494       return Sema::ConditionError();
3495 
3496     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3497   }
3498 
3499   if (Expr) {
3500     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3501 
3502     if (CondExpr.isInvalid())
3503       return Sema::ConditionError();
3504 
3505     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3506   }
3507 
3508   return Sema::ConditionResult();
3509 }
3510 
3511 template<typename Derived>
3512 NestedNameSpecifierLoc
3513 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3514                                                     NestedNameSpecifierLoc NNS,
3515                                                      QualType ObjectType,
3516                                              NamedDecl *FirstQualifierInScope) {
3517   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3518   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3519        Qualifier = Qualifier.getPrefix())
3520     Qualifiers.push_back(Qualifier);
3521 
3522   CXXScopeSpec SS;
3523   while (!Qualifiers.empty()) {
3524     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3525     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3526 
3527     switch (QNNS->getKind()) {
3528     case NestedNameSpecifier::Identifier: {
3529       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3530                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3531       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3532                                               SS, FirstQualifierInScope, false))
3533         return NestedNameSpecifierLoc();
3534     }
3535       break;
3536 
3537     case NestedNameSpecifier::Namespace: {
3538       NamespaceDecl *NS
3539         = cast_or_null<NamespaceDecl>(
3540                                     getDerived().TransformDecl(
3541                                                           Q.getLocalBeginLoc(),
3542                                                        QNNS->getAsNamespace()));
3543       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3544       break;
3545     }
3546 
3547     case NestedNameSpecifier::NamespaceAlias: {
3548       NamespaceAliasDecl *Alias
3549         = cast_or_null<NamespaceAliasDecl>(
3550                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3551                                                  QNNS->getAsNamespaceAlias()));
3552       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3553                 Q.getLocalEndLoc());
3554       break;
3555     }
3556 
3557     case NestedNameSpecifier::Global:
3558       // There is no meaningful transformation that one could perform on the
3559       // global scope.
3560       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3561       break;
3562 
3563     case NestedNameSpecifier::Super: {
3564       CXXRecordDecl *RD =
3565           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3566               SourceLocation(), QNNS->getAsRecordDecl()));
3567       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3568       break;
3569     }
3570 
3571     case NestedNameSpecifier::TypeSpecWithTemplate:
3572     case NestedNameSpecifier::TypeSpec: {
3573       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3574                                               FirstQualifierInScope, SS);
3575 
3576       if (!TL)
3577         return NestedNameSpecifierLoc();
3578 
3579       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3580           (SemaRef.getLangOpts().CPlusPlus11 &&
3581            TL.getType()->isEnumeralType())) {
3582         assert(!TL.getType().hasLocalQualifiers() &&
3583                "Can't get cv-qualifiers here");
3584         if (TL.getType()->isEnumeralType())
3585           SemaRef.Diag(TL.getBeginLoc(),
3586                        diag::warn_cxx98_compat_enum_nested_name_spec);
3587         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3588                   Q.getLocalEndLoc());
3589         break;
3590       }
3591       // If the nested-name-specifier is an invalid type def, don't emit an
3592       // error because a previous error should have already been emitted.
3593       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3594       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3595         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3596           << TL.getType() << SS.getRange();
3597       }
3598       return NestedNameSpecifierLoc();
3599     }
3600     }
3601 
3602     // The qualifier-in-scope and object type only apply to the leftmost entity.
3603     FirstQualifierInScope = nullptr;
3604     ObjectType = QualType();
3605   }
3606 
3607   // Don't rebuild the nested-name-specifier if we don't have to.
3608   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3609       !getDerived().AlwaysRebuild())
3610     return NNS;
3611 
3612   // If we can re-use the source-location data from the original
3613   // nested-name-specifier, do so.
3614   if (SS.location_size() == NNS.getDataLength() &&
3615       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3616     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3617 
3618   // Allocate new nested-name-specifier location information.
3619   return SS.getWithLocInContext(SemaRef.Context);
3620 }
3621 
3622 template<typename Derived>
3623 DeclarationNameInfo
3624 TreeTransform<Derived>
3625 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3626   DeclarationName Name = NameInfo.getName();
3627   if (!Name)
3628     return DeclarationNameInfo();
3629 
3630   switch (Name.getNameKind()) {
3631   case DeclarationName::Identifier:
3632   case DeclarationName::ObjCZeroArgSelector:
3633   case DeclarationName::ObjCOneArgSelector:
3634   case DeclarationName::ObjCMultiArgSelector:
3635   case DeclarationName::CXXOperatorName:
3636   case DeclarationName::CXXLiteralOperatorName:
3637   case DeclarationName::CXXUsingDirective:
3638     return NameInfo;
3639 
3640   case DeclarationName::CXXDeductionGuideName: {
3641     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3642     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3643         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3644     if (!NewTemplate)
3645       return DeclarationNameInfo();
3646 
3647     DeclarationNameInfo NewNameInfo(NameInfo);
3648     NewNameInfo.setName(
3649         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3650     return NewNameInfo;
3651   }
3652 
3653   case DeclarationName::CXXConstructorName:
3654   case DeclarationName::CXXDestructorName:
3655   case DeclarationName::CXXConversionFunctionName: {
3656     TypeSourceInfo *NewTInfo;
3657     CanQualType NewCanTy;
3658     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3659       NewTInfo = getDerived().TransformType(OldTInfo);
3660       if (!NewTInfo)
3661         return DeclarationNameInfo();
3662       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3663     }
3664     else {
3665       NewTInfo = nullptr;
3666       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3667       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3668       if (NewT.isNull())
3669         return DeclarationNameInfo();
3670       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3671     }
3672 
3673     DeclarationName NewName
3674       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3675                                                            NewCanTy);
3676     DeclarationNameInfo NewNameInfo(NameInfo);
3677     NewNameInfo.setName(NewName);
3678     NewNameInfo.setNamedTypeInfo(NewTInfo);
3679     return NewNameInfo;
3680   }
3681   }
3682 
3683   llvm_unreachable("Unknown name kind.");
3684 }
3685 
3686 template<typename Derived>
3687 TemplateName
3688 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3689                                               TemplateName Name,
3690                                               SourceLocation NameLoc,
3691                                               QualType ObjectType,
3692                                               NamedDecl *FirstQualifierInScope,
3693                                               bool AllowInjectedClassName) {
3694   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3695     TemplateDecl *Template = QTN->getTemplateDecl();
3696     assert(Template && "qualified template name must refer to a template");
3697 
3698     TemplateDecl *TransTemplate
3699       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3700                                                               Template));
3701     if (!TransTemplate)
3702       return TemplateName();
3703 
3704     if (!getDerived().AlwaysRebuild() &&
3705         SS.getScopeRep() == QTN->getQualifier() &&
3706         TransTemplate == Template)
3707       return Name;
3708 
3709     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3710                                             TransTemplate);
3711   }
3712 
3713   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3714     if (SS.getScopeRep()) {
3715       // These apply to the scope specifier, not the template.
3716       ObjectType = QualType();
3717       FirstQualifierInScope = nullptr;
3718     }
3719 
3720     if (!getDerived().AlwaysRebuild() &&
3721         SS.getScopeRep() == DTN->getQualifier() &&
3722         ObjectType.isNull())
3723       return Name;
3724 
3725     if (DTN->isIdentifier()) {
3726       return getDerived().RebuildTemplateName(SS,
3727                                               *DTN->getIdentifier(),
3728                                               NameLoc,
3729                                               ObjectType,
3730                                               FirstQualifierInScope,
3731                                               AllowInjectedClassName);
3732     }
3733 
3734     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3735                                             ObjectType, AllowInjectedClassName);
3736   }
3737 
3738   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3739     TemplateDecl *TransTemplate
3740       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3741                                                               Template));
3742     if (!TransTemplate)
3743       return TemplateName();
3744 
3745     if (!getDerived().AlwaysRebuild() &&
3746         TransTemplate == Template)
3747       return Name;
3748 
3749     return TemplateName(TransTemplate);
3750   }
3751 
3752   if (SubstTemplateTemplateParmPackStorage *SubstPack
3753       = Name.getAsSubstTemplateTemplateParmPack()) {
3754     TemplateTemplateParmDecl *TransParam
3755     = cast_or_null<TemplateTemplateParmDecl>(
3756             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3757     if (!TransParam)
3758       return TemplateName();
3759 
3760     if (!getDerived().AlwaysRebuild() &&
3761         TransParam == SubstPack->getParameterPack())
3762       return Name;
3763 
3764     return getDerived().RebuildTemplateName(TransParam,
3765                                             SubstPack->getArgumentPack());
3766   }
3767 
3768   // These should be getting filtered out before they reach the AST.
3769   llvm_unreachable("overloaded function decl survived to here");
3770 }
3771 
3772 template<typename Derived>
3773 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3774                                          const TemplateArgument &Arg,
3775                                          TemplateArgumentLoc &Output) {
3776   SourceLocation Loc = getDerived().getBaseLocation();
3777   switch (Arg.getKind()) {
3778   case TemplateArgument::Null:
3779     llvm_unreachable("null template argument in TreeTransform");
3780     break;
3781 
3782   case TemplateArgument::Type:
3783     Output = TemplateArgumentLoc(Arg,
3784                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3785 
3786     break;
3787 
3788   case TemplateArgument::Template:
3789   case TemplateArgument::TemplateExpansion: {
3790     NestedNameSpecifierLocBuilder Builder;
3791     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3792     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3793       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3794     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3795       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3796 
3797     if (Arg.getKind() == TemplateArgument::Template)
3798       Output = TemplateArgumentLoc(Arg,
3799                                    Builder.getWithLocInContext(SemaRef.Context),
3800                                    Loc);
3801     else
3802       Output = TemplateArgumentLoc(Arg,
3803                                    Builder.getWithLocInContext(SemaRef.Context),
3804                                    Loc, Loc);
3805 
3806     break;
3807   }
3808 
3809   case TemplateArgument::Expression:
3810     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3811     break;
3812 
3813   case TemplateArgument::Declaration:
3814   case TemplateArgument::Integral:
3815   case TemplateArgument::Pack:
3816   case TemplateArgument::NullPtr:
3817     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3818     break;
3819   }
3820 }
3821 
3822 template<typename Derived>
3823 bool TreeTransform<Derived>::TransformTemplateArgument(
3824                                          const TemplateArgumentLoc &Input,
3825                                          TemplateArgumentLoc &Output, bool Uneval) {
3826   const TemplateArgument &Arg = Input.getArgument();
3827   switch (Arg.getKind()) {
3828   case TemplateArgument::Null:
3829   case TemplateArgument::Integral:
3830   case TemplateArgument::Pack:
3831   case TemplateArgument::Declaration:
3832   case TemplateArgument::NullPtr:
3833     llvm_unreachable("Unexpected TemplateArgument");
3834 
3835   case TemplateArgument::Type: {
3836     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3837     if (!DI)
3838       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3839 
3840     DI = getDerived().TransformType(DI);
3841     if (!DI) return true;
3842 
3843     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3844     return false;
3845   }
3846 
3847   case TemplateArgument::Template: {
3848     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3849     if (QualifierLoc) {
3850       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3851       if (!QualifierLoc)
3852         return true;
3853     }
3854 
3855     CXXScopeSpec SS;
3856     SS.Adopt(QualifierLoc);
3857     TemplateName Template
3858       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3859                                            Input.getTemplateNameLoc());
3860     if (Template.isNull())
3861       return true;
3862 
3863     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3864                                  Input.getTemplateNameLoc());
3865     return false;
3866   }
3867 
3868   case TemplateArgument::TemplateExpansion:
3869     llvm_unreachable("Caller should expand pack expansions");
3870 
3871   case TemplateArgument::Expression: {
3872     // Template argument expressions are constant expressions.
3873     EnterExpressionEvaluationContext Unevaluated(
3874         getSema(), Uneval
3875                        ? Sema::ExpressionEvaluationContext::Unevaluated
3876                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
3877 
3878     Expr *InputExpr = Input.getSourceExpression();
3879     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3880 
3881     ExprResult E = getDerived().TransformExpr(InputExpr);
3882     E = SemaRef.ActOnConstantExpression(E);
3883     if (E.isInvalid()) return true;
3884     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3885     return false;
3886   }
3887   }
3888 
3889   // Work around bogus GCC warning
3890   return true;
3891 }
3892 
3893 /// \brief Iterator adaptor that invents template argument location information
3894 /// for each of the template arguments in its underlying iterator.
3895 template<typename Derived, typename InputIterator>
3896 class TemplateArgumentLocInventIterator {
3897   TreeTransform<Derived> &Self;
3898   InputIterator Iter;
3899 
3900 public:
3901   typedef TemplateArgumentLoc value_type;
3902   typedef TemplateArgumentLoc reference;
3903   typedef typename std::iterator_traits<InputIterator>::difference_type
3904     difference_type;
3905   typedef std::input_iterator_tag iterator_category;
3906 
3907   class pointer {
3908     TemplateArgumentLoc Arg;
3909 
3910   public:
3911     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3912 
3913     const TemplateArgumentLoc *operator->() const { return &Arg; }
3914   };
3915 
3916   TemplateArgumentLocInventIterator() { }
3917 
3918   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3919                                              InputIterator Iter)
3920     : Self(Self), Iter(Iter) { }
3921 
3922   TemplateArgumentLocInventIterator &operator++() {
3923     ++Iter;
3924     return *this;
3925   }
3926 
3927   TemplateArgumentLocInventIterator operator++(int) {
3928     TemplateArgumentLocInventIterator Old(*this);
3929     ++(*this);
3930     return Old;
3931   }
3932 
3933   reference operator*() const {
3934     TemplateArgumentLoc Result;
3935     Self.InventTemplateArgumentLoc(*Iter, Result);
3936     return Result;
3937   }
3938 
3939   pointer operator->() const { return pointer(**this); }
3940 
3941   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3942                          const TemplateArgumentLocInventIterator &Y) {
3943     return X.Iter == Y.Iter;
3944   }
3945 
3946   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3947                          const TemplateArgumentLocInventIterator &Y) {
3948     return X.Iter != Y.Iter;
3949   }
3950 };
3951 
3952 template<typename Derived>
3953 template<typename InputIterator>
3954 bool TreeTransform<Derived>::TransformTemplateArguments(
3955     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
3956     bool Uneval) {
3957   for (; First != Last; ++First) {
3958     TemplateArgumentLoc Out;
3959     TemplateArgumentLoc In = *First;
3960 
3961     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3962       // Unpack argument packs, which we translate them into separate
3963       // arguments.
3964       // FIXME: We could do much better if we could guarantee that the
3965       // TemplateArgumentLocInfo for the pack expansion would be usable for
3966       // all of the template arguments in the argument pack.
3967       typedef TemplateArgumentLocInventIterator<Derived,
3968                                                 TemplateArgument::pack_iterator>
3969         PackLocIterator;
3970       if (TransformTemplateArguments(PackLocIterator(*this,
3971                                                  In.getArgument().pack_begin()),
3972                                      PackLocIterator(*this,
3973                                                    In.getArgument().pack_end()),
3974                                      Outputs, Uneval))
3975         return true;
3976 
3977       continue;
3978     }
3979 
3980     if (In.getArgument().isPackExpansion()) {
3981       // We have a pack expansion, for which we will be substituting into
3982       // the pattern.
3983       SourceLocation Ellipsis;
3984       Optional<unsigned> OrigNumExpansions;
3985       TemplateArgumentLoc Pattern
3986         = getSema().getTemplateArgumentPackExpansionPattern(
3987               In, Ellipsis, OrigNumExpansions);
3988 
3989       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3990       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3991       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3992 
3993       // Determine whether the set of unexpanded parameter packs can and should
3994       // be expanded.
3995       bool Expand = true;
3996       bool RetainExpansion = false;
3997       Optional<unsigned> NumExpansions = OrigNumExpansions;
3998       if (getDerived().TryExpandParameterPacks(Ellipsis,
3999                                                Pattern.getSourceRange(),
4000                                                Unexpanded,
4001                                                Expand,
4002                                                RetainExpansion,
4003                                                NumExpansions))
4004         return true;
4005 
4006       if (!Expand) {
4007         // The transform has determined that we should perform a simple
4008         // transformation on the pack expansion, producing another pack
4009         // expansion.
4010         TemplateArgumentLoc OutPattern;
4011         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4012         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4013           return true;
4014 
4015         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4016                                                 NumExpansions);
4017         if (Out.getArgument().isNull())
4018           return true;
4019 
4020         Outputs.addArgument(Out);
4021         continue;
4022       }
4023 
4024       // The transform has determined that we should perform an elementwise
4025       // expansion of the pattern. Do so.
4026       for (unsigned I = 0; I != *NumExpansions; ++I) {
4027         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4028 
4029         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4030           return true;
4031 
4032         if (Out.getArgument().containsUnexpandedParameterPack()) {
4033           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4034                                                   OrigNumExpansions);
4035           if (Out.getArgument().isNull())
4036             return true;
4037         }
4038 
4039         Outputs.addArgument(Out);
4040       }
4041 
4042       // If we're supposed to retain a pack expansion, do so by temporarily
4043       // forgetting the partially-substituted parameter pack.
4044       if (RetainExpansion) {
4045         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4046 
4047         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4048           return true;
4049 
4050         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4051                                                 OrigNumExpansions);
4052         if (Out.getArgument().isNull())
4053           return true;
4054 
4055         Outputs.addArgument(Out);
4056       }
4057 
4058       continue;
4059     }
4060 
4061     // The simple case:
4062     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4063       return true;
4064 
4065     Outputs.addArgument(Out);
4066   }
4067 
4068   return false;
4069 
4070 }
4071 
4072 //===----------------------------------------------------------------------===//
4073 // Type transformation
4074 //===----------------------------------------------------------------------===//
4075 
4076 template<typename Derived>
4077 QualType TreeTransform<Derived>::TransformType(QualType T) {
4078   if (getDerived().AlreadyTransformed(T))
4079     return T;
4080 
4081   // Temporary workaround.  All of these transformations should
4082   // eventually turn into transformations on TypeLocs.
4083   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4084                                                 getDerived().getBaseLocation());
4085 
4086   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4087 
4088   if (!NewDI)
4089     return QualType();
4090 
4091   return NewDI->getType();
4092 }
4093 
4094 template<typename Derived>
4095 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4096   // Refine the base location to the type's location.
4097   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4098                        getDerived().getBaseEntity());
4099   if (getDerived().AlreadyTransformed(DI->getType()))
4100     return DI;
4101 
4102   TypeLocBuilder TLB;
4103 
4104   TypeLoc TL = DI->getTypeLoc();
4105   TLB.reserve(TL.getFullDataSize());
4106 
4107   QualType Result = getDerived().TransformType(TLB, TL);
4108   if (Result.isNull())
4109     return nullptr;
4110 
4111   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4112 }
4113 
4114 template<typename Derived>
4115 QualType
4116 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4117   switch (T.getTypeLocClass()) {
4118 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4119 #define TYPELOC(CLASS, PARENT)                                                 \
4120   case TypeLoc::CLASS:                                                         \
4121     return getDerived().Transform##CLASS##Type(TLB,                            \
4122                                                T.castAs<CLASS##TypeLoc>());
4123 #include "clang/AST/TypeLocNodes.def"
4124   }
4125 
4126   llvm_unreachable("unhandled type loc!");
4127 }
4128 
4129 template<typename Derived>
4130 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4131   if (!isa<DependentNameType>(T))
4132     return TransformType(T);
4133 
4134   if (getDerived().AlreadyTransformed(T))
4135     return T;
4136   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4137                                                 getDerived().getBaseLocation());
4138   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4139   return NewDI ? NewDI->getType() : QualType();
4140 }
4141 
4142 template<typename Derived>
4143 TypeSourceInfo *
4144 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4145   if (!isa<DependentNameType>(DI->getType()))
4146     return TransformType(DI);
4147 
4148   // Refine the base location to the type's location.
4149   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4150                        getDerived().getBaseEntity());
4151   if (getDerived().AlreadyTransformed(DI->getType()))
4152     return DI;
4153 
4154   TypeLocBuilder TLB;
4155 
4156   TypeLoc TL = DI->getTypeLoc();
4157   TLB.reserve(TL.getFullDataSize());
4158 
4159   Qualifiers Quals;
4160   auto QTL = TL.getAs<QualifiedTypeLoc>();
4161   if (QTL)
4162     TL = QTL.getUnqualifiedLoc();
4163 
4164   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4165 
4166   QualType Result = getDerived().TransformDependentNameType(
4167       TLB, DNTL, /*DeducedTSTContext*/true);
4168   if (Result.isNull())
4169     return nullptr;
4170 
4171   if (QTL) {
4172     Result = getDerived().RebuildQualifiedType(
4173         Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers());
4174     TLB.TypeWasModifiedSafely(Result);
4175   }
4176 
4177   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4178 }
4179 
4180 template<typename Derived>
4181 QualType
4182 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4183                                                QualifiedTypeLoc T) {
4184   Qualifiers Quals = T.getType().getLocalQualifiers();
4185 
4186   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4187   if (Result.isNull())
4188     return QualType();
4189 
4190   Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals);
4191 
4192   // RebuildQualifiedType might have updated the type, but not in a way
4193   // that invalidates the TypeLoc. (There's no location information for
4194   // qualifiers.)
4195   TLB.TypeWasModifiedSafely(Result);
4196 
4197   return Result;
4198 }
4199 
4200 template<typename Derived>
4201 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4202                                                       SourceLocation Loc,
4203                                                       Qualifiers Quals) {
4204   // C++ [dcl.fct]p7:
4205   //   [When] adding cv-qualifications on top of the function type [...] the
4206   //   cv-qualifiers are ignored.
4207   // C++ [dcl.ref]p1:
4208   //   when the cv-qualifiers are introduced through the use of a typedef-name
4209   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4210   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4211   // applied to a reference type.
4212   // FIXME: This removes all qualifiers, not just cv-qualifiers!
4213   if (T->isFunctionType() || T->isReferenceType())
4214     return T;
4215 
4216   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4217   // resulting type.
4218   if (Quals.hasObjCLifetime()) {
4219     if (!T->isObjCLifetimeType() && !T->isDependentType())
4220       Quals.removeObjCLifetime();
4221     else if (T.getObjCLifetime()) {
4222       // Objective-C ARC:
4223       //   A lifetime qualifier applied to a substituted template parameter
4224       //   overrides the lifetime qualifier from the template argument.
4225       const AutoType *AutoTy;
4226       if (const SubstTemplateTypeParmType *SubstTypeParam
4227                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4228         QualType Replacement = SubstTypeParam->getReplacementType();
4229         Qualifiers Qs = Replacement.getQualifiers();
4230         Qs.removeObjCLifetime();
4231         Replacement = SemaRef.Context.getQualifiedType(
4232             Replacement.getUnqualifiedType(), Qs);
4233         T = SemaRef.Context.getSubstTemplateTypeParmType(
4234             SubstTypeParam->getReplacedParameter(), Replacement);
4235       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4236         // 'auto' types behave the same way as template parameters.
4237         QualType Deduced = AutoTy->getDeducedType();
4238         Qualifiers Qs = Deduced.getQualifiers();
4239         Qs.removeObjCLifetime();
4240         Deduced =
4241             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4242         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4243                                         AutoTy->isDependentType());
4244       } else {
4245         // Otherwise, complain about the addition of a qualifier to an
4246         // already-qualified type.
4247         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4248         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4249         Quals.removeObjCLifetime();
4250       }
4251     }
4252   }
4253 
4254   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4255 }
4256 
4257 template<typename Derived>
4258 TypeLoc
4259 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4260                                                    QualType ObjectType,
4261                                                    NamedDecl *UnqualLookup,
4262                                                    CXXScopeSpec &SS) {
4263   if (getDerived().AlreadyTransformed(TL.getType()))
4264     return TL;
4265 
4266   TypeSourceInfo *TSI =
4267       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4268   if (TSI)
4269     return TSI->getTypeLoc();
4270   return TypeLoc();
4271 }
4272 
4273 template<typename Derived>
4274 TypeSourceInfo *
4275 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4276                                                    QualType ObjectType,
4277                                                    NamedDecl *UnqualLookup,
4278                                                    CXXScopeSpec &SS) {
4279   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4280     return TSInfo;
4281 
4282   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4283                                    UnqualLookup, SS);
4284 }
4285 
4286 template <typename Derived>
4287 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4288     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4289     CXXScopeSpec &SS) {
4290   QualType T = TL.getType();
4291   assert(!getDerived().AlreadyTransformed(T));
4292 
4293   TypeLocBuilder TLB;
4294   QualType Result;
4295 
4296   if (isa<TemplateSpecializationType>(T)) {
4297     TemplateSpecializationTypeLoc SpecTL =
4298         TL.castAs<TemplateSpecializationTypeLoc>();
4299 
4300     TemplateName Template = getDerived().TransformTemplateName(
4301         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4302         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4303     if (Template.isNull())
4304       return nullptr;
4305 
4306     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4307                                                               Template);
4308   } else if (isa<DependentTemplateSpecializationType>(T)) {
4309     DependentTemplateSpecializationTypeLoc SpecTL =
4310         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4311 
4312     TemplateName Template
4313       = getDerived().RebuildTemplateName(SS,
4314                                          *SpecTL.getTypePtr()->getIdentifier(),
4315                                          SpecTL.getTemplateNameLoc(),
4316                                          ObjectType, UnqualLookup,
4317                                          /*AllowInjectedClassName*/true);
4318     if (Template.isNull())
4319       return nullptr;
4320 
4321     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4322                                                                        SpecTL,
4323                                                                        Template,
4324                                                                        SS);
4325   } else {
4326     // Nothing special needs to be done for these.
4327     Result = getDerived().TransformType(TLB, TL);
4328   }
4329 
4330   if (Result.isNull())
4331     return nullptr;
4332 
4333   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4334 }
4335 
4336 template <class TyLoc> static inline
4337 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4338   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4339   NewT.setNameLoc(T.getNameLoc());
4340   return T.getType();
4341 }
4342 
4343 template<typename Derived>
4344 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4345                                                       BuiltinTypeLoc T) {
4346   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4347   NewT.setBuiltinLoc(T.getBuiltinLoc());
4348   if (T.needsExtraLocalData())
4349     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4350   return T.getType();
4351 }
4352 
4353 template<typename Derived>
4354 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4355                                                       ComplexTypeLoc T) {
4356   // FIXME: recurse?
4357   return TransformTypeSpecType(TLB, T);
4358 }
4359 
4360 template <typename Derived>
4361 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4362                                                        AdjustedTypeLoc TL) {
4363   // Adjustments applied during transformation are handled elsewhere.
4364   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4365 }
4366 
4367 template<typename Derived>
4368 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4369                                                       DecayedTypeLoc TL) {
4370   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4371   if (OriginalType.isNull())
4372     return QualType();
4373 
4374   QualType Result = TL.getType();
4375   if (getDerived().AlwaysRebuild() ||
4376       OriginalType != TL.getOriginalLoc().getType())
4377     Result = SemaRef.Context.getDecayedType(OriginalType);
4378   TLB.push<DecayedTypeLoc>(Result);
4379   // Nothing to set for DecayedTypeLoc.
4380   return Result;
4381 }
4382 
4383 template<typename Derived>
4384 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4385                                                       PointerTypeLoc TL) {
4386   QualType PointeeType
4387     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4388   if (PointeeType.isNull())
4389     return QualType();
4390 
4391   QualType Result = TL.getType();
4392   if (PointeeType->getAs<ObjCObjectType>()) {
4393     // A dependent pointer type 'T *' has is being transformed such
4394     // that an Objective-C class type is being replaced for 'T'. The
4395     // resulting pointer type is an ObjCObjectPointerType, not a
4396     // PointerType.
4397     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4398 
4399     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4400     NewT.setStarLoc(TL.getStarLoc());
4401     return Result;
4402   }
4403 
4404   if (getDerived().AlwaysRebuild() ||
4405       PointeeType != TL.getPointeeLoc().getType()) {
4406     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4407     if (Result.isNull())
4408       return QualType();
4409   }
4410 
4411   // Objective-C ARC can add lifetime qualifiers to the type that we're
4412   // pointing to.
4413   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4414 
4415   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4416   NewT.setSigilLoc(TL.getSigilLoc());
4417   return Result;
4418 }
4419 
4420 template<typename Derived>
4421 QualType
4422 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4423                                                   BlockPointerTypeLoc TL) {
4424   QualType PointeeType
4425     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4426   if (PointeeType.isNull())
4427     return QualType();
4428 
4429   QualType Result = TL.getType();
4430   if (getDerived().AlwaysRebuild() ||
4431       PointeeType != TL.getPointeeLoc().getType()) {
4432     Result = getDerived().RebuildBlockPointerType(PointeeType,
4433                                                   TL.getSigilLoc());
4434     if (Result.isNull())
4435       return QualType();
4436   }
4437 
4438   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4439   NewT.setSigilLoc(TL.getSigilLoc());
4440   return Result;
4441 }
4442 
4443 /// Transforms a reference type.  Note that somewhat paradoxically we
4444 /// don't care whether the type itself is an l-value type or an r-value
4445 /// type;  we only care if the type was *written* as an l-value type
4446 /// or an r-value type.
4447 template<typename Derived>
4448 QualType
4449 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4450                                                ReferenceTypeLoc TL) {
4451   const ReferenceType *T = TL.getTypePtr();
4452 
4453   // Note that this works with the pointee-as-written.
4454   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4455   if (PointeeType.isNull())
4456     return QualType();
4457 
4458   QualType Result = TL.getType();
4459   if (getDerived().AlwaysRebuild() ||
4460       PointeeType != T->getPointeeTypeAsWritten()) {
4461     Result = getDerived().RebuildReferenceType(PointeeType,
4462                                                T->isSpelledAsLValue(),
4463                                                TL.getSigilLoc());
4464     if (Result.isNull())
4465       return QualType();
4466   }
4467 
4468   // Objective-C ARC can add lifetime qualifiers to the type that we're
4469   // referring to.
4470   TLB.TypeWasModifiedSafely(
4471                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4472 
4473   // r-value references can be rebuilt as l-value references.
4474   ReferenceTypeLoc NewTL;
4475   if (isa<LValueReferenceType>(Result))
4476     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4477   else
4478     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4479   NewTL.setSigilLoc(TL.getSigilLoc());
4480 
4481   return Result;
4482 }
4483 
4484 template<typename Derived>
4485 QualType
4486 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4487                                                  LValueReferenceTypeLoc TL) {
4488   return TransformReferenceType(TLB, TL);
4489 }
4490 
4491 template<typename Derived>
4492 QualType
4493 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4494                                                  RValueReferenceTypeLoc TL) {
4495   return TransformReferenceType(TLB, TL);
4496 }
4497 
4498 template<typename Derived>
4499 QualType
4500 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4501                                                    MemberPointerTypeLoc TL) {
4502   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4503   if (PointeeType.isNull())
4504     return QualType();
4505 
4506   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4507   TypeSourceInfo *NewClsTInfo = nullptr;
4508   if (OldClsTInfo) {
4509     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4510     if (!NewClsTInfo)
4511       return QualType();
4512   }
4513 
4514   const MemberPointerType *T = TL.getTypePtr();
4515   QualType OldClsType = QualType(T->getClass(), 0);
4516   QualType NewClsType;
4517   if (NewClsTInfo)
4518     NewClsType = NewClsTInfo->getType();
4519   else {
4520     NewClsType = getDerived().TransformType(OldClsType);
4521     if (NewClsType.isNull())
4522       return QualType();
4523   }
4524 
4525   QualType Result = TL.getType();
4526   if (getDerived().AlwaysRebuild() ||
4527       PointeeType != T->getPointeeType() ||
4528       NewClsType != OldClsType) {
4529     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4530                                                    TL.getStarLoc());
4531     if (Result.isNull())
4532       return QualType();
4533   }
4534 
4535   // If we had to adjust the pointee type when building a member pointer, make
4536   // sure to push TypeLoc info for it.
4537   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4538   if (MPT && PointeeType != MPT->getPointeeType()) {
4539     assert(isa<AdjustedType>(MPT->getPointeeType()));
4540     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4541   }
4542 
4543   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4544   NewTL.setSigilLoc(TL.getSigilLoc());
4545   NewTL.setClassTInfo(NewClsTInfo);
4546 
4547   return Result;
4548 }
4549 
4550 template<typename Derived>
4551 QualType
4552 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4553                                                    ConstantArrayTypeLoc TL) {
4554   const ConstantArrayType *T = TL.getTypePtr();
4555   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4556   if (ElementType.isNull())
4557     return QualType();
4558 
4559   QualType Result = TL.getType();
4560   if (getDerived().AlwaysRebuild() ||
4561       ElementType != T->getElementType()) {
4562     Result = getDerived().RebuildConstantArrayType(ElementType,
4563                                                    T->getSizeModifier(),
4564                                                    T->getSize(),
4565                                              T->getIndexTypeCVRQualifiers(),
4566                                                    TL.getBracketsRange());
4567     if (Result.isNull())
4568       return QualType();
4569   }
4570 
4571   // We might have either a ConstantArrayType or a VariableArrayType now:
4572   // a ConstantArrayType is allowed to have an element type which is a
4573   // VariableArrayType if the type is dependent.  Fortunately, all array
4574   // types have the same location layout.
4575   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4576   NewTL.setLBracketLoc(TL.getLBracketLoc());
4577   NewTL.setRBracketLoc(TL.getRBracketLoc());
4578 
4579   Expr *Size = TL.getSizeExpr();
4580   if (Size) {
4581     EnterExpressionEvaluationContext Unevaluated(
4582         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4583     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4584     Size = SemaRef.ActOnConstantExpression(Size).get();
4585   }
4586   NewTL.setSizeExpr(Size);
4587 
4588   return Result;
4589 }
4590 
4591 template<typename Derived>
4592 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4593                                               TypeLocBuilder &TLB,
4594                                               IncompleteArrayTypeLoc TL) {
4595   const IncompleteArrayType *T = TL.getTypePtr();
4596   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4597   if (ElementType.isNull())
4598     return QualType();
4599 
4600   QualType Result = TL.getType();
4601   if (getDerived().AlwaysRebuild() ||
4602       ElementType != T->getElementType()) {
4603     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4604                                                      T->getSizeModifier(),
4605                                            T->getIndexTypeCVRQualifiers(),
4606                                                      TL.getBracketsRange());
4607     if (Result.isNull())
4608       return QualType();
4609   }
4610 
4611   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4612   NewTL.setLBracketLoc(TL.getLBracketLoc());
4613   NewTL.setRBracketLoc(TL.getRBracketLoc());
4614   NewTL.setSizeExpr(nullptr);
4615 
4616   return Result;
4617 }
4618 
4619 template<typename Derived>
4620 QualType
4621 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4622                                                    VariableArrayTypeLoc TL) {
4623   const VariableArrayType *T = TL.getTypePtr();
4624   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4625   if (ElementType.isNull())
4626     return QualType();
4627 
4628   ExprResult SizeResult;
4629   {
4630     EnterExpressionEvaluationContext Context(
4631         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4632     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4633   }
4634   if (SizeResult.isInvalid())
4635     return QualType();
4636   SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get());
4637   if (SizeResult.isInvalid())
4638     return QualType();
4639 
4640   Expr *Size = SizeResult.get();
4641 
4642   QualType Result = TL.getType();
4643   if (getDerived().AlwaysRebuild() ||
4644       ElementType != T->getElementType() ||
4645       Size != T->getSizeExpr()) {
4646     Result = getDerived().RebuildVariableArrayType(ElementType,
4647                                                    T->getSizeModifier(),
4648                                                    Size,
4649                                              T->getIndexTypeCVRQualifiers(),
4650                                                    TL.getBracketsRange());
4651     if (Result.isNull())
4652       return QualType();
4653   }
4654 
4655   // We might have constant size array now, but fortunately it has the same
4656   // location layout.
4657   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4658   NewTL.setLBracketLoc(TL.getLBracketLoc());
4659   NewTL.setRBracketLoc(TL.getRBracketLoc());
4660   NewTL.setSizeExpr(Size);
4661 
4662   return Result;
4663 }
4664 
4665 template<typename Derived>
4666 QualType
4667 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4668                                              DependentSizedArrayTypeLoc TL) {
4669   const DependentSizedArrayType *T = TL.getTypePtr();
4670   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4671   if (ElementType.isNull())
4672     return QualType();
4673 
4674   // Array bounds are constant expressions.
4675   EnterExpressionEvaluationContext Unevaluated(
4676       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4677 
4678   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4679   Expr *origSize = TL.getSizeExpr();
4680   if (!origSize) origSize = T->getSizeExpr();
4681 
4682   ExprResult sizeResult
4683     = getDerived().TransformExpr(origSize);
4684   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4685   if (sizeResult.isInvalid())
4686     return QualType();
4687 
4688   Expr *size = sizeResult.get();
4689 
4690   QualType Result = TL.getType();
4691   if (getDerived().AlwaysRebuild() ||
4692       ElementType != T->getElementType() ||
4693       size != origSize) {
4694     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4695                                                          T->getSizeModifier(),
4696                                                          size,
4697                                                 T->getIndexTypeCVRQualifiers(),
4698                                                         TL.getBracketsRange());
4699     if (Result.isNull())
4700       return QualType();
4701   }
4702 
4703   // We might have any sort of array type now, but fortunately they
4704   // all have the same location layout.
4705   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4706   NewTL.setLBracketLoc(TL.getLBracketLoc());
4707   NewTL.setRBracketLoc(TL.getRBracketLoc());
4708   NewTL.setSizeExpr(size);
4709 
4710   return Result;
4711 }
4712 
4713 template<typename Derived>
4714 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4715                                       TypeLocBuilder &TLB,
4716                                       DependentSizedExtVectorTypeLoc TL) {
4717   const DependentSizedExtVectorType *T = TL.getTypePtr();
4718 
4719   // FIXME: ext vector locs should be nested
4720   QualType ElementType = getDerived().TransformType(T->getElementType());
4721   if (ElementType.isNull())
4722     return QualType();
4723 
4724   // Vector sizes are constant expressions.
4725   EnterExpressionEvaluationContext Unevaluated(
4726       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4727 
4728   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4729   Size = SemaRef.ActOnConstantExpression(Size);
4730   if (Size.isInvalid())
4731     return QualType();
4732 
4733   QualType Result = TL.getType();
4734   if (getDerived().AlwaysRebuild() ||
4735       ElementType != T->getElementType() ||
4736       Size.get() != T->getSizeExpr()) {
4737     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4738                                                              Size.get(),
4739                                                          T->getAttributeLoc());
4740     if (Result.isNull())
4741       return QualType();
4742   }
4743 
4744   // Result might be dependent or not.
4745   if (isa<DependentSizedExtVectorType>(Result)) {
4746     DependentSizedExtVectorTypeLoc NewTL
4747       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4748     NewTL.setNameLoc(TL.getNameLoc());
4749   } else {
4750     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4751     NewTL.setNameLoc(TL.getNameLoc());
4752   }
4753 
4754   return Result;
4755 }
4756 
4757 template<typename Derived>
4758 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4759                                                      VectorTypeLoc TL) {
4760   const VectorType *T = TL.getTypePtr();
4761   QualType ElementType = getDerived().TransformType(T->getElementType());
4762   if (ElementType.isNull())
4763     return QualType();
4764 
4765   QualType Result = TL.getType();
4766   if (getDerived().AlwaysRebuild() ||
4767       ElementType != T->getElementType()) {
4768     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4769                                             T->getVectorKind());
4770     if (Result.isNull())
4771       return QualType();
4772   }
4773 
4774   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4775   NewTL.setNameLoc(TL.getNameLoc());
4776 
4777   return Result;
4778 }
4779 
4780 template<typename Derived>
4781 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4782                                                         ExtVectorTypeLoc TL) {
4783   const VectorType *T = TL.getTypePtr();
4784   QualType ElementType = getDerived().TransformType(T->getElementType());
4785   if (ElementType.isNull())
4786     return QualType();
4787 
4788   QualType Result = TL.getType();
4789   if (getDerived().AlwaysRebuild() ||
4790       ElementType != T->getElementType()) {
4791     Result = getDerived().RebuildExtVectorType(ElementType,
4792                                                T->getNumElements(),
4793                                                /*FIXME*/ SourceLocation());
4794     if (Result.isNull())
4795       return QualType();
4796   }
4797 
4798   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4799   NewTL.setNameLoc(TL.getNameLoc());
4800 
4801   return Result;
4802 }
4803 
4804 template <typename Derived>
4805 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4806     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4807     bool ExpectParameterPack) {
4808   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4809   TypeSourceInfo *NewDI = nullptr;
4810 
4811   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4812     // If we're substituting into a pack expansion type and we know the
4813     // length we want to expand to, just substitute for the pattern.
4814     TypeLoc OldTL = OldDI->getTypeLoc();
4815     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4816 
4817     TypeLocBuilder TLB;
4818     TypeLoc NewTL = OldDI->getTypeLoc();
4819     TLB.reserve(NewTL.getFullDataSize());
4820 
4821     QualType Result = getDerived().TransformType(TLB,
4822                                                OldExpansionTL.getPatternLoc());
4823     if (Result.isNull())
4824       return nullptr;
4825 
4826     Result = RebuildPackExpansionType(Result,
4827                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4828                                       OldExpansionTL.getEllipsisLoc(),
4829                                       NumExpansions);
4830     if (Result.isNull())
4831       return nullptr;
4832 
4833     PackExpansionTypeLoc NewExpansionTL
4834       = TLB.push<PackExpansionTypeLoc>(Result);
4835     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4836     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4837   } else
4838     NewDI = getDerived().TransformType(OldDI);
4839   if (!NewDI)
4840     return nullptr;
4841 
4842   if (NewDI == OldDI && indexAdjustment == 0)
4843     return OldParm;
4844 
4845   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4846                                              OldParm->getDeclContext(),
4847                                              OldParm->getInnerLocStart(),
4848                                              OldParm->getLocation(),
4849                                              OldParm->getIdentifier(),
4850                                              NewDI->getType(),
4851                                              NewDI,
4852                                              OldParm->getStorageClass(),
4853                                              /* DefArg */ nullptr);
4854   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4855                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4856   return newParm;
4857 }
4858 
4859 template <typename Derived>
4860 bool TreeTransform<Derived>::TransformFunctionTypeParams(
4861     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4862     const QualType *ParamTypes,
4863     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4864     SmallVectorImpl<QualType> &OutParamTypes,
4865     SmallVectorImpl<ParmVarDecl *> *PVars,
4866     Sema::ExtParameterInfoBuilder &PInfos) {
4867   int indexAdjustment = 0;
4868 
4869   unsigned NumParams = Params.size();
4870   for (unsigned i = 0; i != NumParams; ++i) {
4871     if (ParmVarDecl *OldParm = Params[i]) {
4872       assert(OldParm->getFunctionScopeIndex() == i);
4873 
4874       Optional<unsigned> NumExpansions;
4875       ParmVarDecl *NewParm = nullptr;
4876       if (OldParm->isParameterPack()) {
4877         // We have a function parameter pack that may need to be expanded.
4878         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4879 
4880         // Find the parameter packs that could be expanded.
4881         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4882         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4883         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4884         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4885         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4886 
4887         // Determine whether we should expand the parameter packs.
4888         bool ShouldExpand = false;
4889         bool RetainExpansion = false;
4890         Optional<unsigned> OrigNumExpansions =
4891             ExpansionTL.getTypePtr()->getNumExpansions();
4892         NumExpansions = OrigNumExpansions;
4893         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4894                                                  Pattern.getSourceRange(),
4895                                                  Unexpanded,
4896                                                  ShouldExpand,
4897                                                  RetainExpansion,
4898                                                  NumExpansions)) {
4899           return true;
4900         }
4901 
4902         if (ShouldExpand) {
4903           // Expand the function parameter pack into multiple, separate
4904           // parameters.
4905           getDerived().ExpandingFunctionParameterPack(OldParm);
4906           for (unsigned I = 0; I != *NumExpansions; ++I) {
4907             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4908             ParmVarDecl *NewParm
4909               = getDerived().TransformFunctionTypeParam(OldParm,
4910                                                         indexAdjustment++,
4911                                                         OrigNumExpansions,
4912                                                 /*ExpectParameterPack=*/false);
4913             if (!NewParm)
4914               return true;
4915 
4916             if (ParamInfos)
4917               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4918             OutParamTypes.push_back(NewParm->getType());
4919             if (PVars)
4920               PVars->push_back(NewParm);
4921           }
4922 
4923           // If we're supposed to retain a pack expansion, do so by temporarily
4924           // forgetting the partially-substituted parameter pack.
4925           if (RetainExpansion) {
4926             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4927             ParmVarDecl *NewParm
4928               = getDerived().TransformFunctionTypeParam(OldParm,
4929                                                         indexAdjustment++,
4930                                                         OrigNumExpansions,
4931                                                 /*ExpectParameterPack=*/false);
4932             if (!NewParm)
4933               return true;
4934 
4935             if (ParamInfos)
4936               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4937             OutParamTypes.push_back(NewParm->getType());
4938             if (PVars)
4939               PVars->push_back(NewParm);
4940           }
4941 
4942           // The next parameter should have the same adjustment as the
4943           // last thing we pushed, but we post-incremented indexAdjustment
4944           // on every push.  Also, if we push nothing, the adjustment should
4945           // go down by one.
4946           indexAdjustment--;
4947 
4948           // We're done with the pack expansion.
4949           continue;
4950         }
4951 
4952         // We'll substitute the parameter now without expanding the pack
4953         // expansion.
4954         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4955         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4956                                                           indexAdjustment,
4957                                                           NumExpansions,
4958                                                   /*ExpectParameterPack=*/true);
4959       } else {
4960         NewParm = getDerived().TransformFunctionTypeParam(
4961             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4962       }
4963 
4964       if (!NewParm)
4965         return true;
4966 
4967       if (ParamInfos)
4968         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4969       OutParamTypes.push_back(NewParm->getType());
4970       if (PVars)
4971         PVars->push_back(NewParm);
4972       continue;
4973     }
4974 
4975     // Deal with the possibility that we don't have a parameter
4976     // declaration for this parameter.
4977     QualType OldType = ParamTypes[i];
4978     bool IsPackExpansion = false;
4979     Optional<unsigned> NumExpansions;
4980     QualType NewType;
4981     if (const PackExpansionType *Expansion
4982                                        = dyn_cast<PackExpansionType>(OldType)) {
4983       // We have a function parameter pack that may need to be expanded.
4984       QualType Pattern = Expansion->getPattern();
4985       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4986       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4987 
4988       // Determine whether we should expand the parameter packs.
4989       bool ShouldExpand = false;
4990       bool RetainExpansion = false;
4991       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4992                                                Unexpanded,
4993                                                ShouldExpand,
4994                                                RetainExpansion,
4995                                                NumExpansions)) {
4996         return true;
4997       }
4998 
4999       if (ShouldExpand) {
5000         // Expand the function parameter pack into multiple, separate
5001         // parameters.
5002         for (unsigned I = 0; I != *NumExpansions; ++I) {
5003           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5004           QualType NewType = getDerived().TransformType(Pattern);
5005           if (NewType.isNull())
5006             return true;
5007 
5008           if (NewType->containsUnexpandedParameterPack()) {
5009             NewType =
5010                 getSema().getASTContext().getPackExpansionType(NewType, None);
5011 
5012             if (NewType.isNull())
5013               return true;
5014           }
5015 
5016           if (ParamInfos)
5017             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5018           OutParamTypes.push_back(NewType);
5019           if (PVars)
5020             PVars->push_back(nullptr);
5021         }
5022 
5023         // We're done with the pack expansion.
5024         continue;
5025       }
5026 
5027       // If we're supposed to retain a pack expansion, do so by temporarily
5028       // forgetting the partially-substituted parameter pack.
5029       if (RetainExpansion) {
5030         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5031         QualType NewType = getDerived().TransformType(Pattern);
5032         if (NewType.isNull())
5033           return true;
5034 
5035         if (ParamInfos)
5036           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5037         OutParamTypes.push_back(NewType);
5038         if (PVars)
5039           PVars->push_back(nullptr);
5040       }
5041 
5042       // We'll substitute the parameter now without expanding the pack
5043       // expansion.
5044       OldType = Expansion->getPattern();
5045       IsPackExpansion = true;
5046       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5047       NewType = getDerived().TransformType(OldType);
5048     } else {
5049       NewType = getDerived().TransformType(OldType);
5050     }
5051 
5052     if (NewType.isNull())
5053       return true;
5054 
5055     if (IsPackExpansion)
5056       NewType = getSema().Context.getPackExpansionType(NewType,
5057                                                        NumExpansions);
5058 
5059     if (ParamInfos)
5060       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5061     OutParamTypes.push_back(NewType);
5062     if (PVars)
5063       PVars->push_back(nullptr);
5064   }
5065 
5066 #ifndef NDEBUG
5067   if (PVars) {
5068     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5069       if (ParmVarDecl *parm = (*PVars)[i])
5070         assert(parm->getFunctionScopeIndex() == i);
5071   }
5072 #endif
5073 
5074   return false;
5075 }
5076 
5077 template<typename Derived>
5078 QualType
5079 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5080                                                    FunctionProtoTypeLoc TL) {
5081   SmallVector<QualType, 4> ExceptionStorage;
5082   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5083   return getDerived().TransformFunctionProtoType(
5084       TLB, TL, nullptr, 0,
5085       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5086         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5087                                             ExceptionStorage, Changed);
5088       });
5089 }
5090 
5091 template<typename Derived> template<typename Fn>
5092 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5093     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5094     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
5095 
5096   // Transform the parameters and return type.
5097   //
5098   // We are required to instantiate the params and return type in source order.
5099   // When the function has a trailing return type, we instantiate the
5100   // parameters before the return type,  since the return type can then refer
5101   // to the parameters themselves (via decltype, sizeof, etc.).
5102   //
5103   SmallVector<QualType, 4> ParamTypes;
5104   SmallVector<ParmVarDecl*, 4> ParamDecls;
5105   Sema::ExtParameterInfoBuilder ExtParamInfos;
5106   const FunctionProtoType *T = TL.getTypePtr();
5107 
5108   QualType ResultType;
5109 
5110   if (T->hasTrailingReturn()) {
5111     if (getDerived().TransformFunctionTypeParams(
5112             TL.getBeginLoc(), TL.getParams(),
5113             TL.getTypePtr()->param_type_begin(),
5114             T->getExtParameterInfosOrNull(),
5115             ParamTypes, &ParamDecls, ExtParamInfos))
5116       return QualType();
5117 
5118     {
5119       // C++11 [expr.prim.general]p3:
5120       //   If a declaration declares a member function or member function
5121       //   template of a class X, the expression this is a prvalue of type
5122       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5123       //   and the end of the function-definition, member-declarator, or
5124       //   declarator.
5125       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5126 
5127       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5128       if (ResultType.isNull())
5129         return QualType();
5130     }
5131   }
5132   else {
5133     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5134     if (ResultType.isNull())
5135       return QualType();
5136 
5137     if (getDerived().TransformFunctionTypeParams(
5138             TL.getBeginLoc(), TL.getParams(),
5139             TL.getTypePtr()->param_type_begin(),
5140             T->getExtParameterInfosOrNull(),
5141             ParamTypes, &ParamDecls, ExtParamInfos))
5142       return QualType();
5143   }
5144 
5145   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5146 
5147   bool EPIChanged = false;
5148   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5149     return QualType();
5150 
5151   // Handle extended parameter information.
5152   if (auto NewExtParamInfos =
5153         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5154     if (!EPI.ExtParameterInfos ||
5155         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5156           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5157       EPIChanged = true;
5158     }
5159     EPI.ExtParameterInfos = NewExtParamInfos;
5160   } else if (EPI.ExtParameterInfos) {
5161     EPIChanged = true;
5162     EPI.ExtParameterInfos = nullptr;
5163   }
5164 
5165   QualType Result = TL.getType();
5166   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5167       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5168     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5169     if (Result.isNull())
5170       return QualType();
5171   }
5172 
5173   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5174   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5175   NewTL.setLParenLoc(TL.getLParenLoc());
5176   NewTL.setRParenLoc(TL.getRParenLoc());
5177   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5178   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5179   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5180     NewTL.setParam(i, ParamDecls[i]);
5181 
5182   return Result;
5183 }
5184 
5185 template<typename Derived>
5186 bool TreeTransform<Derived>::TransformExceptionSpec(
5187     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5188     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5189   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5190 
5191   // Instantiate a dynamic noexcept expression, if any.
5192   if (ESI.Type == EST_ComputedNoexcept) {
5193     EnterExpressionEvaluationContext Unevaluated(
5194         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5195     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5196     if (NoexceptExpr.isInvalid())
5197       return true;
5198 
5199     // FIXME: This is bogus, a noexcept expression is not a condition.
5200     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5201     if (NoexceptExpr.isInvalid())
5202       return true;
5203 
5204     if (!NoexceptExpr.get()->isValueDependent()) {
5205       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5206           NoexceptExpr.get(), nullptr,
5207           diag::err_noexcept_needs_constant_expression,
5208           /*AllowFold*/false);
5209       if (NoexceptExpr.isInvalid())
5210         return true;
5211     }
5212 
5213     if (ESI.NoexceptExpr != NoexceptExpr.get())
5214       Changed = true;
5215     ESI.NoexceptExpr = NoexceptExpr.get();
5216   }
5217 
5218   if (ESI.Type != EST_Dynamic)
5219     return false;
5220 
5221   // Instantiate a dynamic exception specification's type.
5222   for (QualType T : ESI.Exceptions) {
5223     if (const PackExpansionType *PackExpansion =
5224             T->getAs<PackExpansionType>()) {
5225       Changed = true;
5226 
5227       // We have a pack expansion. Instantiate it.
5228       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5229       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5230                                               Unexpanded);
5231       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5232 
5233       // Determine whether the set of unexpanded parameter packs can and
5234       // should
5235       // be expanded.
5236       bool Expand = false;
5237       bool RetainExpansion = false;
5238       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5239       // FIXME: Track the location of the ellipsis (and track source location
5240       // information for the types in the exception specification in general).
5241       if (getDerived().TryExpandParameterPacks(
5242               Loc, SourceRange(), Unexpanded, Expand,
5243               RetainExpansion, NumExpansions))
5244         return true;
5245 
5246       if (!Expand) {
5247         // We can't expand this pack expansion into separate arguments yet;
5248         // just substitute into the pattern and create a new pack expansion
5249         // type.
5250         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5251         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5252         if (U.isNull())
5253           return true;
5254 
5255         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5256         Exceptions.push_back(U);
5257         continue;
5258       }
5259 
5260       // Substitute into the pack expansion pattern for each slice of the
5261       // pack.
5262       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5263         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5264 
5265         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5266         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5267           return true;
5268 
5269         Exceptions.push_back(U);
5270       }
5271     } else {
5272       QualType U = getDerived().TransformType(T);
5273       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5274         return true;
5275       if (T != U)
5276         Changed = true;
5277 
5278       Exceptions.push_back(U);
5279     }
5280   }
5281 
5282   ESI.Exceptions = Exceptions;
5283   if (ESI.Exceptions.empty())
5284     ESI.Type = EST_DynamicNone;
5285   return false;
5286 }
5287 
5288 template<typename Derived>
5289 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5290                                                  TypeLocBuilder &TLB,
5291                                                  FunctionNoProtoTypeLoc TL) {
5292   const FunctionNoProtoType *T = TL.getTypePtr();
5293   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5294   if (ResultType.isNull())
5295     return QualType();
5296 
5297   QualType Result = TL.getType();
5298   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5299     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5300 
5301   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5302   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5303   NewTL.setLParenLoc(TL.getLParenLoc());
5304   NewTL.setRParenLoc(TL.getRParenLoc());
5305   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5306 
5307   return Result;
5308 }
5309 
5310 template<typename Derived> QualType
5311 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5312                                                  UnresolvedUsingTypeLoc TL) {
5313   const UnresolvedUsingType *T = TL.getTypePtr();
5314   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5315   if (!D)
5316     return QualType();
5317 
5318   QualType Result = TL.getType();
5319   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5320     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5321     if (Result.isNull())
5322       return QualType();
5323   }
5324 
5325   // We might get an arbitrary type spec type back.  We should at
5326   // least always get a type spec type, though.
5327   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5328   NewTL.setNameLoc(TL.getNameLoc());
5329 
5330   return Result;
5331 }
5332 
5333 template<typename Derived>
5334 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5335                                                       TypedefTypeLoc TL) {
5336   const TypedefType *T = TL.getTypePtr();
5337   TypedefNameDecl *Typedef
5338     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5339                                                                T->getDecl()));
5340   if (!Typedef)
5341     return QualType();
5342 
5343   QualType Result = TL.getType();
5344   if (getDerived().AlwaysRebuild() ||
5345       Typedef != T->getDecl()) {
5346     Result = getDerived().RebuildTypedefType(Typedef);
5347     if (Result.isNull())
5348       return QualType();
5349   }
5350 
5351   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5352   NewTL.setNameLoc(TL.getNameLoc());
5353 
5354   return Result;
5355 }
5356 
5357 template<typename Derived>
5358 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5359                                                       TypeOfExprTypeLoc TL) {
5360   // typeof expressions are not potentially evaluated contexts
5361   EnterExpressionEvaluationContext Unevaluated(
5362       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5363       Sema::ReuseLambdaContextDecl);
5364 
5365   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5366   if (E.isInvalid())
5367     return QualType();
5368 
5369   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5370   if (E.isInvalid())
5371     return QualType();
5372 
5373   QualType Result = TL.getType();
5374   if (getDerived().AlwaysRebuild() ||
5375       E.get() != TL.getUnderlyingExpr()) {
5376     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5377     if (Result.isNull())
5378       return QualType();
5379   }
5380   else E.get();
5381 
5382   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5383   NewTL.setTypeofLoc(TL.getTypeofLoc());
5384   NewTL.setLParenLoc(TL.getLParenLoc());
5385   NewTL.setRParenLoc(TL.getRParenLoc());
5386 
5387   return Result;
5388 }
5389 
5390 template<typename Derived>
5391 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5392                                                      TypeOfTypeLoc TL) {
5393   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5394   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5395   if (!New_Under_TI)
5396     return QualType();
5397 
5398   QualType Result = TL.getType();
5399   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5400     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5401     if (Result.isNull())
5402       return QualType();
5403   }
5404 
5405   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5406   NewTL.setTypeofLoc(TL.getTypeofLoc());
5407   NewTL.setLParenLoc(TL.getLParenLoc());
5408   NewTL.setRParenLoc(TL.getRParenLoc());
5409   NewTL.setUnderlyingTInfo(New_Under_TI);
5410 
5411   return Result;
5412 }
5413 
5414 template<typename Derived>
5415 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5416                                                        DecltypeTypeLoc TL) {
5417   const DecltypeType *T = TL.getTypePtr();
5418 
5419   // decltype expressions are not potentially evaluated contexts
5420   EnterExpressionEvaluationContext Unevaluated(
5421       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5422       /*IsDecltype=*/true);
5423 
5424   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5425   if (E.isInvalid())
5426     return QualType();
5427 
5428   E = getSema().ActOnDecltypeExpression(E.get());
5429   if (E.isInvalid())
5430     return QualType();
5431 
5432   QualType Result = TL.getType();
5433   if (getDerived().AlwaysRebuild() ||
5434       E.get() != T->getUnderlyingExpr()) {
5435     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5436     if (Result.isNull())
5437       return QualType();
5438   }
5439   else E.get();
5440 
5441   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5442   NewTL.setNameLoc(TL.getNameLoc());
5443 
5444   return Result;
5445 }
5446 
5447 template<typename Derived>
5448 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5449                                                             TypeLocBuilder &TLB,
5450                                                      UnaryTransformTypeLoc TL) {
5451   QualType Result = TL.getType();
5452   if (Result->isDependentType()) {
5453     const UnaryTransformType *T = TL.getTypePtr();
5454     QualType NewBase =
5455       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5456     Result = getDerived().RebuildUnaryTransformType(NewBase,
5457                                                     T->getUTTKind(),
5458                                                     TL.getKWLoc());
5459     if (Result.isNull())
5460       return QualType();
5461   }
5462 
5463   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5464   NewTL.setKWLoc(TL.getKWLoc());
5465   NewTL.setParensRange(TL.getParensRange());
5466   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5467   return Result;
5468 }
5469 
5470 template<typename Derived>
5471 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5472                                                    AutoTypeLoc TL) {
5473   const AutoType *T = TL.getTypePtr();
5474   QualType OldDeduced = T->getDeducedType();
5475   QualType NewDeduced;
5476   if (!OldDeduced.isNull()) {
5477     NewDeduced = getDerived().TransformType(OldDeduced);
5478     if (NewDeduced.isNull())
5479       return QualType();
5480   }
5481 
5482   QualType Result = TL.getType();
5483   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5484       T->isDependentType()) {
5485     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5486     if (Result.isNull())
5487       return QualType();
5488   }
5489 
5490   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5491   NewTL.setNameLoc(TL.getNameLoc());
5492 
5493   return Result;
5494 }
5495 
5496 template<typename Derived>
5497 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5498     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5499   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5500 
5501   CXXScopeSpec SS;
5502   TemplateName TemplateName = getDerived().TransformTemplateName(
5503       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5504   if (TemplateName.isNull())
5505     return QualType();
5506 
5507   QualType OldDeduced = T->getDeducedType();
5508   QualType NewDeduced;
5509   if (!OldDeduced.isNull()) {
5510     NewDeduced = getDerived().TransformType(OldDeduced);
5511     if (NewDeduced.isNull())
5512       return QualType();
5513   }
5514 
5515   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5516       TemplateName, NewDeduced);
5517   if (Result.isNull())
5518     return QualType();
5519 
5520   DeducedTemplateSpecializationTypeLoc NewTL =
5521       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5522   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5523 
5524   return Result;
5525 }
5526 
5527 template<typename Derived>
5528 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5529                                                      RecordTypeLoc TL) {
5530   const RecordType *T = TL.getTypePtr();
5531   RecordDecl *Record
5532     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5533                                                           T->getDecl()));
5534   if (!Record)
5535     return QualType();
5536 
5537   QualType Result = TL.getType();
5538   if (getDerived().AlwaysRebuild() ||
5539       Record != T->getDecl()) {
5540     Result = getDerived().RebuildRecordType(Record);
5541     if (Result.isNull())
5542       return QualType();
5543   }
5544 
5545   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5546   NewTL.setNameLoc(TL.getNameLoc());
5547 
5548   return Result;
5549 }
5550 
5551 template<typename Derived>
5552 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5553                                                    EnumTypeLoc TL) {
5554   const EnumType *T = TL.getTypePtr();
5555   EnumDecl *Enum
5556     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5557                                                         T->getDecl()));
5558   if (!Enum)
5559     return QualType();
5560 
5561   QualType Result = TL.getType();
5562   if (getDerived().AlwaysRebuild() ||
5563       Enum != T->getDecl()) {
5564     Result = getDerived().RebuildEnumType(Enum);
5565     if (Result.isNull())
5566       return QualType();
5567   }
5568 
5569   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5570   NewTL.setNameLoc(TL.getNameLoc());
5571 
5572   return Result;
5573 }
5574 
5575 template<typename Derived>
5576 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5577                                          TypeLocBuilder &TLB,
5578                                          InjectedClassNameTypeLoc TL) {
5579   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5580                                        TL.getTypePtr()->getDecl());
5581   if (!D) return QualType();
5582 
5583   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5584   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5585   return T;
5586 }
5587 
5588 template<typename Derived>
5589 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5590                                                 TypeLocBuilder &TLB,
5591                                                 TemplateTypeParmTypeLoc TL) {
5592   return TransformTypeSpecType(TLB, TL);
5593 }
5594 
5595 template<typename Derived>
5596 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5597                                          TypeLocBuilder &TLB,
5598                                          SubstTemplateTypeParmTypeLoc TL) {
5599   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5600 
5601   // Substitute into the replacement type, which itself might involve something
5602   // that needs to be transformed. This only tends to occur with default
5603   // template arguments of template template parameters.
5604   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5605   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5606   if (Replacement.isNull())
5607     return QualType();
5608 
5609   // Always canonicalize the replacement type.
5610   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5611   QualType Result
5612     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5613                                                    Replacement);
5614 
5615   // Propagate type-source information.
5616   SubstTemplateTypeParmTypeLoc NewTL
5617     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5618   NewTL.setNameLoc(TL.getNameLoc());
5619   return Result;
5620 
5621 }
5622 
5623 template<typename Derived>
5624 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5625                                           TypeLocBuilder &TLB,
5626                                           SubstTemplateTypeParmPackTypeLoc TL) {
5627   return TransformTypeSpecType(TLB, TL);
5628 }
5629 
5630 template<typename Derived>
5631 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5632                                                         TypeLocBuilder &TLB,
5633                                            TemplateSpecializationTypeLoc TL) {
5634   const TemplateSpecializationType *T = TL.getTypePtr();
5635 
5636   // The nested-name-specifier never matters in a TemplateSpecializationType,
5637   // because we can't have a dependent nested-name-specifier anyway.
5638   CXXScopeSpec SS;
5639   TemplateName Template
5640     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5641                                          TL.getTemplateNameLoc());
5642   if (Template.isNull())
5643     return QualType();
5644 
5645   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5646 }
5647 
5648 template<typename Derived>
5649 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5650                                                      AtomicTypeLoc TL) {
5651   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5652   if (ValueType.isNull())
5653     return QualType();
5654 
5655   QualType Result = TL.getType();
5656   if (getDerived().AlwaysRebuild() ||
5657       ValueType != TL.getValueLoc().getType()) {
5658     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5659     if (Result.isNull())
5660       return QualType();
5661   }
5662 
5663   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5664   NewTL.setKWLoc(TL.getKWLoc());
5665   NewTL.setLParenLoc(TL.getLParenLoc());
5666   NewTL.setRParenLoc(TL.getRParenLoc());
5667 
5668   return Result;
5669 }
5670 
5671 template <typename Derived>
5672 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5673                                                    PipeTypeLoc TL) {
5674   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5675   if (ValueType.isNull())
5676     return QualType();
5677 
5678   QualType Result = TL.getType();
5679   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5680     const PipeType *PT = Result->getAs<PipeType>();
5681     bool isReadPipe = PT->isReadOnly();
5682     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5683     if (Result.isNull())
5684       return QualType();
5685   }
5686 
5687   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5688   NewTL.setKWLoc(TL.getKWLoc());
5689 
5690   return Result;
5691 }
5692 
5693   /// \brief Simple iterator that traverses the template arguments in a
5694   /// container that provides a \c getArgLoc() member function.
5695   ///
5696   /// This iterator is intended to be used with the iterator form of
5697   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5698   template<typename ArgLocContainer>
5699   class TemplateArgumentLocContainerIterator {
5700     ArgLocContainer *Container;
5701     unsigned Index;
5702 
5703   public:
5704     typedef TemplateArgumentLoc value_type;
5705     typedef TemplateArgumentLoc reference;
5706     typedef int difference_type;
5707     typedef std::input_iterator_tag iterator_category;
5708 
5709     class pointer {
5710       TemplateArgumentLoc Arg;
5711 
5712     public:
5713       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5714 
5715       const TemplateArgumentLoc *operator->() const {
5716         return &Arg;
5717       }
5718     };
5719 
5720 
5721     TemplateArgumentLocContainerIterator() {}
5722 
5723     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5724                                  unsigned Index)
5725       : Container(&Container), Index(Index) { }
5726 
5727     TemplateArgumentLocContainerIterator &operator++() {
5728       ++Index;
5729       return *this;
5730     }
5731 
5732     TemplateArgumentLocContainerIterator operator++(int) {
5733       TemplateArgumentLocContainerIterator Old(*this);
5734       ++(*this);
5735       return Old;
5736     }
5737 
5738     TemplateArgumentLoc operator*() const {
5739       return Container->getArgLoc(Index);
5740     }
5741 
5742     pointer operator->() const {
5743       return pointer(Container->getArgLoc(Index));
5744     }
5745 
5746     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5747                            const TemplateArgumentLocContainerIterator &Y) {
5748       return X.Container == Y.Container && X.Index == Y.Index;
5749     }
5750 
5751     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5752                            const TemplateArgumentLocContainerIterator &Y) {
5753       return !(X == Y);
5754     }
5755   };
5756 
5757 
5758 template <typename Derived>
5759 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5760                                                         TypeLocBuilder &TLB,
5761                                            TemplateSpecializationTypeLoc TL,
5762                                                       TemplateName Template) {
5763   TemplateArgumentListInfo NewTemplateArgs;
5764   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5765   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5766   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5767     ArgIterator;
5768   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5769                                               ArgIterator(TL, TL.getNumArgs()),
5770                                               NewTemplateArgs))
5771     return QualType();
5772 
5773   // FIXME: maybe don't rebuild if all the template arguments are the same.
5774 
5775   QualType Result =
5776     getDerived().RebuildTemplateSpecializationType(Template,
5777                                                    TL.getTemplateNameLoc(),
5778                                                    NewTemplateArgs);
5779 
5780   if (!Result.isNull()) {
5781     // Specializations of template template parameters are represented as
5782     // TemplateSpecializationTypes, and substitution of type alias templates
5783     // within a dependent context can transform them into
5784     // DependentTemplateSpecializationTypes.
5785     if (isa<DependentTemplateSpecializationType>(Result)) {
5786       DependentTemplateSpecializationTypeLoc NewTL
5787         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5788       NewTL.setElaboratedKeywordLoc(SourceLocation());
5789       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5790       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5791       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5792       NewTL.setLAngleLoc(TL.getLAngleLoc());
5793       NewTL.setRAngleLoc(TL.getRAngleLoc());
5794       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5795         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5796       return Result;
5797     }
5798 
5799     TemplateSpecializationTypeLoc NewTL
5800       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5801     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5802     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5803     NewTL.setLAngleLoc(TL.getLAngleLoc());
5804     NewTL.setRAngleLoc(TL.getRAngleLoc());
5805     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5806       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5807   }
5808 
5809   return Result;
5810 }
5811 
5812 template <typename Derived>
5813 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5814                                      TypeLocBuilder &TLB,
5815                                      DependentTemplateSpecializationTypeLoc TL,
5816                                      TemplateName Template,
5817                                      CXXScopeSpec &SS) {
5818   TemplateArgumentListInfo NewTemplateArgs;
5819   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5820   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5821   typedef TemplateArgumentLocContainerIterator<
5822             DependentTemplateSpecializationTypeLoc> ArgIterator;
5823   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5824                                               ArgIterator(TL, TL.getNumArgs()),
5825                                               NewTemplateArgs))
5826     return QualType();
5827 
5828   // FIXME: maybe don't rebuild if all the template arguments are the same.
5829 
5830   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5831     QualType Result
5832       = getSema().Context.getDependentTemplateSpecializationType(
5833                                                 TL.getTypePtr()->getKeyword(),
5834                                                          DTN->getQualifier(),
5835                                                          DTN->getIdentifier(),
5836                                                                NewTemplateArgs);
5837 
5838     DependentTemplateSpecializationTypeLoc NewTL
5839       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5840     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5841     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5842     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5843     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5844     NewTL.setLAngleLoc(TL.getLAngleLoc());
5845     NewTL.setRAngleLoc(TL.getRAngleLoc());
5846     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5847       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5848     return Result;
5849   }
5850 
5851   QualType Result
5852     = getDerived().RebuildTemplateSpecializationType(Template,
5853                                                      TL.getTemplateNameLoc(),
5854                                                      NewTemplateArgs);
5855 
5856   if (!Result.isNull()) {
5857     /// FIXME: Wrap this in an elaborated-type-specifier?
5858     TemplateSpecializationTypeLoc NewTL
5859       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5860     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5861     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5862     NewTL.setLAngleLoc(TL.getLAngleLoc());
5863     NewTL.setRAngleLoc(TL.getRAngleLoc());
5864     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5865       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5866   }
5867 
5868   return Result;
5869 }
5870 
5871 template<typename Derived>
5872 QualType
5873 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5874                                                 ElaboratedTypeLoc TL) {
5875   const ElaboratedType *T = TL.getTypePtr();
5876 
5877   NestedNameSpecifierLoc QualifierLoc;
5878   // NOTE: the qualifier in an ElaboratedType is optional.
5879   if (TL.getQualifierLoc()) {
5880     QualifierLoc
5881       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5882     if (!QualifierLoc)
5883       return QualType();
5884   }
5885 
5886   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5887   if (NamedT.isNull())
5888     return QualType();
5889 
5890   // C++0x [dcl.type.elab]p2:
5891   //   If the identifier resolves to a typedef-name or the simple-template-id
5892   //   resolves to an alias template specialization, the
5893   //   elaborated-type-specifier is ill-formed.
5894   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5895     if (const TemplateSpecializationType *TST =
5896           NamedT->getAs<TemplateSpecializationType>()) {
5897       TemplateName Template = TST->getTemplateName();
5898       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5899               Template.getAsTemplateDecl())) {
5900         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5901                      diag::err_tag_reference_non_tag)
5902             << TAT << Sema::NTK_TypeAliasTemplate
5903             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
5904         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5905       }
5906     }
5907   }
5908 
5909   QualType Result = TL.getType();
5910   if (getDerived().AlwaysRebuild() ||
5911       QualifierLoc != TL.getQualifierLoc() ||
5912       NamedT != T->getNamedType()) {
5913     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5914                                                 T->getKeyword(),
5915                                                 QualifierLoc, NamedT);
5916     if (Result.isNull())
5917       return QualType();
5918   }
5919 
5920   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5921   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5922   NewTL.setQualifierLoc(QualifierLoc);
5923   return Result;
5924 }
5925 
5926 template<typename Derived>
5927 QualType TreeTransform<Derived>::TransformAttributedType(
5928                                                 TypeLocBuilder &TLB,
5929                                                 AttributedTypeLoc TL) {
5930   const AttributedType *oldType = TL.getTypePtr();
5931   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5932   if (modifiedType.isNull())
5933     return QualType();
5934 
5935   QualType result = TL.getType();
5936 
5937   // FIXME: dependent operand expressions?
5938   if (getDerived().AlwaysRebuild() ||
5939       modifiedType != oldType->getModifiedType()) {
5940     // TODO: this is really lame; we should really be rebuilding the
5941     // equivalent type from first principles.
5942     QualType equivalentType
5943       = getDerived().TransformType(oldType->getEquivalentType());
5944     if (equivalentType.isNull())
5945       return QualType();
5946 
5947     // Check whether we can add nullability; it is only represented as
5948     // type sugar, and therefore cannot be diagnosed in any other way.
5949     if (auto nullability = oldType->getImmediateNullability()) {
5950       if (!modifiedType->canHaveNullability()) {
5951         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
5952           << DiagNullabilityKind(*nullability, false) << modifiedType;
5953         return QualType();
5954       }
5955     }
5956 
5957     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5958                                                modifiedType,
5959                                                equivalentType);
5960   }
5961 
5962   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5963   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5964   if (TL.hasAttrOperand())
5965     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5966   if (TL.hasAttrExprOperand())
5967     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5968   else if (TL.hasAttrEnumOperand())
5969     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5970 
5971   return result;
5972 }
5973 
5974 template<typename Derived>
5975 QualType
5976 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5977                                            ParenTypeLoc TL) {
5978   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5979   if (Inner.isNull())
5980     return QualType();
5981 
5982   QualType Result = TL.getType();
5983   if (getDerived().AlwaysRebuild() ||
5984       Inner != TL.getInnerLoc().getType()) {
5985     Result = getDerived().RebuildParenType(Inner);
5986     if (Result.isNull())
5987       return QualType();
5988   }
5989 
5990   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5991   NewTL.setLParenLoc(TL.getLParenLoc());
5992   NewTL.setRParenLoc(TL.getRParenLoc());
5993   return Result;
5994 }
5995 
5996 template<typename Derived>
5997 QualType TreeTransform<Derived>::TransformDependentNameType(
5998     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
5999   return TransformDependentNameType(TLB, TL, false);
6000 }
6001 
6002 template<typename Derived>
6003 QualType TreeTransform<Derived>::TransformDependentNameType(
6004     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6005   const DependentNameType *T = TL.getTypePtr();
6006 
6007   NestedNameSpecifierLoc QualifierLoc
6008     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6009   if (!QualifierLoc)
6010     return QualType();
6011 
6012   QualType Result
6013     = getDerived().RebuildDependentNameType(T->getKeyword(),
6014                                             TL.getElaboratedKeywordLoc(),
6015                                             QualifierLoc,
6016                                             T->getIdentifier(),
6017                                             TL.getNameLoc(),
6018                                             DeducedTSTContext);
6019   if (Result.isNull())
6020     return QualType();
6021 
6022   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6023     QualType NamedT = ElabT->getNamedType();
6024     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6025 
6026     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6027     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6028     NewTL.setQualifierLoc(QualifierLoc);
6029   } else {
6030     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6031     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6032     NewTL.setQualifierLoc(QualifierLoc);
6033     NewTL.setNameLoc(TL.getNameLoc());
6034   }
6035   return Result;
6036 }
6037 
6038 template<typename Derived>
6039 QualType TreeTransform<Derived>::
6040           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6041                                  DependentTemplateSpecializationTypeLoc TL) {
6042   NestedNameSpecifierLoc QualifierLoc;
6043   if (TL.getQualifierLoc()) {
6044     QualifierLoc
6045       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6046     if (!QualifierLoc)
6047       return QualType();
6048   }
6049 
6050   return getDerived()
6051            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6052 }
6053 
6054 template<typename Derived>
6055 QualType TreeTransform<Derived>::
6056 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6057                                    DependentTemplateSpecializationTypeLoc TL,
6058                                        NestedNameSpecifierLoc QualifierLoc) {
6059   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6060 
6061   TemplateArgumentListInfo NewTemplateArgs;
6062   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6063   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6064 
6065   typedef TemplateArgumentLocContainerIterator<
6066   DependentTemplateSpecializationTypeLoc> ArgIterator;
6067   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6068                                               ArgIterator(TL, TL.getNumArgs()),
6069                                               NewTemplateArgs))
6070     return QualType();
6071 
6072   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6073       T->getKeyword(), QualifierLoc, T->getIdentifier(),
6074       TL.getTemplateNameLoc(), NewTemplateArgs,
6075       /*AllowInjectedClassName*/ false);
6076   if (Result.isNull())
6077     return QualType();
6078 
6079   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6080     QualType NamedT = ElabT->getNamedType();
6081 
6082     // Copy information relevant to the template specialization.
6083     TemplateSpecializationTypeLoc NamedTL
6084       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6085     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6086     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6087     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6088     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6089     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6090       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6091 
6092     // Copy information relevant to the elaborated type.
6093     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6094     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6095     NewTL.setQualifierLoc(QualifierLoc);
6096   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6097     DependentTemplateSpecializationTypeLoc SpecTL
6098       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6099     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6100     SpecTL.setQualifierLoc(QualifierLoc);
6101     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6102     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6103     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6104     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6105     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6106       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6107   } else {
6108     TemplateSpecializationTypeLoc SpecTL
6109       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6110     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6111     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6112     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6113     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6114     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6115       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6116   }
6117   return Result;
6118 }
6119 
6120 template<typename Derived>
6121 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6122                                                       PackExpansionTypeLoc TL) {
6123   QualType Pattern
6124     = getDerived().TransformType(TLB, TL.getPatternLoc());
6125   if (Pattern.isNull())
6126     return QualType();
6127 
6128   QualType Result = TL.getType();
6129   if (getDerived().AlwaysRebuild() ||
6130       Pattern != TL.getPatternLoc().getType()) {
6131     Result = getDerived().RebuildPackExpansionType(Pattern,
6132                                            TL.getPatternLoc().getSourceRange(),
6133                                                    TL.getEllipsisLoc(),
6134                                            TL.getTypePtr()->getNumExpansions());
6135     if (Result.isNull())
6136       return QualType();
6137   }
6138 
6139   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6140   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6141   return Result;
6142 }
6143 
6144 template<typename Derived>
6145 QualType
6146 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6147                                                    ObjCInterfaceTypeLoc TL) {
6148   // ObjCInterfaceType is never dependent.
6149   TLB.pushFullCopy(TL);
6150   return TL.getType();
6151 }
6152 
6153 template<typename Derived>
6154 QualType
6155 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6156                                                    ObjCTypeParamTypeLoc TL) {
6157   const ObjCTypeParamType *T = TL.getTypePtr();
6158   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6159       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6160   if (!OTP)
6161     return QualType();
6162 
6163   QualType Result = TL.getType();
6164   if (getDerived().AlwaysRebuild() ||
6165       OTP != T->getDecl()) {
6166     Result = getDerived().RebuildObjCTypeParamType(OTP,
6167                  TL.getProtocolLAngleLoc(),
6168                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6169                                     TL.getNumProtocols()),
6170                  TL.getProtocolLocs(),
6171                  TL.getProtocolRAngleLoc());
6172     if (Result.isNull())
6173       return QualType();
6174   }
6175 
6176   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6177   if (TL.getNumProtocols()) {
6178     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6179     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6180       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6181     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6182   }
6183   return Result;
6184 }
6185 
6186 template<typename Derived>
6187 QualType
6188 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6189                                                 ObjCObjectTypeLoc TL) {
6190   // Transform base type.
6191   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6192   if (BaseType.isNull())
6193     return QualType();
6194 
6195   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6196 
6197   // Transform type arguments.
6198   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6199   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6200     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6201     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6202     QualType TypeArg = TypeArgInfo->getType();
6203     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6204       AnyChanged = true;
6205 
6206       // We have a pack expansion. Instantiate it.
6207       const auto *PackExpansion = PackExpansionLoc.getType()
6208                                     ->castAs<PackExpansionType>();
6209       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6210       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6211                                               Unexpanded);
6212       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6213 
6214       // Determine whether the set of unexpanded parameter packs can
6215       // and should be expanded.
6216       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6217       bool Expand = false;
6218       bool RetainExpansion = false;
6219       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6220       if (getDerived().TryExpandParameterPacks(
6221             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6222             Unexpanded, Expand, RetainExpansion, NumExpansions))
6223         return QualType();
6224 
6225       if (!Expand) {
6226         // We can't expand this pack expansion into separate arguments yet;
6227         // just substitute into the pattern and create a new pack expansion
6228         // type.
6229         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6230 
6231         TypeLocBuilder TypeArgBuilder;
6232         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6233         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6234                                                              PatternLoc);
6235         if (NewPatternType.isNull())
6236           return QualType();
6237 
6238         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6239                                       NewPatternType, NumExpansions);
6240         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6241         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6242         NewTypeArgInfos.push_back(
6243           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6244         continue;
6245       }
6246 
6247       // Substitute into the pack expansion pattern for each slice of the
6248       // pack.
6249       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6250         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6251 
6252         TypeLocBuilder TypeArgBuilder;
6253         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6254 
6255         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6256                                                          PatternLoc);
6257         if (NewTypeArg.isNull())
6258           return QualType();
6259 
6260         NewTypeArgInfos.push_back(
6261           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6262       }
6263 
6264       continue;
6265     }
6266 
6267     TypeLocBuilder TypeArgBuilder;
6268     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6269     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6270     if (NewTypeArg.isNull())
6271       return QualType();
6272 
6273     // If nothing changed, just keep the old TypeSourceInfo.
6274     if (NewTypeArg == TypeArg) {
6275       NewTypeArgInfos.push_back(TypeArgInfo);
6276       continue;
6277     }
6278 
6279     NewTypeArgInfos.push_back(
6280       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6281     AnyChanged = true;
6282   }
6283 
6284   QualType Result = TL.getType();
6285   if (getDerived().AlwaysRebuild() || AnyChanged) {
6286     // Rebuild the type.
6287     Result = getDerived().RebuildObjCObjectType(
6288                BaseType,
6289                TL.getLocStart(),
6290                TL.getTypeArgsLAngleLoc(),
6291                NewTypeArgInfos,
6292                TL.getTypeArgsRAngleLoc(),
6293                TL.getProtocolLAngleLoc(),
6294                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6295                                   TL.getNumProtocols()),
6296                TL.getProtocolLocs(),
6297                TL.getProtocolRAngleLoc());
6298 
6299     if (Result.isNull())
6300       return QualType();
6301   }
6302 
6303   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6304   NewT.setHasBaseTypeAsWritten(true);
6305   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6306   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6307     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6308   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6309   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6310   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6311     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6312   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6313   return Result;
6314 }
6315 
6316 template<typename Derived>
6317 QualType
6318 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6319                                                ObjCObjectPointerTypeLoc TL) {
6320   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6321   if (PointeeType.isNull())
6322     return QualType();
6323 
6324   QualType Result = TL.getType();
6325   if (getDerived().AlwaysRebuild() ||
6326       PointeeType != TL.getPointeeLoc().getType()) {
6327     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6328                                                        TL.getStarLoc());
6329     if (Result.isNull())
6330       return QualType();
6331   }
6332 
6333   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6334   NewT.setStarLoc(TL.getStarLoc());
6335   return Result;
6336 }
6337 
6338 //===----------------------------------------------------------------------===//
6339 // Statement transformation
6340 //===----------------------------------------------------------------------===//
6341 template<typename Derived>
6342 StmtResult
6343 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6344   return S;
6345 }
6346 
6347 template<typename Derived>
6348 StmtResult
6349 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6350   return getDerived().TransformCompoundStmt(S, false);
6351 }
6352 
6353 template<typename Derived>
6354 StmtResult
6355 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6356                                               bool IsStmtExpr) {
6357   Sema::CompoundScopeRAII CompoundScope(getSema());
6358 
6359   bool SubStmtInvalid = false;
6360   bool SubStmtChanged = false;
6361   SmallVector<Stmt*, 8> Statements;
6362   for (auto *B : S->body()) {
6363     StmtResult Result = getDerived().TransformStmt(B);
6364     if (Result.isInvalid()) {
6365       // Immediately fail if this was a DeclStmt, since it's very
6366       // likely that this will cause problems for future statements.
6367       if (isa<DeclStmt>(B))
6368         return StmtError();
6369 
6370       // Otherwise, just keep processing substatements and fail later.
6371       SubStmtInvalid = true;
6372       continue;
6373     }
6374 
6375     SubStmtChanged = SubStmtChanged || Result.get() != B;
6376     Statements.push_back(Result.getAs<Stmt>());
6377   }
6378 
6379   if (SubStmtInvalid)
6380     return StmtError();
6381 
6382   if (!getDerived().AlwaysRebuild() &&
6383       !SubStmtChanged)
6384     return S;
6385 
6386   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6387                                           Statements,
6388                                           S->getRBracLoc(),
6389                                           IsStmtExpr);
6390 }
6391 
6392 template<typename Derived>
6393 StmtResult
6394 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6395   ExprResult LHS, RHS;
6396   {
6397     EnterExpressionEvaluationContext Unevaluated(
6398         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6399 
6400     // Transform the left-hand case value.
6401     LHS = getDerived().TransformExpr(S->getLHS());
6402     LHS = SemaRef.ActOnConstantExpression(LHS);
6403     if (LHS.isInvalid())
6404       return StmtError();
6405 
6406     // Transform the right-hand case value (for the GNU case-range extension).
6407     RHS = getDerived().TransformExpr(S->getRHS());
6408     RHS = SemaRef.ActOnConstantExpression(RHS);
6409     if (RHS.isInvalid())
6410       return StmtError();
6411   }
6412 
6413   // Build the case statement.
6414   // Case statements are always rebuilt so that they will attached to their
6415   // transformed switch statement.
6416   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6417                                                        LHS.get(),
6418                                                        S->getEllipsisLoc(),
6419                                                        RHS.get(),
6420                                                        S->getColonLoc());
6421   if (Case.isInvalid())
6422     return StmtError();
6423 
6424   // Transform the statement following the case
6425   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6426   if (SubStmt.isInvalid())
6427     return StmtError();
6428 
6429   // Attach the body to the case statement
6430   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6431 }
6432 
6433 template<typename Derived>
6434 StmtResult
6435 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6436   // Transform the statement following the default case
6437   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6438   if (SubStmt.isInvalid())
6439     return StmtError();
6440 
6441   // Default statements are always rebuilt
6442   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6443                                          SubStmt.get());
6444 }
6445 
6446 template<typename Derived>
6447 StmtResult
6448 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6449   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6450   if (SubStmt.isInvalid())
6451     return StmtError();
6452 
6453   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6454                                         S->getDecl());
6455   if (!LD)
6456     return StmtError();
6457 
6458 
6459   // FIXME: Pass the real colon location in.
6460   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6461                                        cast<LabelDecl>(LD), SourceLocation(),
6462                                        SubStmt.get());
6463 }
6464 
6465 template <typename Derived>
6466 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6467   if (!R)
6468     return R;
6469 
6470   switch (R->getKind()) {
6471 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6472 #define ATTR(X)
6473 #define PRAGMA_SPELLING_ATTR(X)                                                \
6474   case attr::X:                                                                \
6475     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6476 #include "clang/Basic/AttrList.inc"
6477   default:
6478     return R;
6479   }
6480 }
6481 
6482 template <typename Derived>
6483 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6484   bool AttrsChanged = false;
6485   SmallVector<const Attr *, 1> Attrs;
6486 
6487   // Visit attributes and keep track if any are transformed.
6488   for (const auto *I : S->getAttrs()) {
6489     const Attr *R = getDerived().TransformAttr(I);
6490     AttrsChanged |= (I != R);
6491     Attrs.push_back(R);
6492   }
6493 
6494   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6495   if (SubStmt.isInvalid())
6496     return StmtError();
6497 
6498   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6499     return S;
6500 
6501   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6502                                             SubStmt.get());
6503 }
6504 
6505 template<typename Derived>
6506 StmtResult
6507 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6508   // Transform the initialization statement
6509   StmtResult Init = getDerived().TransformStmt(S->getInit());
6510   if (Init.isInvalid())
6511     return StmtError();
6512 
6513   // Transform the condition
6514   Sema::ConditionResult Cond = getDerived().TransformCondition(
6515       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6516       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6517                        : Sema::ConditionKind::Boolean);
6518   if (Cond.isInvalid())
6519     return StmtError();
6520 
6521   // If this is a constexpr if, determine which arm we should instantiate.
6522   llvm::Optional<bool> ConstexprConditionValue;
6523   if (S->isConstexpr())
6524     ConstexprConditionValue = Cond.getKnownValue();
6525 
6526   // Transform the "then" branch.
6527   StmtResult Then;
6528   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6529     Then = getDerived().TransformStmt(S->getThen());
6530     if (Then.isInvalid())
6531       return StmtError();
6532   } else {
6533     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6534   }
6535 
6536   // Transform the "else" branch.
6537   StmtResult Else;
6538   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6539     Else = getDerived().TransformStmt(S->getElse());
6540     if (Else.isInvalid())
6541       return StmtError();
6542   }
6543 
6544   if (!getDerived().AlwaysRebuild() &&
6545       Init.get() == S->getInit() &&
6546       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6547       Then.get() == S->getThen() &&
6548       Else.get() == S->getElse())
6549     return S;
6550 
6551   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6552                                     Init.get(), Then.get(), S->getElseLoc(),
6553                                     Else.get());
6554 }
6555 
6556 template<typename Derived>
6557 StmtResult
6558 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6559   // Transform the initialization statement
6560   StmtResult Init = getDerived().TransformStmt(S->getInit());
6561   if (Init.isInvalid())
6562     return StmtError();
6563 
6564   // Transform the condition.
6565   Sema::ConditionResult Cond = getDerived().TransformCondition(
6566       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6567       Sema::ConditionKind::Switch);
6568   if (Cond.isInvalid())
6569     return StmtError();
6570 
6571   // Rebuild the switch statement.
6572   StmtResult Switch
6573     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(),
6574                                           S->getInit(), Cond);
6575   if (Switch.isInvalid())
6576     return StmtError();
6577 
6578   // Transform the body of the switch statement.
6579   StmtResult Body = getDerived().TransformStmt(S->getBody());
6580   if (Body.isInvalid())
6581     return StmtError();
6582 
6583   // Complete the switch statement.
6584   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6585                                             Body.get());
6586 }
6587 
6588 template<typename Derived>
6589 StmtResult
6590 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6591   // Transform the condition
6592   Sema::ConditionResult Cond = getDerived().TransformCondition(
6593       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6594       Sema::ConditionKind::Boolean);
6595   if (Cond.isInvalid())
6596     return StmtError();
6597 
6598   // Transform the body
6599   StmtResult Body = getDerived().TransformStmt(S->getBody());
6600   if (Body.isInvalid())
6601     return StmtError();
6602 
6603   if (!getDerived().AlwaysRebuild() &&
6604       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6605       Body.get() == S->getBody())
6606     return Owned(S);
6607 
6608   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6609 }
6610 
6611 template<typename Derived>
6612 StmtResult
6613 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6614   // Transform the body
6615   StmtResult Body = getDerived().TransformStmt(S->getBody());
6616   if (Body.isInvalid())
6617     return StmtError();
6618 
6619   // Transform the condition
6620   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6621   if (Cond.isInvalid())
6622     return StmtError();
6623 
6624   if (!getDerived().AlwaysRebuild() &&
6625       Cond.get() == S->getCond() &&
6626       Body.get() == S->getBody())
6627     return S;
6628 
6629   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6630                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6631                                     S->getRParenLoc());
6632 }
6633 
6634 template<typename Derived>
6635 StmtResult
6636 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6637   // Transform the initialization statement
6638   StmtResult Init = getDerived().TransformStmt(S->getInit());
6639   if (Init.isInvalid())
6640     return StmtError();
6641 
6642   // In OpenMP loop region loop control variable must be captured and be
6643   // private. Perform analysis of first part (if any).
6644   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6645     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6646 
6647   // Transform the condition
6648   Sema::ConditionResult Cond = getDerived().TransformCondition(
6649       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6650       Sema::ConditionKind::Boolean);
6651   if (Cond.isInvalid())
6652     return StmtError();
6653 
6654   // Transform the increment
6655   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6656   if (Inc.isInvalid())
6657     return StmtError();
6658 
6659   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6660   if (S->getInc() && !FullInc.get())
6661     return StmtError();
6662 
6663   // Transform the body
6664   StmtResult Body = getDerived().TransformStmt(S->getBody());
6665   if (Body.isInvalid())
6666     return StmtError();
6667 
6668   if (!getDerived().AlwaysRebuild() &&
6669       Init.get() == S->getInit() &&
6670       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6671       Inc.get() == S->getInc() &&
6672       Body.get() == S->getBody())
6673     return S;
6674 
6675   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6676                                      Init.get(), Cond, FullInc,
6677                                      S->getRParenLoc(), Body.get());
6678 }
6679 
6680 template<typename Derived>
6681 StmtResult
6682 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6683   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6684                                         S->getLabel());
6685   if (!LD)
6686     return StmtError();
6687 
6688   // Goto statements must always be rebuilt, to resolve the label.
6689   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6690                                       cast<LabelDecl>(LD));
6691 }
6692 
6693 template<typename Derived>
6694 StmtResult
6695 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6696   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6697   if (Target.isInvalid())
6698     return StmtError();
6699   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6700 
6701   if (!getDerived().AlwaysRebuild() &&
6702       Target.get() == S->getTarget())
6703     return S;
6704 
6705   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6706                                               Target.get());
6707 }
6708 
6709 template<typename Derived>
6710 StmtResult
6711 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6712   return S;
6713 }
6714 
6715 template<typename Derived>
6716 StmtResult
6717 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6718   return S;
6719 }
6720 
6721 template<typename Derived>
6722 StmtResult
6723 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6724   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6725                                                         /*NotCopyInit*/false);
6726   if (Result.isInvalid())
6727     return StmtError();
6728 
6729   // FIXME: We always rebuild the return statement because there is no way
6730   // to tell whether the return type of the function has changed.
6731   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6732 }
6733 
6734 template<typename Derived>
6735 StmtResult
6736 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6737   bool DeclChanged = false;
6738   SmallVector<Decl *, 4> Decls;
6739   for (auto *D : S->decls()) {
6740     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6741     if (!Transformed)
6742       return StmtError();
6743 
6744     if (Transformed != D)
6745       DeclChanged = true;
6746 
6747     Decls.push_back(Transformed);
6748   }
6749 
6750   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6751     return S;
6752 
6753   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6754 }
6755 
6756 template<typename Derived>
6757 StmtResult
6758 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6759 
6760   SmallVector<Expr*, 8> Constraints;
6761   SmallVector<Expr*, 8> Exprs;
6762   SmallVector<IdentifierInfo *, 4> Names;
6763 
6764   ExprResult AsmString;
6765   SmallVector<Expr*, 8> Clobbers;
6766 
6767   bool ExprsChanged = false;
6768 
6769   // Go through the outputs.
6770   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6771     Names.push_back(S->getOutputIdentifier(I));
6772 
6773     // No need to transform the constraint literal.
6774     Constraints.push_back(S->getOutputConstraintLiteral(I));
6775 
6776     // Transform the output expr.
6777     Expr *OutputExpr = S->getOutputExpr(I);
6778     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6779     if (Result.isInvalid())
6780       return StmtError();
6781 
6782     ExprsChanged |= Result.get() != OutputExpr;
6783 
6784     Exprs.push_back(Result.get());
6785   }
6786 
6787   // Go through the inputs.
6788   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6789     Names.push_back(S->getInputIdentifier(I));
6790 
6791     // No need to transform the constraint literal.
6792     Constraints.push_back(S->getInputConstraintLiteral(I));
6793 
6794     // Transform the input expr.
6795     Expr *InputExpr = S->getInputExpr(I);
6796     ExprResult Result = getDerived().TransformExpr(InputExpr);
6797     if (Result.isInvalid())
6798       return StmtError();
6799 
6800     ExprsChanged |= Result.get() != InputExpr;
6801 
6802     Exprs.push_back(Result.get());
6803   }
6804 
6805   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6806     return S;
6807 
6808   // Go through the clobbers.
6809   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6810     Clobbers.push_back(S->getClobberStringLiteral(I));
6811 
6812   // No need to transform the asm string literal.
6813   AsmString = S->getAsmString();
6814   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6815                                         S->isVolatile(), S->getNumOutputs(),
6816                                         S->getNumInputs(), Names.data(),
6817                                         Constraints, Exprs, AsmString.get(),
6818                                         Clobbers, S->getRParenLoc());
6819 }
6820 
6821 template<typename Derived>
6822 StmtResult
6823 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6824   ArrayRef<Token> AsmToks =
6825     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6826 
6827   bool HadError = false, HadChange = false;
6828 
6829   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6830   SmallVector<Expr*, 8> TransformedExprs;
6831   TransformedExprs.reserve(SrcExprs.size());
6832   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6833     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6834     if (!Result.isUsable()) {
6835       HadError = true;
6836     } else {
6837       HadChange |= (Result.get() != SrcExprs[i]);
6838       TransformedExprs.push_back(Result.get());
6839     }
6840   }
6841 
6842   if (HadError) return StmtError();
6843   if (!HadChange && !getDerived().AlwaysRebuild())
6844     return Owned(S);
6845 
6846   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6847                                        AsmToks, S->getAsmString(),
6848                                        S->getNumOutputs(), S->getNumInputs(),
6849                                        S->getAllConstraints(), S->getClobbers(),
6850                                        TransformedExprs, S->getEndLoc());
6851 }
6852 
6853 // C++ Coroutines TS
6854 
6855 template<typename Derived>
6856 StmtResult
6857 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6858   auto *ScopeInfo = SemaRef.getCurFunction();
6859   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
6860   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
6861          ScopeInfo->NeedsCoroutineSuspends &&
6862          ScopeInfo->CoroutineSuspends.first == nullptr &&
6863          ScopeInfo->CoroutineSuspends.second == nullptr &&
6864          "expected clean scope info");
6865 
6866   // Set that we have (possibly-invalid) suspend points before we do anything
6867   // that may fail.
6868   ScopeInfo->setNeedsCoroutineSuspends(false);
6869 
6870   // The new CoroutinePromise object needs to be built and put into the current
6871   // FunctionScopeInfo before any transformations or rebuilding occurs.
6872   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
6873   if (!Promise)
6874     return StmtError();
6875   getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise);
6876   ScopeInfo->CoroutinePromise = Promise;
6877 
6878   // Transform the implicit coroutine statements we built during the initial
6879   // parse.
6880   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
6881   if (InitSuspend.isInvalid())
6882     return StmtError();
6883   StmtResult FinalSuspend =
6884       getDerived().TransformStmt(S->getFinalSuspendStmt());
6885   if (FinalSuspend.isInvalid())
6886     return StmtError();
6887   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
6888   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
6889 
6890   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
6891   if (BodyRes.isInvalid())
6892     return StmtError();
6893 
6894   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
6895   if (Builder.isInvalid())
6896     return StmtError();
6897 
6898   Expr *ReturnObject = S->getReturnValueInit();
6899   assert(ReturnObject && "the return object is expected to be valid");
6900   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
6901                                                      /*NoCopyInit*/ false);
6902   if (Res.isInvalid())
6903     return StmtError();
6904   Builder.ReturnValue = Res.get();
6905 
6906   if (S->hasDependentPromiseType()) {
6907     assert(!Promise->getType()->isDependentType() &&
6908            "the promise type must no longer be dependent");
6909     assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
6910            !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
6911            "these nodes should not have been built yet");
6912     if (!Builder.buildDependentStatements())
6913       return StmtError();
6914   } else {
6915     if (auto *OnFallthrough = S->getFallthroughHandler()) {
6916       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
6917       if (Res.isInvalid())
6918         return StmtError();
6919       Builder.OnFallthrough = Res.get();
6920     }
6921 
6922     if (auto *OnException = S->getExceptionHandler()) {
6923       StmtResult Res = getDerived().TransformStmt(OnException);
6924       if (Res.isInvalid())
6925         return StmtError();
6926       Builder.OnException = Res.get();
6927     }
6928 
6929     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
6930       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
6931       if (Res.isInvalid())
6932         return StmtError();
6933       Builder.ReturnStmtOnAllocFailure = Res.get();
6934     }
6935 
6936     // Transform any additional statements we may have already built
6937     assert(S->getAllocate() && S->getDeallocate() &&
6938            "allocation and deallocation calls must already be built");
6939     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
6940     if (AllocRes.isInvalid())
6941       return StmtError();
6942     Builder.Allocate = AllocRes.get();
6943 
6944     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
6945     if (DeallocRes.isInvalid())
6946       return StmtError();
6947     Builder.Deallocate = DeallocRes.get();
6948   }
6949 
6950   return getDerived().RebuildCoroutineBodyStmt(Builder);
6951 }
6952 
6953 template<typename Derived>
6954 StmtResult
6955 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
6956   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
6957                                                         /*NotCopyInit*/false);
6958   if (Result.isInvalid())
6959     return StmtError();
6960 
6961   // Always rebuild; we don't know if this needs to be injected into a new
6962   // context or if the promise type has changed.
6963   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
6964                                           S->isImplicit());
6965 }
6966 
6967 template<typename Derived>
6968 ExprResult
6969 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
6970   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6971                                                         /*NotCopyInit*/false);
6972   if (Result.isInvalid())
6973     return ExprError();
6974 
6975   // Always rebuild; we don't know if this needs to be injected into a new
6976   // context or if the promise type has changed.
6977   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
6978                                          E->isImplicit());
6979 }
6980 
6981 template <typename Derived>
6982 ExprResult
6983 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
6984   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
6985                                                         /*NotCopyInit*/ false);
6986   if (OperandResult.isInvalid())
6987     return ExprError();
6988 
6989   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
6990           E->getOperatorCoawaitLookup());
6991 
6992   if (LookupResult.isInvalid())
6993     return ExprError();
6994 
6995   // Always rebuild; we don't know if this needs to be injected into a new
6996   // context or if the promise type has changed.
6997   return getDerived().RebuildDependentCoawaitExpr(
6998       E->getKeywordLoc(), OperandResult.get(),
6999       cast<UnresolvedLookupExpr>(LookupResult.get()));
7000 }
7001 
7002 template<typename Derived>
7003 ExprResult
7004 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7005   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7006                                                         /*NotCopyInit*/false);
7007   if (Result.isInvalid())
7008     return ExprError();
7009 
7010   // Always rebuild; we don't know if this needs to be injected into a new
7011   // context or if the promise type has changed.
7012   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7013 }
7014 
7015 // Objective-C Statements.
7016 
7017 template<typename Derived>
7018 StmtResult
7019 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7020   // Transform the body of the @try.
7021   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7022   if (TryBody.isInvalid())
7023     return StmtError();
7024 
7025   // Transform the @catch statements (if present).
7026   bool AnyCatchChanged = false;
7027   SmallVector<Stmt*, 8> CatchStmts;
7028   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7029     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7030     if (Catch.isInvalid())
7031       return StmtError();
7032     if (Catch.get() != S->getCatchStmt(I))
7033       AnyCatchChanged = true;
7034     CatchStmts.push_back(Catch.get());
7035   }
7036 
7037   // Transform the @finally statement (if present).
7038   StmtResult Finally;
7039   if (S->getFinallyStmt()) {
7040     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7041     if (Finally.isInvalid())
7042       return StmtError();
7043   }
7044 
7045   // If nothing changed, just retain this statement.
7046   if (!getDerived().AlwaysRebuild() &&
7047       TryBody.get() == S->getTryBody() &&
7048       !AnyCatchChanged &&
7049       Finally.get() == S->getFinallyStmt())
7050     return S;
7051 
7052   // Build a new statement.
7053   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7054                                            CatchStmts, Finally.get());
7055 }
7056 
7057 template<typename Derived>
7058 StmtResult
7059 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7060   // Transform the @catch parameter, if there is one.
7061   VarDecl *Var = nullptr;
7062   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7063     TypeSourceInfo *TSInfo = nullptr;
7064     if (FromVar->getTypeSourceInfo()) {
7065       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7066       if (!TSInfo)
7067         return StmtError();
7068     }
7069 
7070     QualType T;
7071     if (TSInfo)
7072       T = TSInfo->getType();
7073     else {
7074       T = getDerived().TransformType(FromVar->getType());
7075       if (T.isNull())
7076         return StmtError();
7077     }
7078 
7079     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7080     if (!Var)
7081       return StmtError();
7082   }
7083 
7084   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7085   if (Body.isInvalid())
7086     return StmtError();
7087 
7088   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7089                                              S->getRParenLoc(),
7090                                              Var, Body.get());
7091 }
7092 
7093 template<typename Derived>
7094 StmtResult
7095 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7096   // Transform the body.
7097   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7098   if (Body.isInvalid())
7099     return StmtError();
7100 
7101   // If nothing changed, just retain this statement.
7102   if (!getDerived().AlwaysRebuild() &&
7103       Body.get() == S->getFinallyBody())
7104     return S;
7105 
7106   // Build a new statement.
7107   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7108                                                Body.get());
7109 }
7110 
7111 template<typename Derived>
7112 StmtResult
7113 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7114   ExprResult Operand;
7115   if (S->getThrowExpr()) {
7116     Operand = getDerived().TransformExpr(S->getThrowExpr());
7117     if (Operand.isInvalid())
7118       return StmtError();
7119   }
7120 
7121   if (!getDerived().AlwaysRebuild() &&
7122       Operand.get() == S->getThrowExpr())
7123     return S;
7124 
7125   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7126 }
7127 
7128 template<typename Derived>
7129 StmtResult
7130 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7131                                                   ObjCAtSynchronizedStmt *S) {
7132   // Transform the object we are locking.
7133   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7134   if (Object.isInvalid())
7135     return StmtError();
7136   Object =
7137     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7138                                                   Object.get());
7139   if (Object.isInvalid())
7140     return StmtError();
7141 
7142   // Transform the body.
7143   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7144   if (Body.isInvalid())
7145     return StmtError();
7146 
7147   // If nothing change, just retain the current statement.
7148   if (!getDerived().AlwaysRebuild() &&
7149       Object.get() == S->getSynchExpr() &&
7150       Body.get() == S->getSynchBody())
7151     return S;
7152 
7153   // Build a new statement.
7154   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7155                                                     Object.get(), Body.get());
7156 }
7157 
7158 template<typename Derived>
7159 StmtResult
7160 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7161                                               ObjCAutoreleasePoolStmt *S) {
7162   // Transform the body.
7163   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7164   if (Body.isInvalid())
7165     return StmtError();
7166 
7167   // If nothing changed, just retain this statement.
7168   if (!getDerived().AlwaysRebuild() &&
7169       Body.get() == S->getSubStmt())
7170     return S;
7171 
7172   // Build a new statement.
7173   return getDerived().RebuildObjCAutoreleasePoolStmt(
7174                         S->getAtLoc(), Body.get());
7175 }
7176 
7177 template<typename Derived>
7178 StmtResult
7179 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7180                                                   ObjCForCollectionStmt *S) {
7181   // Transform the element statement.
7182   StmtResult Element = getDerived().TransformStmt(S->getElement());
7183   if (Element.isInvalid())
7184     return StmtError();
7185 
7186   // Transform the collection expression.
7187   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7188   if (Collection.isInvalid())
7189     return StmtError();
7190 
7191   // Transform the body.
7192   StmtResult Body = getDerived().TransformStmt(S->getBody());
7193   if (Body.isInvalid())
7194     return StmtError();
7195 
7196   // If nothing changed, just retain this statement.
7197   if (!getDerived().AlwaysRebuild() &&
7198       Element.get() == S->getElement() &&
7199       Collection.get() == S->getCollection() &&
7200       Body.get() == S->getBody())
7201     return S;
7202 
7203   // Build a new statement.
7204   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7205                                                    Element.get(),
7206                                                    Collection.get(),
7207                                                    S->getRParenLoc(),
7208                                                    Body.get());
7209 }
7210 
7211 template <typename Derived>
7212 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7213   // Transform the exception declaration, if any.
7214   VarDecl *Var = nullptr;
7215   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7216     TypeSourceInfo *T =
7217         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7218     if (!T)
7219       return StmtError();
7220 
7221     Var = getDerived().RebuildExceptionDecl(
7222         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7223         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7224     if (!Var || Var->isInvalidDecl())
7225       return StmtError();
7226   }
7227 
7228   // Transform the actual exception handler.
7229   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7230   if (Handler.isInvalid())
7231     return StmtError();
7232 
7233   if (!getDerived().AlwaysRebuild() && !Var &&
7234       Handler.get() == S->getHandlerBlock())
7235     return S;
7236 
7237   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7238 }
7239 
7240 template <typename Derived>
7241 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7242   // Transform the try block itself.
7243   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7244   if (TryBlock.isInvalid())
7245     return StmtError();
7246 
7247   // Transform the handlers.
7248   bool HandlerChanged = false;
7249   SmallVector<Stmt *, 8> Handlers;
7250   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7251     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7252     if (Handler.isInvalid())
7253       return StmtError();
7254 
7255     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7256     Handlers.push_back(Handler.getAs<Stmt>());
7257   }
7258 
7259   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7260       !HandlerChanged)
7261     return S;
7262 
7263   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7264                                         Handlers);
7265 }
7266 
7267 template<typename Derived>
7268 StmtResult
7269 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7270   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7271   if (Range.isInvalid())
7272     return StmtError();
7273 
7274   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7275   if (Begin.isInvalid())
7276     return StmtError();
7277   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7278   if (End.isInvalid())
7279     return StmtError();
7280 
7281   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7282   if (Cond.isInvalid())
7283     return StmtError();
7284   if (Cond.get())
7285     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7286   if (Cond.isInvalid())
7287     return StmtError();
7288   if (Cond.get())
7289     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7290 
7291   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7292   if (Inc.isInvalid())
7293     return StmtError();
7294   if (Inc.get())
7295     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7296 
7297   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7298   if (LoopVar.isInvalid())
7299     return StmtError();
7300 
7301   StmtResult NewStmt = S;
7302   if (getDerived().AlwaysRebuild() ||
7303       Range.get() != S->getRangeStmt() ||
7304       Begin.get() != S->getBeginStmt() ||
7305       End.get() != S->getEndStmt() ||
7306       Cond.get() != S->getCond() ||
7307       Inc.get() != S->getInc() ||
7308       LoopVar.get() != S->getLoopVarStmt()) {
7309     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7310                                                   S->getCoawaitLoc(),
7311                                                   S->getColonLoc(), Range.get(),
7312                                                   Begin.get(), End.get(),
7313                                                   Cond.get(),
7314                                                   Inc.get(), LoopVar.get(),
7315                                                   S->getRParenLoc());
7316     if (NewStmt.isInvalid())
7317       return StmtError();
7318   }
7319 
7320   StmtResult Body = getDerived().TransformStmt(S->getBody());
7321   if (Body.isInvalid())
7322     return StmtError();
7323 
7324   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7325   // it now so we have a new statement to attach the body to.
7326   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7327     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7328                                                   S->getCoawaitLoc(),
7329                                                   S->getColonLoc(), Range.get(),
7330                                                   Begin.get(), End.get(),
7331                                                   Cond.get(),
7332                                                   Inc.get(), LoopVar.get(),
7333                                                   S->getRParenLoc());
7334     if (NewStmt.isInvalid())
7335       return StmtError();
7336   }
7337 
7338   if (NewStmt.get() == S)
7339     return S;
7340 
7341   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7342 }
7343 
7344 template<typename Derived>
7345 StmtResult
7346 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7347                                                     MSDependentExistsStmt *S) {
7348   // Transform the nested-name-specifier, if any.
7349   NestedNameSpecifierLoc QualifierLoc;
7350   if (S->getQualifierLoc()) {
7351     QualifierLoc
7352       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7353     if (!QualifierLoc)
7354       return StmtError();
7355   }
7356 
7357   // Transform the declaration name.
7358   DeclarationNameInfo NameInfo = S->getNameInfo();
7359   if (NameInfo.getName()) {
7360     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7361     if (!NameInfo.getName())
7362       return StmtError();
7363   }
7364 
7365   // Check whether anything changed.
7366   if (!getDerived().AlwaysRebuild() &&
7367       QualifierLoc == S->getQualifierLoc() &&
7368       NameInfo.getName() == S->getNameInfo().getName())
7369     return S;
7370 
7371   // Determine whether this name exists, if we can.
7372   CXXScopeSpec SS;
7373   SS.Adopt(QualifierLoc);
7374   bool Dependent = false;
7375   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7376   case Sema::IER_Exists:
7377     if (S->isIfExists())
7378       break;
7379 
7380     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7381 
7382   case Sema::IER_DoesNotExist:
7383     if (S->isIfNotExists())
7384       break;
7385 
7386     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7387 
7388   case Sema::IER_Dependent:
7389     Dependent = true;
7390     break;
7391 
7392   case Sema::IER_Error:
7393     return StmtError();
7394   }
7395 
7396   // We need to continue with the instantiation, so do so now.
7397   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7398   if (SubStmt.isInvalid())
7399     return StmtError();
7400 
7401   // If we have resolved the name, just transform to the substatement.
7402   if (!Dependent)
7403     return SubStmt;
7404 
7405   // The name is still dependent, so build a dependent expression again.
7406   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7407                                                    S->isIfExists(),
7408                                                    QualifierLoc,
7409                                                    NameInfo,
7410                                                    SubStmt.get());
7411 }
7412 
7413 template<typename Derived>
7414 ExprResult
7415 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7416   NestedNameSpecifierLoc QualifierLoc;
7417   if (E->getQualifierLoc()) {
7418     QualifierLoc
7419     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7420     if (!QualifierLoc)
7421       return ExprError();
7422   }
7423 
7424   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7425     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7426   if (!PD)
7427     return ExprError();
7428 
7429   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7430   if (Base.isInvalid())
7431     return ExprError();
7432 
7433   return new (SemaRef.getASTContext())
7434       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7435                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7436                         QualifierLoc, E->getMemberLoc());
7437 }
7438 
7439 template <typename Derived>
7440 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7441     MSPropertySubscriptExpr *E) {
7442   auto BaseRes = getDerived().TransformExpr(E->getBase());
7443   if (BaseRes.isInvalid())
7444     return ExprError();
7445   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7446   if (IdxRes.isInvalid())
7447     return ExprError();
7448 
7449   if (!getDerived().AlwaysRebuild() &&
7450       BaseRes.get() == E->getBase() &&
7451       IdxRes.get() == E->getIdx())
7452     return E;
7453 
7454   return getDerived().RebuildArraySubscriptExpr(
7455       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7456 }
7457 
7458 template <typename Derived>
7459 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7460   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7461   if (TryBlock.isInvalid())
7462     return StmtError();
7463 
7464   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7465   if (Handler.isInvalid())
7466     return StmtError();
7467 
7468   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7469       Handler.get() == S->getHandler())
7470     return S;
7471 
7472   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7473                                         TryBlock.get(), Handler.get());
7474 }
7475 
7476 template <typename Derived>
7477 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7478   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7479   if (Block.isInvalid())
7480     return StmtError();
7481 
7482   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7483 }
7484 
7485 template <typename Derived>
7486 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7487   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7488   if (FilterExpr.isInvalid())
7489     return StmtError();
7490 
7491   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7492   if (Block.isInvalid())
7493     return StmtError();
7494 
7495   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7496                                            Block.get());
7497 }
7498 
7499 template <typename Derived>
7500 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7501   if (isa<SEHFinallyStmt>(Handler))
7502     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7503   else
7504     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7505 }
7506 
7507 template<typename Derived>
7508 StmtResult
7509 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7510   return S;
7511 }
7512 
7513 //===----------------------------------------------------------------------===//
7514 // OpenMP directive transformation
7515 //===----------------------------------------------------------------------===//
7516 template <typename Derived>
7517 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7518     OMPExecutableDirective *D) {
7519 
7520   // Transform the clauses
7521   llvm::SmallVector<OMPClause *, 16> TClauses;
7522   ArrayRef<OMPClause *> Clauses = D->clauses();
7523   TClauses.reserve(Clauses.size());
7524   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7525        I != E; ++I) {
7526     if (*I) {
7527       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7528       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7529       getDerived().getSema().EndOpenMPClause();
7530       if (Clause)
7531         TClauses.push_back(Clause);
7532     } else {
7533       TClauses.push_back(nullptr);
7534     }
7535   }
7536   StmtResult AssociatedStmt;
7537   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7538     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7539                                                   /*CurScope=*/nullptr);
7540     StmtResult Body;
7541     {
7542       Sema::CompoundScopeRAII CompoundScope(getSema());
7543       int ThisCaptureLevel =
7544           Sema::getOpenMPCaptureLevels(D->getDirectiveKind());
7545       Stmt *CS = D->getAssociatedStmt();
7546       while (--ThisCaptureLevel >= 0)
7547         CS = cast<CapturedStmt>(CS)->getCapturedStmt();
7548       Body = getDerived().TransformStmt(CS);
7549     }
7550     AssociatedStmt =
7551         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7552     if (AssociatedStmt.isInvalid()) {
7553       return StmtError();
7554     }
7555   }
7556   if (TClauses.size() != Clauses.size()) {
7557     return StmtError();
7558   }
7559 
7560   // Transform directive name for 'omp critical' directive.
7561   DeclarationNameInfo DirName;
7562   if (D->getDirectiveKind() == OMPD_critical) {
7563     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7564     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7565   }
7566   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7567   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7568     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7569   } else if (D->getDirectiveKind() == OMPD_cancel) {
7570     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7571   }
7572 
7573   return getDerived().RebuildOMPExecutableDirective(
7574       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7575       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7576 }
7577 
7578 template <typename Derived>
7579 StmtResult
7580 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7581   DeclarationNameInfo DirName;
7582   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7583                                              D->getLocStart());
7584   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7585   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7586   return Res;
7587 }
7588 
7589 template <typename Derived>
7590 StmtResult
7591 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7592   DeclarationNameInfo DirName;
7593   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7594                                              D->getLocStart());
7595   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7596   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7597   return Res;
7598 }
7599 
7600 template <typename Derived>
7601 StmtResult
7602 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7603   DeclarationNameInfo DirName;
7604   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7605                                              D->getLocStart());
7606   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7607   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7608   return Res;
7609 }
7610 
7611 template <typename Derived>
7612 StmtResult
7613 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7614   DeclarationNameInfo DirName;
7615   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7616                                              D->getLocStart());
7617   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7618   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7619   return Res;
7620 }
7621 
7622 template <typename Derived>
7623 StmtResult
7624 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7625   DeclarationNameInfo DirName;
7626   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7627                                              D->getLocStart());
7628   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7629   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7630   return Res;
7631 }
7632 
7633 template <typename Derived>
7634 StmtResult
7635 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7636   DeclarationNameInfo DirName;
7637   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7638                                              D->getLocStart());
7639   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7640   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7641   return Res;
7642 }
7643 
7644 template <typename Derived>
7645 StmtResult
7646 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7647   DeclarationNameInfo DirName;
7648   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7649                                              D->getLocStart());
7650   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7651   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7652   return Res;
7653 }
7654 
7655 template <typename Derived>
7656 StmtResult
7657 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7658   DeclarationNameInfo DirName;
7659   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7660                                              D->getLocStart());
7661   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7662   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7663   return Res;
7664 }
7665 
7666 template <typename Derived>
7667 StmtResult
7668 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7669   getDerived().getSema().StartOpenMPDSABlock(
7670       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7671   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7672   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7673   return Res;
7674 }
7675 
7676 template <typename Derived>
7677 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7678     OMPParallelForDirective *D) {
7679   DeclarationNameInfo DirName;
7680   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7681                                              nullptr, D->getLocStart());
7682   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7683   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7684   return Res;
7685 }
7686 
7687 template <typename Derived>
7688 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7689     OMPParallelForSimdDirective *D) {
7690   DeclarationNameInfo DirName;
7691   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7692                                              nullptr, D->getLocStart());
7693   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7694   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7695   return Res;
7696 }
7697 
7698 template <typename Derived>
7699 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7700     OMPParallelSectionsDirective *D) {
7701   DeclarationNameInfo DirName;
7702   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7703                                              nullptr, D->getLocStart());
7704   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7705   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7706   return Res;
7707 }
7708 
7709 template <typename Derived>
7710 StmtResult
7711 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7712   DeclarationNameInfo DirName;
7713   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7714                                              D->getLocStart());
7715   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7716   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7717   return Res;
7718 }
7719 
7720 template <typename Derived>
7721 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7722     OMPTaskyieldDirective *D) {
7723   DeclarationNameInfo DirName;
7724   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7725                                              D->getLocStart());
7726   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7727   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7728   return Res;
7729 }
7730 
7731 template <typename Derived>
7732 StmtResult
7733 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7734   DeclarationNameInfo DirName;
7735   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7736                                              D->getLocStart());
7737   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7738   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7739   return Res;
7740 }
7741 
7742 template <typename Derived>
7743 StmtResult
7744 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7745   DeclarationNameInfo DirName;
7746   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7747                                              D->getLocStart());
7748   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7749   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7750   return Res;
7751 }
7752 
7753 template <typename Derived>
7754 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7755     OMPTaskgroupDirective *D) {
7756   DeclarationNameInfo DirName;
7757   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7758                                              D->getLocStart());
7759   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7760   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7761   return Res;
7762 }
7763 
7764 template <typename Derived>
7765 StmtResult
7766 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7767   DeclarationNameInfo DirName;
7768   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7769                                              D->getLocStart());
7770   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7771   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7772   return Res;
7773 }
7774 
7775 template <typename Derived>
7776 StmtResult
7777 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7778   DeclarationNameInfo DirName;
7779   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7780                                              D->getLocStart());
7781   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7782   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7783   return Res;
7784 }
7785 
7786 template <typename Derived>
7787 StmtResult
7788 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7789   DeclarationNameInfo DirName;
7790   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7791                                              D->getLocStart());
7792   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7793   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7794   return Res;
7795 }
7796 
7797 template <typename Derived>
7798 StmtResult
7799 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7800   DeclarationNameInfo DirName;
7801   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7802                                              D->getLocStart());
7803   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7804   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7805   return Res;
7806 }
7807 
7808 template <typename Derived>
7809 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7810     OMPTargetDataDirective *D) {
7811   DeclarationNameInfo DirName;
7812   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7813                                              D->getLocStart());
7814   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7815   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7816   return Res;
7817 }
7818 
7819 template <typename Derived>
7820 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7821     OMPTargetEnterDataDirective *D) {
7822   DeclarationNameInfo DirName;
7823   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7824                                              nullptr, D->getLocStart());
7825   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7826   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7827   return Res;
7828 }
7829 
7830 template <typename Derived>
7831 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7832     OMPTargetExitDataDirective *D) {
7833   DeclarationNameInfo DirName;
7834   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7835                                              nullptr, D->getLocStart());
7836   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7837   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7838   return Res;
7839 }
7840 
7841 template <typename Derived>
7842 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7843     OMPTargetParallelDirective *D) {
7844   DeclarationNameInfo DirName;
7845   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7846                                              nullptr, D->getLocStart());
7847   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7848   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7849   return Res;
7850 }
7851 
7852 template <typename Derived>
7853 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7854     OMPTargetParallelForDirective *D) {
7855   DeclarationNameInfo DirName;
7856   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7857                                              nullptr, D->getLocStart());
7858   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7859   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7860   return Res;
7861 }
7862 
7863 template <typename Derived>
7864 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7865     OMPTargetUpdateDirective *D) {
7866   DeclarationNameInfo DirName;
7867   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7868                                              nullptr, D->getLocStart());
7869   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7870   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7871   return Res;
7872 }
7873 
7874 template <typename Derived>
7875 StmtResult
7876 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7877   DeclarationNameInfo DirName;
7878   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7879                                              D->getLocStart());
7880   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7881   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7882   return Res;
7883 }
7884 
7885 template <typename Derived>
7886 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7887     OMPCancellationPointDirective *D) {
7888   DeclarationNameInfo DirName;
7889   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7890                                              nullptr, D->getLocStart());
7891   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7892   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7893   return Res;
7894 }
7895 
7896 template <typename Derived>
7897 StmtResult
7898 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7899   DeclarationNameInfo DirName;
7900   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7901                                              D->getLocStart());
7902   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7903   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7904   return Res;
7905 }
7906 
7907 template <typename Derived>
7908 StmtResult
7909 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7910   DeclarationNameInfo DirName;
7911   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7912                                              D->getLocStart());
7913   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7914   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7915   return Res;
7916 }
7917 
7918 template <typename Derived>
7919 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
7920     OMPTaskLoopSimdDirective *D) {
7921   DeclarationNameInfo DirName;
7922   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
7923                                              nullptr, D->getLocStart());
7924   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7925   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7926   return Res;
7927 }
7928 
7929 template <typename Derived>
7930 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
7931     OMPDistributeDirective *D) {
7932   DeclarationNameInfo DirName;
7933   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
7934                                              D->getLocStart());
7935   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7936   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7937   return Res;
7938 }
7939 
7940 template <typename Derived>
7941 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
7942     OMPDistributeParallelForDirective *D) {
7943   DeclarationNameInfo DirName;
7944   getDerived().getSema().StartOpenMPDSABlock(
7945       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
7946   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7947   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7948   return Res;
7949 }
7950 
7951 template <typename Derived>
7952 StmtResult
7953 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
7954     OMPDistributeParallelForSimdDirective *D) {
7955   DeclarationNameInfo DirName;
7956   getDerived().getSema().StartOpenMPDSABlock(
7957       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7958   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7959   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7960   return Res;
7961 }
7962 
7963 template <typename Derived>
7964 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
7965     OMPDistributeSimdDirective *D) {
7966   DeclarationNameInfo DirName;
7967   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
7968                                              nullptr, D->getLocStart());
7969   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7970   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7971   return Res;
7972 }
7973 
7974 template <typename Derived>
7975 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
7976     OMPTargetParallelForSimdDirective *D) {
7977   DeclarationNameInfo DirName;
7978   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
7979                                              DirName, nullptr,
7980                                              D->getLocStart());
7981   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7982   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7983   return Res;
7984 }
7985 
7986 template <typename Derived>
7987 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
7988     OMPTargetSimdDirective *D) {
7989   DeclarationNameInfo DirName;
7990   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
7991                                              D->getLocStart());
7992   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7993   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7994   return Res;
7995 }
7996 
7997 template <typename Derived>
7998 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
7999     OMPTeamsDistributeDirective *D) {
8000   DeclarationNameInfo DirName;
8001   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8002                                              nullptr, D->getLocStart());
8003   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8004   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8005   return Res;
8006 }
8007 
8008 template <typename Derived>
8009 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8010     OMPTeamsDistributeSimdDirective *D) {
8011   DeclarationNameInfo DirName;
8012   getDerived().getSema().StartOpenMPDSABlock(
8013       OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8014   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8015   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8016   return Res;
8017 }
8018 
8019 template <typename Derived>
8020 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8021     OMPTeamsDistributeParallelForSimdDirective *D) {
8022   DeclarationNameInfo DirName;
8023   getDerived().getSema().StartOpenMPDSABlock(
8024       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
8025   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8026   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8027   return Res;
8028 }
8029 
8030 template <typename Derived>
8031 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8032     OMPTeamsDistributeParallelForDirective *D) {
8033   DeclarationNameInfo DirName;
8034   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for,
8035       DirName, nullptr, D->getLocStart());
8036   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8037   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8038   return Res;
8039 }
8040 
8041 template <typename Derived>
8042 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8043     OMPTargetTeamsDirective *D) {
8044   DeclarationNameInfo DirName;
8045   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8046                                              nullptr, D->getLocStart());
8047   auto Res = getDerived().TransformOMPExecutableDirective(D);
8048   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8049   return Res;
8050 }
8051 
8052 template <typename Derived>
8053 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8054     OMPTargetTeamsDistributeDirective *D) {
8055   DeclarationNameInfo DirName;
8056   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute,
8057       DirName, nullptr, D->getLocStart());
8058   auto Res = getDerived().TransformOMPExecutableDirective(D);
8059   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8060   return Res;
8061 }
8062 
8063 template <typename Derived>
8064 StmtResult
8065 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8066     OMPTargetTeamsDistributeParallelForDirective *D) {
8067   DeclarationNameInfo DirName;
8068   getDerived().getSema().StartOpenMPDSABlock(
8069       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8070       D->getLocStart());
8071   auto Res = getDerived().TransformOMPExecutableDirective(D);
8072   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8073   return Res;
8074 }
8075 
8076 template <typename Derived>
8077 StmtResult TreeTransform<Derived>::
8078     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8079         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8080   DeclarationNameInfo DirName;
8081   getDerived().getSema().StartOpenMPDSABlock(
8082       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8083       D->getLocStart());
8084   auto Res = getDerived().TransformOMPExecutableDirective(D);
8085   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8086   return Res;
8087 }
8088 
8089 template <typename Derived>
8090 StmtResult
8091 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8092     OMPTargetTeamsDistributeSimdDirective *D) {
8093   DeclarationNameInfo DirName;
8094   getDerived().getSema().StartOpenMPDSABlock(
8095       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8096   auto Res = getDerived().TransformOMPExecutableDirective(D);
8097   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8098   return Res;
8099 }
8100 
8101 
8102 //===----------------------------------------------------------------------===//
8103 // OpenMP clause transformation
8104 //===----------------------------------------------------------------------===//
8105 template <typename Derived>
8106 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8107   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8108   if (Cond.isInvalid())
8109     return nullptr;
8110   return getDerived().RebuildOMPIfClause(
8111       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
8112       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
8113 }
8114 
8115 template <typename Derived>
8116 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8117   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8118   if (Cond.isInvalid())
8119     return nullptr;
8120   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
8121                                             C->getLParenLoc(), C->getLocEnd());
8122 }
8123 
8124 template <typename Derived>
8125 OMPClause *
8126 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8127   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8128   if (NumThreads.isInvalid())
8129     return nullptr;
8130   return getDerived().RebuildOMPNumThreadsClause(
8131       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8132 }
8133 
8134 template <typename Derived>
8135 OMPClause *
8136 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8137   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8138   if (E.isInvalid())
8139     return nullptr;
8140   return getDerived().RebuildOMPSafelenClause(
8141       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8142 }
8143 
8144 template <typename Derived>
8145 OMPClause *
8146 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8147   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8148   if (E.isInvalid())
8149     return nullptr;
8150   return getDerived().RebuildOMPSimdlenClause(
8151       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8152 }
8153 
8154 template <typename Derived>
8155 OMPClause *
8156 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8157   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8158   if (E.isInvalid())
8159     return nullptr;
8160   return getDerived().RebuildOMPCollapseClause(
8161       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8162 }
8163 
8164 template <typename Derived>
8165 OMPClause *
8166 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8167   return getDerived().RebuildOMPDefaultClause(
8168       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
8169       C->getLParenLoc(), C->getLocEnd());
8170 }
8171 
8172 template <typename Derived>
8173 OMPClause *
8174 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8175   return getDerived().RebuildOMPProcBindClause(
8176       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
8177       C->getLParenLoc(), C->getLocEnd());
8178 }
8179 
8180 template <typename Derived>
8181 OMPClause *
8182 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8183   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8184   if (E.isInvalid())
8185     return nullptr;
8186   return getDerived().RebuildOMPScheduleClause(
8187       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8188       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8189       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8190       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8191 }
8192 
8193 template <typename Derived>
8194 OMPClause *
8195 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8196   ExprResult E;
8197   if (auto *Num = C->getNumForLoops()) {
8198     E = getDerived().TransformExpr(Num);
8199     if (E.isInvalid())
8200       return nullptr;
8201   }
8202   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
8203                                               C->getLParenLoc(), E.get());
8204 }
8205 
8206 template <typename Derived>
8207 OMPClause *
8208 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8209   // No need to rebuild this clause, no template-dependent parameters.
8210   return C;
8211 }
8212 
8213 template <typename Derived>
8214 OMPClause *
8215 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8216   // No need to rebuild this clause, no template-dependent parameters.
8217   return C;
8218 }
8219 
8220 template <typename Derived>
8221 OMPClause *
8222 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8223   // No need to rebuild this clause, no template-dependent parameters.
8224   return C;
8225 }
8226 
8227 template <typename Derived>
8228 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8229   // No need to rebuild this clause, no template-dependent parameters.
8230   return C;
8231 }
8232 
8233 template <typename Derived>
8234 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8235   // No need to rebuild this clause, no template-dependent parameters.
8236   return C;
8237 }
8238 
8239 template <typename Derived>
8240 OMPClause *
8241 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8242   // No need to rebuild this clause, no template-dependent parameters.
8243   return C;
8244 }
8245 
8246 template <typename Derived>
8247 OMPClause *
8248 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8249   // No need to rebuild this clause, no template-dependent parameters.
8250   return C;
8251 }
8252 
8253 template <typename Derived>
8254 OMPClause *
8255 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8256   // No need to rebuild this clause, no template-dependent parameters.
8257   return C;
8258 }
8259 
8260 template <typename Derived>
8261 OMPClause *
8262 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8263   // No need to rebuild this clause, no template-dependent parameters.
8264   return C;
8265 }
8266 
8267 template <typename Derived>
8268 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8269   // No need to rebuild this clause, no template-dependent parameters.
8270   return C;
8271 }
8272 
8273 template <typename Derived>
8274 OMPClause *
8275 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8276   // No need to rebuild this clause, no template-dependent parameters.
8277   return C;
8278 }
8279 
8280 template <typename Derived>
8281 OMPClause *
8282 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8283   llvm::SmallVector<Expr *, 16> Vars;
8284   Vars.reserve(C->varlist_size());
8285   for (auto *VE : C->varlists()) {
8286     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8287     if (EVar.isInvalid())
8288       return nullptr;
8289     Vars.push_back(EVar.get());
8290   }
8291   return getDerived().RebuildOMPPrivateClause(
8292       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8293 }
8294 
8295 template <typename Derived>
8296 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8297     OMPFirstprivateClause *C) {
8298   llvm::SmallVector<Expr *, 16> Vars;
8299   Vars.reserve(C->varlist_size());
8300   for (auto *VE : C->varlists()) {
8301     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8302     if (EVar.isInvalid())
8303       return nullptr;
8304     Vars.push_back(EVar.get());
8305   }
8306   return getDerived().RebuildOMPFirstprivateClause(
8307       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8308 }
8309 
8310 template <typename Derived>
8311 OMPClause *
8312 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8313   llvm::SmallVector<Expr *, 16> Vars;
8314   Vars.reserve(C->varlist_size());
8315   for (auto *VE : C->varlists()) {
8316     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8317     if (EVar.isInvalid())
8318       return nullptr;
8319     Vars.push_back(EVar.get());
8320   }
8321   return getDerived().RebuildOMPLastprivateClause(
8322       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8323 }
8324 
8325 template <typename Derived>
8326 OMPClause *
8327 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8328   llvm::SmallVector<Expr *, 16> Vars;
8329   Vars.reserve(C->varlist_size());
8330   for (auto *VE : C->varlists()) {
8331     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8332     if (EVar.isInvalid())
8333       return nullptr;
8334     Vars.push_back(EVar.get());
8335   }
8336   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
8337                                              C->getLParenLoc(), C->getLocEnd());
8338 }
8339 
8340 template <typename Derived>
8341 OMPClause *
8342 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8343   llvm::SmallVector<Expr *, 16> Vars;
8344   Vars.reserve(C->varlist_size());
8345   for (auto *VE : C->varlists()) {
8346     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8347     if (EVar.isInvalid())
8348       return nullptr;
8349     Vars.push_back(EVar.get());
8350   }
8351   CXXScopeSpec ReductionIdScopeSpec;
8352   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8353 
8354   DeclarationNameInfo NameInfo = C->getNameInfo();
8355   if (NameInfo.getName()) {
8356     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8357     if (!NameInfo.getName())
8358       return nullptr;
8359   }
8360   // Build a list of all UDR decls with the same names ranged by the Scopes.
8361   // The Scope boundary is a duplication of the previous decl.
8362   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8363   for (auto *E : C->reduction_ops()) {
8364     // Transform all the decls.
8365     if (E) {
8366       auto *ULE = cast<UnresolvedLookupExpr>(E);
8367       UnresolvedSet<8> Decls;
8368       for (auto *D : ULE->decls()) {
8369         NamedDecl *InstD =
8370             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8371         Decls.addDecl(InstD, InstD->getAccess());
8372       }
8373       UnresolvedReductions.push_back(
8374        UnresolvedLookupExpr::Create(
8375           SemaRef.Context, /*NamingClass=*/nullptr,
8376           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8377           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8378           Decls.begin(), Decls.end()));
8379     } else
8380       UnresolvedReductions.push_back(nullptr);
8381   }
8382   return getDerived().RebuildOMPReductionClause(
8383       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8384       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8385 }
8386 
8387 template <typename Derived>
8388 OMPClause *
8389 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8390   llvm::SmallVector<Expr *, 16> Vars;
8391   Vars.reserve(C->varlist_size());
8392   for (auto *VE : C->varlists()) {
8393     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8394     if (EVar.isInvalid())
8395       return nullptr;
8396     Vars.push_back(EVar.get());
8397   }
8398   ExprResult Step = getDerived().TransformExpr(C->getStep());
8399   if (Step.isInvalid())
8400     return nullptr;
8401   return getDerived().RebuildOMPLinearClause(
8402       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
8403       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
8404 }
8405 
8406 template <typename Derived>
8407 OMPClause *
8408 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8409   llvm::SmallVector<Expr *, 16> Vars;
8410   Vars.reserve(C->varlist_size());
8411   for (auto *VE : C->varlists()) {
8412     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8413     if (EVar.isInvalid())
8414       return nullptr;
8415     Vars.push_back(EVar.get());
8416   }
8417   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8418   if (Alignment.isInvalid())
8419     return nullptr;
8420   return getDerived().RebuildOMPAlignedClause(
8421       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
8422       C->getColonLoc(), C->getLocEnd());
8423 }
8424 
8425 template <typename Derived>
8426 OMPClause *
8427 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8428   llvm::SmallVector<Expr *, 16> Vars;
8429   Vars.reserve(C->varlist_size());
8430   for (auto *VE : C->varlists()) {
8431     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8432     if (EVar.isInvalid())
8433       return nullptr;
8434     Vars.push_back(EVar.get());
8435   }
8436   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
8437                                              C->getLParenLoc(), C->getLocEnd());
8438 }
8439 
8440 template <typename Derived>
8441 OMPClause *
8442 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8443   llvm::SmallVector<Expr *, 16> Vars;
8444   Vars.reserve(C->varlist_size());
8445   for (auto *VE : C->varlists()) {
8446     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8447     if (EVar.isInvalid())
8448       return nullptr;
8449     Vars.push_back(EVar.get());
8450   }
8451   return getDerived().RebuildOMPCopyprivateClause(
8452       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8453 }
8454 
8455 template <typename Derived>
8456 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8457   llvm::SmallVector<Expr *, 16> Vars;
8458   Vars.reserve(C->varlist_size());
8459   for (auto *VE : C->varlists()) {
8460     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8461     if (EVar.isInvalid())
8462       return nullptr;
8463     Vars.push_back(EVar.get());
8464   }
8465   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
8466                                             C->getLParenLoc(), C->getLocEnd());
8467 }
8468 
8469 template <typename Derived>
8470 OMPClause *
8471 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8472   llvm::SmallVector<Expr *, 16> Vars;
8473   Vars.reserve(C->varlist_size());
8474   for (auto *VE : C->varlists()) {
8475     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8476     if (EVar.isInvalid())
8477       return nullptr;
8478     Vars.push_back(EVar.get());
8479   }
8480   return getDerived().RebuildOMPDependClause(
8481       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8482       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8483 }
8484 
8485 template <typename Derived>
8486 OMPClause *
8487 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8488   ExprResult E = getDerived().TransformExpr(C->getDevice());
8489   if (E.isInvalid())
8490     return nullptr;
8491   return getDerived().RebuildOMPDeviceClause(
8492       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8493 }
8494 
8495 template <typename Derived>
8496 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8497   llvm::SmallVector<Expr *, 16> Vars;
8498   Vars.reserve(C->varlist_size());
8499   for (auto *VE : C->varlists()) {
8500     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8501     if (EVar.isInvalid())
8502       return nullptr;
8503     Vars.push_back(EVar.get());
8504   }
8505   return getDerived().RebuildOMPMapClause(
8506       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8507       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8508       C->getLParenLoc(), C->getLocEnd());
8509 }
8510 
8511 template <typename Derived>
8512 OMPClause *
8513 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8514   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8515   if (E.isInvalid())
8516     return nullptr;
8517   return getDerived().RebuildOMPNumTeamsClause(
8518       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8519 }
8520 
8521 template <typename Derived>
8522 OMPClause *
8523 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8524   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8525   if (E.isInvalid())
8526     return nullptr;
8527   return getDerived().RebuildOMPThreadLimitClause(
8528       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8529 }
8530 
8531 template <typename Derived>
8532 OMPClause *
8533 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8534   ExprResult E = getDerived().TransformExpr(C->getPriority());
8535   if (E.isInvalid())
8536     return nullptr;
8537   return getDerived().RebuildOMPPriorityClause(
8538       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8539 }
8540 
8541 template <typename Derived>
8542 OMPClause *
8543 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8544   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8545   if (E.isInvalid())
8546     return nullptr;
8547   return getDerived().RebuildOMPGrainsizeClause(
8548       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8549 }
8550 
8551 template <typename Derived>
8552 OMPClause *
8553 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8554   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8555   if (E.isInvalid())
8556     return nullptr;
8557   return getDerived().RebuildOMPNumTasksClause(
8558       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8559 }
8560 
8561 template <typename Derived>
8562 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8563   ExprResult E = getDerived().TransformExpr(C->getHint());
8564   if (E.isInvalid())
8565     return nullptr;
8566   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8567                                            C->getLParenLoc(), C->getLocEnd());
8568 }
8569 
8570 template <typename Derived>
8571 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8572     OMPDistScheduleClause *C) {
8573   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8574   if (E.isInvalid())
8575     return nullptr;
8576   return getDerived().RebuildOMPDistScheduleClause(
8577       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8578       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8579 }
8580 
8581 template <typename Derived>
8582 OMPClause *
8583 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8584   return C;
8585 }
8586 
8587 template <typename Derived>
8588 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8589   llvm::SmallVector<Expr *, 16> Vars;
8590   Vars.reserve(C->varlist_size());
8591   for (auto *VE : C->varlists()) {
8592     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8593     if (EVar.isInvalid())
8594       return 0;
8595     Vars.push_back(EVar.get());
8596   }
8597   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8598                                          C->getLParenLoc(), C->getLocEnd());
8599 }
8600 
8601 template <typename Derived>
8602 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8603   llvm::SmallVector<Expr *, 16> Vars;
8604   Vars.reserve(C->varlist_size());
8605   for (auto *VE : C->varlists()) {
8606     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8607     if (EVar.isInvalid())
8608       return 0;
8609     Vars.push_back(EVar.get());
8610   }
8611   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8612                                            C->getLParenLoc(), C->getLocEnd());
8613 }
8614 
8615 template <typename Derived>
8616 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8617     OMPUseDevicePtrClause *C) {
8618   llvm::SmallVector<Expr *, 16> Vars;
8619   Vars.reserve(C->varlist_size());
8620   for (auto *VE : C->varlists()) {
8621     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8622     if (EVar.isInvalid())
8623       return nullptr;
8624     Vars.push_back(EVar.get());
8625   }
8626   return getDerived().RebuildOMPUseDevicePtrClause(
8627       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8628 }
8629 
8630 template <typename Derived>
8631 OMPClause *
8632 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8633   llvm::SmallVector<Expr *, 16> Vars;
8634   Vars.reserve(C->varlist_size());
8635   for (auto *VE : C->varlists()) {
8636     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8637     if (EVar.isInvalid())
8638       return nullptr;
8639     Vars.push_back(EVar.get());
8640   }
8641   return getDerived().RebuildOMPIsDevicePtrClause(
8642       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8643 }
8644 
8645 //===----------------------------------------------------------------------===//
8646 // Expression transformation
8647 //===----------------------------------------------------------------------===//
8648 template<typename Derived>
8649 ExprResult
8650 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8651   if (!E->isTypeDependent())
8652     return E;
8653 
8654   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8655                                             E->getIdentType());
8656 }
8657 
8658 template<typename Derived>
8659 ExprResult
8660 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8661   NestedNameSpecifierLoc QualifierLoc;
8662   if (E->getQualifierLoc()) {
8663     QualifierLoc
8664       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8665     if (!QualifierLoc)
8666       return ExprError();
8667   }
8668 
8669   ValueDecl *ND
8670     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8671                                                          E->getDecl()));
8672   if (!ND)
8673     return ExprError();
8674 
8675   DeclarationNameInfo NameInfo = E->getNameInfo();
8676   if (NameInfo.getName()) {
8677     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8678     if (!NameInfo.getName())
8679       return ExprError();
8680   }
8681 
8682   if (!getDerived().AlwaysRebuild() &&
8683       QualifierLoc == E->getQualifierLoc() &&
8684       ND == E->getDecl() &&
8685       NameInfo.getName() == E->getDecl()->getDeclName() &&
8686       !E->hasExplicitTemplateArgs()) {
8687 
8688     // Mark it referenced in the new context regardless.
8689     // FIXME: this is a bit instantiation-specific.
8690     SemaRef.MarkDeclRefReferenced(E);
8691 
8692     return E;
8693   }
8694 
8695   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8696   if (E->hasExplicitTemplateArgs()) {
8697     TemplateArgs = &TransArgs;
8698     TransArgs.setLAngleLoc(E->getLAngleLoc());
8699     TransArgs.setRAngleLoc(E->getRAngleLoc());
8700     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8701                                                 E->getNumTemplateArgs(),
8702                                                 TransArgs))
8703       return ExprError();
8704   }
8705 
8706   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8707                                          TemplateArgs);
8708 }
8709 
8710 template<typename Derived>
8711 ExprResult
8712 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8713   return E;
8714 }
8715 
8716 template<typename Derived>
8717 ExprResult
8718 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8719   return E;
8720 }
8721 
8722 template<typename Derived>
8723 ExprResult
8724 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8725   return E;
8726 }
8727 
8728 template<typename Derived>
8729 ExprResult
8730 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8731   return E;
8732 }
8733 
8734 template<typename Derived>
8735 ExprResult
8736 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8737   return E;
8738 }
8739 
8740 template<typename Derived>
8741 ExprResult
8742 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8743   if (FunctionDecl *FD = E->getDirectCallee())
8744     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8745   return SemaRef.MaybeBindToTemporary(E);
8746 }
8747 
8748 template<typename Derived>
8749 ExprResult
8750 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8751   ExprResult ControllingExpr =
8752     getDerived().TransformExpr(E->getControllingExpr());
8753   if (ControllingExpr.isInvalid())
8754     return ExprError();
8755 
8756   SmallVector<Expr *, 4> AssocExprs;
8757   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8758   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8759     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8760     if (TS) {
8761       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8762       if (!AssocType)
8763         return ExprError();
8764       AssocTypes.push_back(AssocType);
8765     } else {
8766       AssocTypes.push_back(nullptr);
8767     }
8768 
8769     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8770     if (AssocExpr.isInvalid())
8771       return ExprError();
8772     AssocExprs.push_back(AssocExpr.get());
8773   }
8774 
8775   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8776                                                   E->getDefaultLoc(),
8777                                                   E->getRParenLoc(),
8778                                                   ControllingExpr.get(),
8779                                                   AssocTypes,
8780                                                   AssocExprs);
8781 }
8782 
8783 template<typename Derived>
8784 ExprResult
8785 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8786   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8787   if (SubExpr.isInvalid())
8788     return ExprError();
8789 
8790   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8791     return E;
8792 
8793   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8794                                        E->getRParen());
8795 }
8796 
8797 /// \brief The operand of a unary address-of operator has special rules: it's
8798 /// allowed to refer to a non-static member of a class even if there's no 'this'
8799 /// object available.
8800 template<typename Derived>
8801 ExprResult
8802 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8803   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8804     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8805   else
8806     return getDerived().TransformExpr(E);
8807 }
8808 
8809 template<typename Derived>
8810 ExprResult
8811 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8812   ExprResult SubExpr;
8813   if (E->getOpcode() == UO_AddrOf)
8814     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8815   else
8816     SubExpr = TransformExpr(E->getSubExpr());
8817   if (SubExpr.isInvalid())
8818     return ExprError();
8819 
8820   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8821     return E;
8822 
8823   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
8824                                            E->getOpcode(),
8825                                            SubExpr.get());
8826 }
8827 
8828 template<typename Derived>
8829 ExprResult
8830 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
8831   // Transform the type.
8832   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
8833   if (!Type)
8834     return ExprError();
8835 
8836   // Transform all of the components into components similar to what the
8837   // parser uses.
8838   // FIXME: It would be slightly more efficient in the non-dependent case to
8839   // just map FieldDecls, rather than requiring the rebuilder to look for
8840   // the fields again. However, __builtin_offsetof is rare enough in
8841   // template code that we don't care.
8842   bool ExprChanged = false;
8843   typedef Sema::OffsetOfComponent Component;
8844   SmallVector<Component, 4> Components;
8845   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
8846     const OffsetOfNode &ON = E->getComponent(I);
8847     Component Comp;
8848     Comp.isBrackets = true;
8849     Comp.LocStart = ON.getSourceRange().getBegin();
8850     Comp.LocEnd = ON.getSourceRange().getEnd();
8851     switch (ON.getKind()) {
8852     case OffsetOfNode::Array: {
8853       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
8854       ExprResult Index = getDerived().TransformExpr(FromIndex);
8855       if (Index.isInvalid())
8856         return ExprError();
8857 
8858       ExprChanged = ExprChanged || Index.get() != FromIndex;
8859       Comp.isBrackets = true;
8860       Comp.U.E = Index.get();
8861       break;
8862     }
8863 
8864     case OffsetOfNode::Field:
8865     case OffsetOfNode::Identifier:
8866       Comp.isBrackets = false;
8867       Comp.U.IdentInfo = ON.getFieldName();
8868       if (!Comp.U.IdentInfo)
8869         continue;
8870 
8871       break;
8872 
8873     case OffsetOfNode::Base:
8874       // Will be recomputed during the rebuild.
8875       continue;
8876     }
8877 
8878     Components.push_back(Comp);
8879   }
8880 
8881   // If nothing changed, retain the existing expression.
8882   if (!getDerived().AlwaysRebuild() &&
8883       Type == E->getTypeSourceInfo() &&
8884       !ExprChanged)
8885     return E;
8886 
8887   // Build a new offsetof expression.
8888   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
8889                                           Components, E->getRParenLoc());
8890 }
8891 
8892 template<typename Derived>
8893 ExprResult
8894 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
8895   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
8896          "opaque value expression requires transformation");
8897   return E;
8898 }
8899 
8900 template<typename Derived>
8901 ExprResult
8902 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
8903   return E;
8904 }
8905 
8906 template<typename Derived>
8907 ExprResult
8908 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
8909   // Rebuild the syntactic form.  The original syntactic form has
8910   // opaque-value expressions in it, so strip those away and rebuild
8911   // the result.  This is a really awful way of doing this, but the
8912   // better solution (rebuilding the semantic expressions and
8913   // rebinding OVEs as necessary) doesn't work; we'd need
8914   // TreeTransform to not strip away implicit conversions.
8915   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
8916   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
8917   if (result.isInvalid()) return ExprError();
8918 
8919   // If that gives us a pseudo-object result back, the pseudo-object
8920   // expression must have been an lvalue-to-rvalue conversion which we
8921   // should reapply.
8922   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
8923     result = SemaRef.checkPseudoObjectRValue(result.get());
8924 
8925   return result;
8926 }
8927 
8928 template<typename Derived>
8929 ExprResult
8930 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
8931                                                 UnaryExprOrTypeTraitExpr *E) {
8932   if (E->isArgumentType()) {
8933     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
8934 
8935     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8936     if (!NewT)
8937       return ExprError();
8938 
8939     if (!getDerived().AlwaysRebuild() && OldT == NewT)
8940       return E;
8941 
8942     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
8943                                                     E->getKind(),
8944                                                     E->getSourceRange());
8945   }
8946 
8947   // C++0x [expr.sizeof]p1:
8948   //   The operand is either an expression, which is an unevaluated operand
8949   //   [...]
8950   EnterExpressionEvaluationContext Unevaluated(
8951       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
8952       Sema::ReuseLambdaContextDecl);
8953 
8954   // Try to recover if we have something like sizeof(T::X) where X is a type.
8955   // Notably, there must be *exactly* one set of parens if X is a type.
8956   TypeSourceInfo *RecoveryTSI = nullptr;
8957   ExprResult SubExpr;
8958   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
8959   if (auto *DRE =
8960           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
8961     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
8962         PE, DRE, false, &RecoveryTSI);
8963   else
8964     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
8965 
8966   if (RecoveryTSI) {
8967     return getDerived().RebuildUnaryExprOrTypeTrait(
8968         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
8969   } else if (SubExpr.isInvalid())
8970     return ExprError();
8971 
8972   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
8973     return E;
8974 
8975   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
8976                                                   E->getOperatorLoc(),
8977                                                   E->getKind(),
8978                                                   E->getSourceRange());
8979 }
8980 
8981 template<typename Derived>
8982 ExprResult
8983 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
8984   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8985   if (LHS.isInvalid())
8986     return ExprError();
8987 
8988   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8989   if (RHS.isInvalid())
8990     return ExprError();
8991 
8992 
8993   if (!getDerived().AlwaysRebuild() &&
8994       LHS.get() == E->getLHS() &&
8995       RHS.get() == E->getRHS())
8996     return E;
8997 
8998   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
8999                                            /*FIXME:*/E->getLHS()->getLocStart(),
9000                                                 RHS.get(),
9001                                                 E->getRBracketLoc());
9002 }
9003 
9004 template <typename Derived>
9005 ExprResult
9006 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9007   ExprResult Base = getDerived().TransformExpr(E->getBase());
9008   if (Base.isInvalid())
9009     return ExprError();
9010 
9011   ExprResult LowerBound;
9012   if (E->getLowerBound()) {
9013     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9014     if (LowerBound.isInvalid())
9015       return ExprError();
9016   }
9017 
9018   ExprResult Length;
9019   if (E->getLength()) {
9020     Length = getDerived().TransformExpr(E->getLength());
9021     if (Length.isInvalid())
9022       return ExprError();
9023   }
9024 
9025   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9026       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9027     return E;
9028 
9029   return getDerived().RebuildOMPArraySectionExpr(
9030       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
9031       Length.get(), E->getRBracketLoc());
9032 }
9033 
9034 template<typename Derived>
9035 ExprResult
9036 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9037   // Transform the callee.
9038   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9039   if (Callee.isInvalid())
9040     return ExprError();
9041 
9042   // Transform arguments.
9043   bool ArgChanged = false;
9044   SmallVector<Expr*, 8> Args;
9045   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9046                                   &ArgChanged))
9047     return ExprError();
9048 
9049   if (!getDerived().AlwaysRebuild() &&
9050       Callee.get() == E->getCallee() &&
9051       !ArgChanged)
9052     return SemaRef.MaybeBindToTemporary(E);
9053 
9054   // FIXME: Wrong source location information for the '('.
9055   SourceLocation FakeLParenLoc
9056     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9057   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9058                                       Args,
9059                                       E->getRParenLoc());
9060 }
9061 
9062 template<typename Derived>
9063 ExprResult
9064 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9065   ExprResult Base = getDerived().TransformExpr(E->getBase());
9066   if (Base.isInvalid())
9067     return ExprError();
9068 
9069   NestedNameSpecifierLoc QualifierLoc;
9070   if (E->hasQualifier()) {
9071     QualifierLoc
9072       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9073 
9074     if (!QualifierLoc)
9075       return ExprError();
9076   }
9077   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9078 
9079   ValueDecl *Member
9080     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9081                                                          E->getMemberDecl()));
9082   if (!Member)
9083     return ExprError();
9084 
9085   NamedDecl *FoundDecl = E->getFoundDecl();
9086   if (FoundDecl == E->getMemberDecl()) {
9087     FoundDecl = Member;
9088   } else {
9089     FoundDecl = cast_or_null<NamedDecl>(
9090                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9091     if (!FoundDecl)
9092       return ExprError();
9093   }
9094 
9095   if (!getDerived().AlwaysRebuild() &&
9096       Base.get() == E->getBase() &&
9097       QualifierLoc == E->getQualifierLoc() &&
9098       Member == E->getMemberDecl() &&
9099       FoundDecl == E->getFoundDecl() &&
9100       !E->hasExplicitTemplateArgs()) {
9101 
9102     // Mark it referenced in the new context regardless.
9103     // FIXME: this is a bit instantiation-specific.
9104     SemaRef.MarkMemberReferenced(E);
9105 
9106     return E;
9107   }
9108 
9109   TemplateArgumentListInfo TransArgs;
9110   if (E->hasExplicitTemplateArgs()) {
9111     TransArgs.setLAngleLoc(E->getLAngleLoc());
9112     TransArgs.setRAngleLoc(E->getRAngleLoc());
9113     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9114                                                 E->getNumTemplateArgs(),
9115                                                 TransArgs))
9116       return ExprError();
9117   }
9118 
9119   // FIXME: Bogus source location for the operator
9120   SourceLocation FakeOperatorLoc =
9121       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9122 
9123   // FIXME: to do this check properly, we will need to preserve the
9124   // first-qualifier-in-scope here, just in case we had a dependent
9125   // base (and therefore couldn't do the check) and a
9126   // nested-name-qualifier (and therefore could do the lookup).
9127   NamedDecl *FirstQualifierInScope = nullptr;
9128   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9129   if (MemberNameInfo.getName()) {
9130     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9131     if (!MemberNameInfo.getName())
9132       return ExprError();
9133   }
9134 
9135   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9136                                         E->isArrow(),
9137                                         QualifierLoc,
9138                                         TemplateKWLoc,
9139                                         MemberNameInfo,
9140                                         Member,
9141                                         FoundDecl,
9142                                         (E->hasExplicitTemplateArgs()
9143                                            ? &TransArgs : nullptr),
9144                                         FirstQualifierInScope);
9145 }
9146 
9147 template<typename Derived>
9148 ExprResult
9149 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9150   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9151   if (LHS.isInvalid())
9152     return ExprError();
9153 
9154   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9155   if (RHS.isInvalid())
9156     return ExprError();
9157 
9158   if (!getDerived().AlwaysRebuild() &&
9159       LHS.get() == E->getLHS() &&
9160       RHS.get() == E->getRHS())
9161     return E;
9162 
9163   Sema::FPContractStateRAII FPContractState(getSema());
9164   getSema().FPFeatures = E->getFPFeatures();
9165 
9166   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9167                                             LHS.get(), RHS.get());
9168 }
9169 
9170 template<typename Derived>
9171 ExprResult
9172 TreeTransform<Derived>::TransformCompoundAssignOperator(
9173                                                       CompoundAssignOperator *E) {
9174   return getDerived().TransformBinaryOperator(E);
9175 }
9176 
9177 template<typename Derived>
9178 ExprResult TreeTransform<Derived>::
9179 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9180   // Just rebuild the common and RHS expressions and see whether we
9181   // get any changes.
9182 
9183   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9184   if (commonExpr.isInvalid())
9185     return ExprError();
9186 
9187   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9188   if (rhs.isInvalid())
9189     return ExprError();
9190 
9191   if (!getDerived().AlwaysRebuild() &&
9192       commonExpr.get() == e->getCommon() &&
9193       rhs.get() == e->getFalseExpr())
9194     return e;
9195 
9196   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9197                                                  e->getQuestionLoc(),
9198                                                  nullptr,
9199                                                  e->getColonLoc(),
9200                                                  rhs.get());
9201 }
9202 
9203 template<typename Derived>
9204 ExprResult
9205 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9206   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9207   if (Cond.isInvalid())
9208     return ExprError();
9209 
9210   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9211   if (LHS.isInvalid())
9212     return ExprError();
9213 
9214   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9215   if (RHS.isInvalid())
9216     return ExprError();
9217 
9218   if (!getDerived().AlwaysRebuild() &&
9219       Cond.get() == E->getCond() &&
9220       LHS.get() == E->getLHS() &&
9221       RHS.get() == E->getRHS())
9222     return E;
9223 
9224   return getDerived().RebuildConditionalOperator(Cond.get(),
9225                                                  E->getQuestionLoc(),
9226                                                  LHS.get(),
9227                                                  E->getColonLoc(),
9228                                                  RHS.get());
9229 }
9230 
9231 template<typename Derived>
9232 ExprResult
9233 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9234   // Implicit casts are eliminated during transformation, since they
9235   // will be recomputed by semantic analysis after transformation.
9236   return getDerived().TransformExpr(E->getSubExprAsWritten());
9237 }
9238 
9239 template<typename Derived>
9240 ExprResult
9241 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9242   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9243   if (!Type)
9244     return ExprError();
9245 
9246   ExprResult SubExpr
9247     = getDerived().TransformExpr(E->getSubExprAsWritten());
9248   if (SubExpr.isInvalid())
9249     return ExprError();
9250 
9251   if (!getDerived().AlwaysRebuild() &&
9252       Type == E->getTypeInfoAsWritten() &&
9253       SubExpr.get() == E->getSubExpr())
9254     return E;
9255 
9256   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9257                                             Type,
9258                                             E->getRParenLoc(),
9259                                             SubExpr.get());
9260 }
9261 
9262 template<typename Derived>
9263 ExprResult
9264 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9265   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9266   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9267   if (!NewT)
9268     return ExprError();
9269 
9270   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9271   if (Init.isInvalid())
9272     return ExprError();
9273 
9274   if (!getDerived().AlwaysRebuild() &&
9275       OldT == NewT &&
9276       Init.get() == E->getInitializer())
9277     return SemaRef.MaybeBindToTemporary(E);
9278 
9279   // Note: the expression type doesn't necessarily match the
9280   // type-as-written, but that's okay, because it should always be
9281   // derivable from the initializer.
9282 
9283   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
9284                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
9285                                                  Init.get());
9286 }
9287 
9288 template<typename Derived>
9289 ExprResult
9290 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9291   ExprResult Base = getDerived().TransformExpr(E->getBase());
9292   if (Base.isInvalid())
9293     return ExprError();
9294 
9295   if (!getDerived().AlwaysRebuild() &&
9296       Base.get() == E->getBase())
9297     return E;
9298 
9299   // FIXME: Bad source location
9300   SourceLocation FakeOperatorLoc =
9301       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
9302   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9303                                                   E->getAccessorLoc(),
9304                                                   E->getAccessor());
9305 }
9306 
9307 template<typename Derived>
9308 ExprResult
9309 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9310   if (InitListExpr *Syntactic = E->getSyntacticForm())
9311     E = Syntactic;
9312 
9313   bool InitChanged = false;
9314 
9315   SmallVector<Expr*, 4> Inits;
9316   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9317                                   Inits, &InitChanged))
9318     return ExprError();
9319 
9320   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9321     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9322     // in some cases. We can't reuse it in general, because the syntactic and
9323     // semantic forms are linked, and we can't know that semantic form will
9324     // match even if the syntactic form does.
9325   }
9326 
9327   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9328                                       E->getRBraceLoc(), E->getType());
9329 }
9330 
9331 template<typename Derived>
9332 ExprResult
9333 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9334   Designation Desig;
9335 
9336   // transform the initializer value
9337   ExprResult Init = getDerived().TransformExpr(E->getInit());
9338   if (Init.isInvalid())
9339     return ExprError();
9340 
9341   // transform the designators.
9342   SmallVector<Expr*, 4> ArrayExprs;
9343   bool ExprChanged = false;
9344   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9345     if (D.isFieldDesignator()) {
9346       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9347                                                D.getDotLoc(),
9348                                                D.getFieldLoc()));
9349       if (D.getField()) {
9350         FieldDecl *Field = cast_or_null<FieldDecl>(
9351             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9352         if (Field != D.getField())
9353           // Rebuild the expression when the transformed FieldDecl is
9354           // different to the already assigned FieldDecl.
9355           ExprChanged = true;
9356       } else {
9357         // Ensure that the designator expression is rebuilt when there isn't
9358         // a resolved FieldDecl in the designator as we don't want to assign
9359         // a FieldDecl to a pattern designator that will be instantiated again.
9360         ExprChanged = true;
9361       }
9362       continue;
9363     }
9364 
9365     if (D.isArrayDesignator()) {
9366       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9367       if (Index.isInvalid())
9368         return ExprError();
9369 
9370       Desig.AddDesignator(
9371           Designator::getArray(Index.get(), D.getLBracketLoc()));
9372 
9373       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9374       ArrayExprs.push_back(Index.get());
9375       continue;
9376     }
9377 
9378     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9379     ExprResult Start
9380       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9381     if (Start.isInvalid())
9382       return ExprError();
9383 
9384     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9385     if (End.isInvalid())
9386       return ExprError();
9387 
9388     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9389                                                   End.get(),
9390                                                   D.getLBracketLoc(),
9391                                                   D.getEllipsisLoc()));
9392 
9393     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9394                   End.get() != E->getArrayRangeEnd(D);
9395 
9396     ArrayExprs.push_back(Start.get());
9397     ArrayExprs.push_back(End.get());
9398   }
9399 
9400   if (!getDerived().AlwaysRebuild() &&
9401       Init.get() == E->getInit() &&
9402       !ExprChanged)
9403     return E;
9404 
9405   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9406                                                 E->getEqualOrColonLoc(),
9407                                                 E->usesGNUSyntax(), Init.get());
9408 }
9409 
9410 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9411 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9412 template<typename Derived>
9413 ExprResult
9414 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9415     DesignatedInitUpdateExpr *E) {
9416   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9417                    "initializer");
9418   return ExprError();
9419 }
9420 
9421 template<typename Derived>
9422 ExprResult
9423 TreeTransform<Derived>::TransformNoInitExpr(
9424     NoInitExpr *E) {
9425   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9426   return ExprError();
9427 }
9428 
9429 template<typename Derived>
9430 ExprResult
9431 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9432   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9433   return ExprError();
9434 }
9435 
9436 template<typename Derived>
9437 ExprResult
9438 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9439   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9440   return ExprError();
9441 }
9442 
9443 template<typename Derived>
9444 ExprResult
9445 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9446                                                      ImplicitValueInitExpr *E) {
9447   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9448 
9449   // FIXME: Will we ever have proper type location here? Will we actually
9450   // need to transform the type?
9451   QualType T = getDerived().TransformType(E->getType());
9452   if (T.isNull())
9453     return ExprError();
9454 
9455   if (!getDerived().AlwaysRebuild() &&
9456       T == E->getType())
9457     return E;
9458 
9459   return getDerived().RebuildImplicitValueInitExpr(T);
9460 }
9461 
9462 template<typename Derived>
9463 ExprResult
9464 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9465   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9466   if (!TInfo)
9467     return ExprError();
9468 
9469   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9470   if (SubExpr.isInvalid())
9471     return ExprError();
9472 
9473   if (!getDerived().AlwaysRebuild() &&
9474       TInfo == E->getWrittenTypeInfo() &&
9475       SubExpr.get() == E->getSubExpr())
9476     return E;
9477 
9478   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9479                                        TInfo, E->getRParenLoc());
9480 }
9481 
9482 template<typename Derived>
9483 ExprResult
9484 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9485   bool ArgumentChanged = false;
9486   SmallVector<Expr*, 4> Inits;
9487   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9488                      &ArgumentChanged))
9489     return ExprError();
9490 
9491   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9492                                            Inits,
9493                                            E->getRParenLoc());
9494 }
9495 
9496 /// \brief Transform an address-of-label expression.
9497 ///
9498 /// By default, the transformation of an address-of-label expression always
9499 /// rebuilds the expression, so that the label identifier can be resolved to
9500 /// the corresponding label statement by semantic analysis.
9501 template<typename Derived>
9502 ExprResult
9503 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9504   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9505                                         E->getLabel());
9506   if (!LD)
9507     return ExprError();
9508 
9509   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9510                                            cast<LabelDecl>(LD));
9511 }
9512 
9513 template<typename Derived>
9514 ExprResult
9515 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9516   SemaRef.ActOnStartStmtExpr();
9517   StmtResult SubStmt
9518     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9519   if (SubStmt.isInvalid()) {
9520     SemaRef.ActOnStmtExprError();
9521     return ExprError();
9522   }
9523 
9524   if (!getDerived().AlwaysRebuild() &&
9525       SubStmt.get() == E->getSubStmt()) {
9526     // Calling this an 'error' is unintuitive, but it does the right thing.
9527     SemaRef.ActOnStmtExprError();
9528     return SemaRef.MaybeBindToTemporary(E);
9529   }
9530 
9531   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9532                                       SubStmt.get(),
9533                                       E->getRParenLoc());
9534 }
9535 
9536 template<typename Derived>
9537 ExprResult
9538 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9539   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9540   if (Cond.isInvalid())
9541     return ExprError();
9542 
9543   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9544   if (LHS.isInvalid())
9545     return ExprError();
9546 
9547   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9548   if (RHS.isInvalid())
9549     return ExprError();
9550 
9551   if (!getDerived().AlwaysRebuild() &&
9552       Cond.get() == E->getCond() &&
9553       LHS.get() == E->getLHS() &&
9554       RHS.get() == E->getRHS())
9555     return E;
9556 
9557   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9558                                         Cond.get(), LHS.get(), RHS.get(),
9559                                         E->getRParenLoc());
9560 }
9561 
9562 template<typename Derived>
9563 ExprResult
9564 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9565   return E;
9566 }
9567 
9568 template<typename Derived>
9569 ExprResult
9570 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9571   switch (E->getOperator()) {
9572   case OO_New:
9573   case OO_Delete:
9574   case OO_Array_New:
9575   case OO_Array_Delete:
9576     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9577 
9578   case OO_Call: {
9579     // This is a call to an object's operator().
9580     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9581 
9582     // Transform the object itself.
9583     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9584     if (Object.isInvalid())
9585       return ExprError();
9586 
9587     // FIXME: Poor location information
9588     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9589         static_cast<Expr *>(Object.get())->getLocEnd());
9590 
9591     // Transform the call arguments.
9592     SmallVector<Expr*, 8> Args;
9593     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9594                                     Args))
9595       return ExprError();
9596 
9597     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9598                                         Args,
9599                                         E->getLocEnd());
9600   }
9601 
9602 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9603   case OO_##Name:
9604 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9605 #include "clang/Basic/OperatorKinds.def"
9606   case OO_Subscript:
9607     // Handled below.
9608     break;
9609 
9610   case OO_Conditional:
9611     llvm_unreachable("conditional operator is not actually overloadable");
9612 
9613   case OO_None:
9614   case NUM_OVERLOADED_OPERATORS:
9615     llvm_unreachable("not an overloaded operator?");
9616   }
9617 
9618   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9619   if (Callee.isInvalid())
9620     return ExprError();
9621 
9622   ExprResult First;
9623   if (E->getOperator() == OO_Amp)
9624     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9625   else
9626     First = getDerived().TransformExpr(E->getArg(0));
9627   if (First.isInvalid())
9628     return ExprError();
9629 
9630   ExprResult Second;
9631   if (E->getNumArgs() == 2) {
9632     Second = getDerived().TransformExpr(E->getArg(1));
9633     if (Second.isInvalid())
9634       return ExprError();
9635   }
9636 
9637   if (!getDerived().AlwaysRebuild() &&
9638       Callee.get() == E->getCallee() &&
9639       First.get() == E->getArg(0) &&
9640       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9641     return SemaRef.MaybeBindToTemporary(E);
9642 
9643   Sema::FPContractStateRAII FPContractState(getSema());
9644   getSema().FPFeatures = E->getFPFeatures();
9645 
9646   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9647                                                  E->getOperatorLoc(),
9648                                                  Callee.get(),
9649                                                  First.get(),
9650                                                  Second.get());
9651 }
9652 
9653 template<typename Derived>
9654 ExprResult
9655 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9656   return getDerived().TransformCallExpr(E);
9657 }
9658 
9659 template<typename Derived>
9660 ExprResult
9661 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9662   // Transform the callee.
9663   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9664   if (Callee.isInvalid())
9665     return ExprError();
9666 
9667   // Transform exec config.
9668   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9669   if (EC.isInvalid())
9670     return ExprError();
9671 
9672   // Transform arguments.
9673   bool ArgChanged = false;
9674   SmallVector<Expr*, 8> Args;
9675   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9676                                   &ArgChanged))
9677     return ExprError();
9678 
9679   if (!getDerived().AlwaysRebuild() &&
9680       Callee.get() == E->getCallee() &&
9681       !ArgChanged)
9682     return SemaRef.MaybeBindToTemporary(E);
9683 
9684   // FIXME: Wrong source location information for the '('.
9685   SourceLocation FakeLParenLoc
9686     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9687   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9688                                       Args,
9689                                       E->getRParenLoc(), EC.get());
9690 }
9691 
9692 template<typename Derived>
9693 ExprResult
9694 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9695   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9696   if (!Type)
9697     return ExprError();
9698 
9699   ExprResult SubExpr
9700     = getDerived().TransformExpr(E->getSubExprAsWritten());
9701   if (SubExpr.isInvalid())
9702     return ExprError();
9703 
9704   if (!getDerived().AlwaysRebuild() &&
9705       Type == E->getTypeInfoAsWritten() &&
9706       SubExpr.get() == E->getSubExpr())
9707     return E;
9708   return getDerived().RebuildCXXNamedCastExpr(
9709       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9710       Type, E->getAngleBrackets().getEnd(),
9711       // FIXME. this should be '(' location
9712       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9713 }
9714 
9715 template<typename Derived>
9716 ExprResult
9717 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9718   return getDerived().TransformCXXNamedCastExpr(E);
9719 }
9720 
9721 template<typename Derived>
9722 ExprResult
9723 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9724   return getDerived().TransformCXXNamedCastExpr(E);
9725 }
9726 
9727 template<typename Derived>
9728 ExprResult
9729 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9730                                                       CXXReinterpretCastExpr *E) {
9731   return getDerived().TransformCXXNamedCastExpr(E);
9732 }
9733 
9734 template<typename Derived>
9735 ExprResult
9736 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9737   return getDerived().TransformCXXNamedCastExpr(E);
9738 }
9739 
9740 template<typename Derived>
9741 ExprResult
9742 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9743                                                      CXXFunctionalCastExpr *E) {
9744   TypeSourceInfo *Type =
9745       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
9746   if (!Type)
9747     return ExprError();
9748 
9749   ExprResult SubExpr
9750     = getDerived().TransformExpr(E->getSubExprAsWritten());
9751   if (SubExpr.isInvalid())
9752     return ExprError();
9753 
9754   if (!getDerived().AlwaysRebuild() &&
9755       Type == E->getTypeInfoAsWritten() &&
9756       SubExpr.get() == E->getSubExpr())
9757     return E;
9758 
9759   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9760                                                    E->getLParenLoc(),
9761                                                    SubExpr.get(),
9762                                                    E->getRParenLoc());
9763 }
9764 
9765 template<typename Derived>
9766 ExprResult
9767 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9768   if (E->isTypeOperand()) {
9769     TypeSourceInfo *TInfo
9770       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9771     if (!TInfo)
9772       return ExprError();
9773 
9774     if (!getDerived().AlwaysRebuild() &&
9775         TInfo == E->getTypeOperandSourceInfo())
9776       return E;
9777 
9778     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9779                                              E->getLocStart(),
9780                                              TInfo,
9781                                              E->getLocEnd());
9782   }
9783 
9784   // We don't know whether the subexpression is potentially evaluated until
9785   // after we perform semantic analysis.  We speculatively assume it is
9786   // unevaluated; it will get fixed later if the subexpression is in fact
9787   // potentially evaluated.
9788   EnterExpressionEvaluationContext Unevaluated(
9789       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9790       Sema::ReuseLambdaContextDecl);
9791 
9792   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9793   if (SubExpr.isInvalid())
9794     return ExprError();
9795 
9796   if (!getDerived().AlwaysRebuild() &&
9797       SubExpr.get() == E->getExprOperand())
9798     return E;
9799 
9800   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9801                                            E->getLocStart(),
9802                                            SubExpr.get(),
9803                                            E->getLocEnd());
9804 }
9805 
9806 template<typename Derived>
9807 ExprResult
9808 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9809   if (E->isTypeOperand()) {
9810     TypeSourceInfo *TInfo
9811       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9812     if (!TInfo)
9813       return ExprError();
9814 
9815     if (!getDerived().AlwaysRebuild() &&
9816         TInfo == E->getTypeOperandSourceInfo())
9817       return E;
9818 
9819     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9820                                              E->getLocStart(),
9821                                              TInfo,
9822                                              E->getLocEnd());
9823   }
9824 
9825   EnterExpressionEvaluationContext Unevaluated(
9826       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
9827 
9828   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9829   if (SubExpr.isInvalid())
9830     return ExprError();
9831 
9832   if (!getDerived().AlwaysRebuild() &&
9833       SubExpr.get() == E->getExprOperand())
9834     return E;
9835 
9836   return getDerived().RebuildCXXUuidofExpr(E->getType(),
9837                                            E->getLocStart(),
9838                                            SubExpr.get(),
9839                                            E->getLocEnd());
9840 }
9841 
9842 template<typename Derived>
9843 ExprResult
9844 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
9845   return E;
9846 }
9847 
9848 template<typename Derived>
9849 ExprResult
9850 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
9851                                                      CXXNullPtrLiteralExpr *E) {
9852   return E;
9853 }
9854 
9855 template<typename Derived>
9856 ExprResult
9857 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
9858   QualType T = getSema().getCurrentThisType();
9859 
9860   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
9861     // Make sure that we capture 'this'.
9862     getSema().CheckCXXThisCapture(E->getLocStart());
9863     return E;
9864   }
9865 
9866   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
9867 }
9868 
9869 template<typename Derived>
9870 ExprResult
9871 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
9872   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9873   if (SubExpr.isInvalid())
9874     return ExprError();
9875 
9876   if (!getDerived().AlwaysRebuild() &&
9877       SubExpr.get() == E->getSubExpr())
9878     return E;
9879 
9880   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
9881                                           E->isThrownVariableInScope());
9882 }
9883 
9884 template<typename Derived>
9885 ExprResult
9886 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
9887   ParmVarDecl *Param
9888     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
9889                                                            E->getParam()));
9890   if (!Param)
9891     return ExprError();
9892 
9893   if (!getDerived().AlwaysRebuild() &&
9894       Param == E->getParam())
9895     return E;
9896 
9897   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
9898 }
9899 
9900 template<typename Derived>
9901 ExprResult
9902 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
9903   FieldDecl *Field
9904     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
9905                                                          E->getField()));
9906   if (!Field)
9907     return ExprError();
9908 
9909   if (!getDerived().AlwaysRebuild() && Field == E->getField())
9910     return E;
9911 
9912   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
9913 }
9914 
9915 template<typename Derived>
9916 ExprResult
9917 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
9918                                                     CXXScalarValueInitExpr *E) {
9919   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9920   if (!T)
9921     return ExprError();
9922 
9923   if (!getDerived().AlwaysRebuild() &&
9924       T == E->getTypeSourceInfo())
9925     return E;
9926 
9927   return getDerived().RebuildCXXScalarValueInitExpr(T,
9928                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9929                                                     E->getRParenLoc());
9930 }
9931 
9932 template<typename Derived>
9933 ExprResult
9934 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
9935   // Transform the type that we're allocating
9936   TypeSourceInfo *AllocTypeInfo =
9937       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
9938   if (!AllocTypeInfo)
9939     return ExprError();
9940 
9941   // Transform the size of the array we're allocating (if any).
9942   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
9943   if (ArraySize.isInvalid())
9944     return ExprError();
9945 
9946   // Transform the placement arguments (if any).
9947   bool ArgumentChanged = false;
9948   SmallVector<Expr*, 8> PlacementArgs;
9949   if (getDerived().TransformExprs(E->getPlacementArgs(),
9950                                   E->getNumPlacementArgs(), true,
9951                                   PlacementArgs, &ArgumentChanged))
9952     return ExprError();
9953 
9954   // Transform the initializer (if any).
9955   Expr *OldInit = E->getInitializer();
9956   ExprResult NewInit;
9957   if (OldInit)
9958     NewInit = getDerived().TransformInitializer(OldInit, true);
9959   if (NewInit.isInvalid())
9960     return ExprError();
9961 
9962   // Transform new operator and delete operator.
9963   FunctionDecl *OperatorNew = nullptr;
9964   if (E->getOperatorNew()) {
9965     OperatorNew = cast_or_null<FunctionDecl>(
9966                                  getDerived().TransformDecl(E->getLocStart(),
9967                                                          E->getOperatorNew()));
9968     if (!OperatorNew)
9969       return ExprError();
9970   }
9971 
9972   FunctionDecl *OperatorDelete = nullptr;
9973   if (E->getOperatorDelete()) {
9974     OperatorDelete = cast_or_null<FunctionDecl>(
9975                                    getDerived().TransformDecl(E->getLocStart(),
9976                                                        E->getOperatorDelete()));
9977     if (!OperatorDelete)
9978       return ExprError();
9979   }
9980 
9981   if (!getDerived().AlwaysRebuild() &&
9982       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
9983       ArraySize.get() == E->getArraySize() &&
9984       NewInit.get() == OldInit &&
9985       OperatorNew == E->getOperatorNew() &&
9986       OperatorDelete == E->getOperatorDelete() &&
9987       !ArgumentChanged) {
9988     // Mark any declarations we need as referenced.
9989     // FIXME: instantiation-specific.
9990     if (OperatorNew)
9991       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
9992     if (OperatorDelete)
9993       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9994 
9995     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
9996       QualType ElementType
9997         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
9998       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
9999         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10000         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10001           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
10002         }
10003       }
10004     }
10005 
10006     return E;
10007   }
10008 
10009   QualType AllocType = AllocTypeInfo->getType();
10010   if (!ArraySize.get()) {
10011     // If no array size was specified, but the new expression was
10012     // instantiated with an array type (e.g., "new T" where T is
10013     // instantiated with "int[4]"), extract the outer bound from the
10014     // array type as our array size. We do this with constant and
10015     // dependently-sized array types.
10016     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10017     if (!ArrayT) {
10018       // Do nothing
10019     } else if (const ConstantArrayType *ConsArrayT
10020                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10021       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10022                                          SemaRef.Context.getSizeType(),
10023                                          /*FIXME:*/ E->getLocStart());
10024       AllocType = ConsArrayT->getElementType();
10025     } else if (const DependentSizedArrayType *DepArrayT
10026                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10027       if (DepArrayT->getSizeExpr()) {
10028         ArraySize = DepArrayT->getSizeExpr();
10029         AllocType = DepArrayT->getElementType();
10030       }
10031     }
10032   }
10033 
10034   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
10035                                         E->isGlobalNew(),
10036                                         /*FIXME:*/E->getLocStart(),
10037                                         PlacementArgs,
10038                                         /*FIXME:*/E->getLocStart(),
10039                                         E->getTypeIdParens(),
10040                                         AllocType,
10041                                         AllocTypeInfo,
10042                                         ArraySize.get(),
10043                                         E->getDirectInitRange(),
10044                                         NewInit.get());
10045 }
10046 
10047 template<typename Derived>
10048 ExprResult
10049 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10050   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10051   if (Operand.isInvalid())
10052     return ExprError();
10053 
10054   // Transform the delete operator, if known.
10055   FunctionDecl *OperatorDelete = nullptr;
10056   if (E->getOperatorDelete()) {
10057     OperatorDelete = cast_or_null<FunctionDecl>(
10058                                    getDerived().TransformDecl(E->getLocStart(),
10059                                                        E->getOperatorDelete()));
10060     if (!OperatorDelete)
10061       return ExprError();
10062   }
10063 
10064   if (!getDerived().AlwaysRebuild() &&
10065       Operand.get() == E->getArgument() &&
10066       OperatorDelete == E->getOperatorDelete()) {
10067     // Mark any declarations we need as referenced.
10068     // FIXME: instantiation-specific.
10069     if (OperatorDelete)
10070       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
10071 
10072     if (!E->getArgument()->isTypeDependent()) {
10073       QualType Destroyed = SemaRef.Context.getBaseElementType(
10074                                                          E->getDestroyedType());
10075       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10076         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10077         SemaRef.MarkFunctionReferenced(E->getLocStart(),
10078                                        SemaRef.LookupDestructor(Record));
10079       }
10080     }
10081 
10082     return E;
10083   }
10084 
10085   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
10086                                            E->isGlobalDelete(),
10087                                            E->isArrayForm(),
10088                                            Operand.get());
10089 }
10090 
10091 template<typename Derived>
10092 ExprResult
10093 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10094                                                      CXXPseudoDestructorExpr *E) {
10095   ExprResult Base = getDerived().TransformExpr(E->getBase());
10096   if (Base.isInvalid())
10097     return ExprError();
10098 
10099   ParsedType ObjectTypePtr;
10100   bool MayBePseudoDestructor = false;
10101   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10102                                               E->getOperatorLoc(),
10103                                         E->isArrow()? tok::arrow : tok::period,
10104                                               ObjectTypePtr,
10105                                               MayBePseudoDestructor);
10106   if (Base.isInvalid())
10107     return ExprError();
10108 
10109   QualType ObjectType = ObjectTypePtr.get();
10110   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10111   if (QualifierLoc) {
10112     QualifierLoc
10113       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10114     if (!QualifierLoc)
10115       return ExprError();
10116   }
10117   CXXScopeSpec SS;
10118   SS.Adopt(QualifierLoc);
10119 
10120   PseudoDestructorTypeStorage Destroyed;
10121   if (E->getDestroyedTypeInfo()) {
10122     TypeSourceInfo *DestroyedTypeInfo
10123       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10124                                                 ObjectType, nullptr, SS);
10125     if (!DestroyedTypeInfo)
10126       return ExprError();
10127     Destroyed = DestroyedTypeInfo;
10128   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10129     // We aren't likely to be able to resolve the identifier down to a type
10130     // now anyway, so just retain the identifier.
10131     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10132                                             E->getDestroyedTypeLoc());
10133   } else {
10134     // Look for a destructor known with the given name.
10135     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10136                                               *E->getDestroyedTypeIdentifier(),
10137                                                 E->getDestroyedTypeLoc(),
10138                                                 /*Scope=*/nullptr,
10139                                                 SS, ObjectTypePtr,
10140                                                 false);
10141     if (!T)
10142       return ExprError();
10143 
10144     Destroyed
10145       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10146                                                  E->getDestroyedTypeLoc());
10147   }
10148 
10149   TypeSourceInfo *ScopeTypeInfo = nullptr;
10150   if (E->getScopeTypeInfo()) {
10151     CXXScopeSpec EmptySS;
10152     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10153                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10154     if (!ScopeTypeInfo)
10155       return ExprError();
10156   }
10157 
10158   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10159                                                      E->getOperatorLoc(),
10160                                                      E->isArrow(),
10161                                                      SS,
10162                                                      ScopeTypeInfo,
10163                                                      E->getColonColonLoc(),
10164                                                      E->getTildeLoc(),
10165                                                      Destroyed);
10166 }
10167 
10168 template <typename Derived>
10169 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10170                                                         bool RequiresADL,
10171                                                         LookupResult &R) {
10172   // Transform all the decls.
10173   bool AllEmptyPacks = true;
10174   for (auto *OldD : Old->decls()) {
10175     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10176     if (!InstD) {
10177       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10178       // This can happen because of dependent hiding.
10179       if (isa<UsingShadowDecl>(OldD))
10180         continue;
10181       else {
10182         R.clear();
10183         return true;
10184       }
10185     }
10186 
10187     // Expand using pack declarations.
10188     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10189     ArrayRef<NamedDecl*> Decls = SingleDecl;
10190     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10191       Decls = UPD->expansions();
10192 
10193     // Expand using declarations.
10194     for (auto *D : Decls) {
10195       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10196         for (auto *SD : UD->shadows())
10197           R.addDecl(SD);
10198       } else {
10199         R.addDecl(D);
10200       }
10201     }
10202 
10203     AllEmptyPacks &= Decls.empty();
10204   };
10205 
10206   // C++ [temp.res]/8.4.2:
10207   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10208   //   a name in the template definition found a using-declaration, but the
10209   //   lookup in the corresponding scope in the instantiation odoes not find
10210   //   any declarations because the using-declaration was a pack expansion and
10211   //   the corresponding pack is empty
10212   if (AllEmptyPacks && !RequiresADL) {
10213     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10214         << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName();
10215     return true;
10216   }
10217 
10218   // Resolve a kind, but don't do any further analysis.  If it's
10219   // ambiguous, the callee needs to deal with it.
10220   R.resolveKind();
10221   return false;
10222 }
10223 
10224 template<typename Derived>
10225 ExprResult
10226 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10227                                                   UnresolvedLookupExpr *Old) {
10228   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10229                  Sema::LookupOrdinaryName);
10230 
10231   // Transform the declaration set.
10232   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10233     return ExprError();
10234 
10235   // Rebuild the nested-name qualifier, if present.
10236   CXXScopeSpec SS;
10237   if (Old->getQualifierLoc()) {
10238     NestedNameSpecifierLoc QualifierLoc
10239       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10240     if (!QualifierLoc)
10241       return ExprError();
10242 
10243     SS.Adopt(QualifierLoc);
10244   }
10245 
10246   if (Old->getNamingClass()) {
10247     CXXRecordDecl *NamingClass
10248       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10249                                                             Old->getNameLoc(),
10250                                                         Old->getNamingClass()));
10251     if (!NamingClass) {
10252       R.clear();
10253       return ExprError();
10254     }
10255 
10256     R.setNamingClass(NamingClass);
10257   }
10258 
10259   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10260 
10261   // If we have neither explicit template arguments, nor the template keyword,
10262   // it's a normal declaration name or member reference.
10263   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10264     NamedDecl *D = R.getAsSingle<NamedDecl>();
10265     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10266     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10267     // give a good diagnostic.
10268     if (D && D->isCXXInstanceMember()) {
10269       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10270                                                      /*TemplateArgs=*/nullptr,
10271                                                      /*Scope=*/nullptr);
10272     }
10273 
10274     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10275   }
10276 
10277   // If we have template arguments, rebuild them, then rebuild the
10278   // templateid expression.
10279   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10280   if (Old->hasExplicitTemplateArgs() &&
10281       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10282                                               Old->getNumTemplateArgs(),
10283                                               TransArgs)) {
10284     R.clear();
10285     return ExprError();
10286   }
10287 
10288   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10289                                             Old->requiresADL(), &TransArgs);
10290 }
10291 
10292 template<typename Derived>
10293 ExprResult
10294 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10295   bool ArgChanged = false;
10296   SmallVector<TypeSourceInfo *, 4> Args;
10297   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10298     TypeSourceInfo *From = E->getArg(I);
10299     TypeLoc FromTL = From->getTypeLoc();
10300     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10301       TypeLocBuilder TLB;
10302       TLB.reserve(FromTL.getFullDataSize());
10303       QualType To = getDerived().TransformType(TLB, FromTL);
10304       if (To.isNull())
10305         return ExprError();
10306 
10307       if (To == From->getType())
10308         Args.push_back(From);
10309       else {
10310         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10311         ArgChanged = true;
10312       }
10313       continue;
10314     }
10315 
10316     ArgChanged = true;
10317 
10318     // We have a pack expansion. Instantiate it.
10319     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10320     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10321     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10322     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10323 
10324     // Determine whether the set of unexpanded parameter packs can and should
10325     // be expanded.
10326     bool Expand = true;
10327     bool RetainExpansion = false;
10328     Optional<unsigned> OrigNumExpansions =
10329         ExpansionTL.getTypePtr()->getNumExpansions();
10330     Optional<unsigned> NumExpansions = OrigNumExpansions;
10331     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10332                                              PatternTL.getSourceRange(),
10333                                              Unexpanded,
10334                                              Expand, RetainExpansion,
10335                                              NumExpansions))
10336       return ExprError();
10337 
10338     if (!Expand) {
10339       // The transform has determined that we should perform a simple
10340       // transformation on the pack expansion, producing another pack
10341       // expansion.
10342       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10343 
10344       TypeLocBuilder TLB;
10345       TLB.reserve(From->getTypeLoc().getFullDataSize());
10346 
10347       QualType To = getDerived().TransformType(TLB, PatternTL);
10348       if (To.isNull())
10349         return ExprError();
10350 
10351       To = getDerived().RebuildPackExpansionType(To,
10352                                                  PatternTL.getSourceRange(),
10353                                                  ExpansionTL.getEllipsisLoc(),
10354                                                  NumExpansions);
10355       if (To.isNull())
10356         return ExprError();
10357 
10358       PackExpansionTypeLoc ToExpansionTL
10359         = TLB.push<PackExpansionTypeLoc>(To);
10360       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10361       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10362       continue;
10363     }
10364 
10365     // Expand the pack expansion by substituting for each argument in the
10366     // pack(s).
10367     for (unsigned I = 0; I != *NumExpansions; ++I) {
10368       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10369       TypeLocBuilder TLB;
10370       TLB.reserve(PatternTL.getFullDataSize());
10371       QualType To = getDerived().TransformType(TLB, PatternTL);
10372       if (To.isNull())
10373         return ExprError();
10374 
10375       if (To->containsUnexpandedParameterPack()) {
10376         To = getDerived().RebuildPackExpansionType(To,
10377                                                    PatternTL.getSourceRange(),
10378                                                    ExpansionTL.getEllipsisLoc(),
10379                                                    NumExpansions);
10380         if (To.isNull())
10381           return ExprError();
10382 
10383         PackExpansionTypeLoc ToExpansionTL
10384           = TLB.push<PackExpansionTypeLoc>(To);
10385         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10386       }
10387 
10388       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10389     }
10390 
10391     if (!RetainExpansion)
10392       continue;
10393 
10394     // If we're supposed to retain a pack expansion, do so by temporarily
10395     // forgetting the partially-substituted parameter pack.
10396     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10397 
10398     TypeLocBuilder TLB;
10399     TLB.reserve(From->getTypeLoc().getFullDataSize());
10400 
10401     QualType To = getDerived().TransformType(TLB, PatternTL);
10402     if (To.isNull())
10403       return ExprError();
10404 
10405     To = getDerived().RebuildPackExpansionType(To,
10406                                                PatternTL.getSourceRange(),
10407                                                ExpansionTL.getEllipsisLoc(),
10408                                                NumExpansions);
10409     if (To.isNull())
10410       return ExprError();
10411 
10412     PackExpansionTypeLoc ToExpansionTL
10413       = TLB.push<PackExpansionTypeLoc>(To);
10414     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10415     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10416   }
10417 
10418   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10419     return E;
10420 
10421   return getDerived().RebuildTypeTrait(E->getTrait(),
10422                                        E->getLocStart(),
10423                                        Args,
10424                                        E->getLocEnd());
10425 }
10426 
10427 template<typename Derived>
10428 ExprResult
10429 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10430   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10431   if (!T)
10432     return ExprError();
10433 
10434   if (!getDerived().AlwaysRebuild() &&
10435       T == E->getQueriedTypeSourceInfo())
10436     return E;
10437 
10438   ExprResult SubExpr;
10439   {
10440     EnterExpressionEvaluationContext Unevaluated(
10441         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10442     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10443     if (SubExpr.isInvalid())
10444       return ExprError();
10445 
10446     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10447       return E;
10448   }
10449 
10450   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10451                                             E->getLocStart(),
10452                                             T,
10453                                             SubExpr.get(),
10454                                             E->getLocEnd());
10455 }
10456 
10457 template<typename Derived>
10458 ExprResult
10459 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10460   ExprResult SubExpr;
10461   {
10462     EnterExpressionEvaluationContext Unevaluated(
10463         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10464     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10465     if (SubExpr.isInvalid())
10466       return ExprError();
10467 
10468     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10469       return E;
10470   }
10471 
10472   return getDerived().RebuildExpressionTrait(
10473       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10474 }
10475 
10476 template <typename Derived>
10477 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10478     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10479     TypeSourceInfo **RecoveryTSI) {
10480   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10481       DRE, AddrTaken, RecoveryTSI);
10482 
10483   // Propagate both errors and recovered types, which return ExprEmpty.
10484   if (!NewDRE.isUsable())
10485     return NewDRE;
10486 
10487   // We got an expr, wrap it up in parens.
10488   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10489     return PE;
10490   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10491                                        PE->getRParen());
10492 }
10493 
10494 template <typename Derived>
10495 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10496     DependentScopeDeclRefExpr *E) {
10497   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10498                                             nullptr);
10499 }
10500 
10501 template<typename Derived>
10502 ExprResult
10503 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10504                                                DependentScopeDeclRefExpr *E,
10505                                                bool IsAddressOfOperand,
10506                                                TypeSourceInfo **RecoveryTSI) {
10507   assert(E->getQualifierLoc());
10508   NestedNameSpecifierLoc QualifierLoc
10509   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10510   if (!QualifierLoc)
10511     return ExprError();
10512   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10513 
10514   // TODO: If this is a conversion-function-id, verify that the
10515   // destination type name (if present) resolves the same way after
10516   // instantiation as it did in the local scope.
10517 
10518   DeclarationNameInfo NameInfo
10519     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10520   if (!NameInfo.getName())
10521     return ExprError();
10522 
10523   if (!E->hasExplicitTemplateArgs()) {
10524     if (!getDerived().AlwaysRebuild() &&
10525         QualifierLoc == E->getQualifierLoc() &&
10526         // Note: it is sufficient to compare the Name component of NameInfo:
10527         // if name has not changed, DNLoc has not changed either.
10528         NameInfo.getName() == E->getDeclName())
10529       return E;
10530 
10531     return getDerived().RebuildDependentScopeDeclRefExpr(
10532         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10533         IsAddressOfOperand, RecoveryTSI);
10534   }
10535 
10536   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10537   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10538                                               E->getNumTemplateArgs(),
10539                                               TransArgs))
10540     return ExprError();
10541 
10542   return getDerived().RebuildDependentScopeDeclRefExpr(
10543       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10544       RecoveryTSI);
10545 }
10546 
10547 template<typename Derived>
10548 ExprResult
10549 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10550   // CXXConstructExprs other than for list-initialization and
10551   // CXXTemporaryObjectExpr are always implicit, so when we have
10552   // a 1-argument construction we just transform that argument.
10553   if ((E->getNumArgs() == 1 ||
10554        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10555       (!getDerived().DropCallArgument(E->getArg(0))) &&
10556       !E->isListInitialization())
10557     return getDerived().TransformExpr(E->getArg(0));
10558 
10559   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10560 
10561   QualType T = getDerived().TransformType(E->getType());
10562   if (T.isNull())
10563     return ExprError();
10564 
10565   CXXConstructorDecl *Constructor
10566     = cast_or_null<CXXConstructorDecl>(
10567                                 getDerived().TransformDecl(E->getLocStart(),
10568                                                          E->getConstructor()));
10569   if (!Constructor)
10570     return ExprError();
10571 
10572   bool ArgumentChanged = false;
10573   SmallVector<Expr*, 8> Args;
10574   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10575                                   &ArgumentChanged))
10576     return ExprError();
10577 
10578   if (!getDerived().AlwaysRebuild() &&
10579       T == E->getType() &&
10580       Constructor == E->getConstructor() &&
10581       !ArgumentChanged) {
10582     // Mark the constructor as referenced.
10583     // FIXME: Instantiation-specific
10584     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10585     return E;
10586   }
10587 
10588   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10589                                               Constructor,
10590                                               E->isElidable(), Args,
10591                                               E->hadMultipleCandidates(),
10592                                               E->isListInitialization(),
10593                                               E->isStdInitListInitialization(),
10594                                               E->requiresZeroInitialization(),
10595                                               E->getConstructionKind(),
10596                                               E->getParenOrBraceRange());
10597 }
10598 
10599 template<typename Derived>
10600 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10601     CXXInheritedCtorInitExpr *E) {
10602   QualType T = getDerived().TransformType(E->getType());
10603   if (T.isNull())
10604     return ExprError();
10605 
10606   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10607       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10608   if (!Constructor)
10609     return ExprError();
10610 
10611   if (!getDerived().AlwaysRebuild() &&
10612       T == E->getType() &&
10613       Constructor == E->getConstructor()) {
10614     // Mark the constructor as referenced.
10615     // FIXME: Instantiation-specific
10616     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10617     return E;
10618   }
10619 
10620   return getDerived().RebuildCXXInheritedCtorInitExpr(
10621       T, E->getLocation(), Constructor,
10622       E->constructsVBase(), E->inheritedFromVBase());
10623 }
10624 
10625 /// \brief Transform a C++ temporary-binding expression.
10626 ///
10627 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10628 /// transform the subexpression and return that.
10629 template<typename Derived>
10630 ExprResult
10631 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10632   return getDerived().TransformExpr(E->getSubExpr());
10633 }
10634 
10635 /// \brief Transform a C++ expression that contains cleanups that should
10636 /// be run after the expression is evaluated.
10637 ///
10638 /// Since ExprWithCleanups nodes are implicitly generated, we
10639 /// just transform the subexpression and return that.
10640 template<typename Derived>
10641 ExprResult
10642 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10643   return getDerived().TransformExpr(E->getSubExpr());
10644 }
10645 
10646 template<typename Derived>
10647 ExprResult
10648 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10649                                                     CXXTemporaryObjectExpr *E) {
10650   TypeSourceInfo *T =
10651       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
10652   if (!T)
10653     return ExprError();
10654 
10655   CXXConstructorDecl *Constructor
10656     = cast_or_null<CXXConstructorDecl>(
10657                                   getDerived().TransformDecl(E->getLocStart(),
10658                                                          E->getConstructor()));
10659   if (!Constructor)
10660     return ExprError();
10661 
10662   bool ArgumentChanged = false;
10663   SmallVector<Expr*, 8> Args;
10664   Args.reserve(E->getNumArgs());
10665   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10666                      &ArgumentChanged))
10667     return ExprError();
10668 
10669   if (!getDerived().AlwaysRebuild() &&
10670       T == E->getTypeSourceInfo() &&
10671       Constructor == E->getConstructor() &&
10672       !ArgumentChanged) {
10673     // FIXME: Instantiation-specific
10674     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10675     return SemaRef.MaybeBindToTemporary(E);
10676   }
10677 
10678   // FIXME: Pass in E->isListInitialization().
10679   return getDerived().RebuildCXXTemporaryObjectExpr(T,
10680                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10681                                                     Args,
10682                                                     E->getLocEnd());
10683 }
10684 
10685 template<typename Derived>
10686 ExprResult
10687 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10688   // Transform any init-capture expressions before entering the scope of the
10689   // lambda body, because they are not semantically within that scope.
10690   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10691   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10692   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10693                                   E->explicit_capture_begin());
10694   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10695                                     CEnd = E->capture_end();
10696        C != CEnd; ++C) {
10697     if (!E->isInitCapture(C))
10698       continue;
10699     EnterExpressionEvaluationContext EEEC(
10700         getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
10701     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10702         C->getCapturedVar()->getInit(),
10703         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10704 
10705     if (NewExprInitResult.isInvalid())
10706       return ExprError();
10707     Expr *NewExprInit = NewExprInitResult.get();
10708 
10709     VarDecl *OldVD = C->getCapturedVar();
10710     QualType NewInitCaptureType =
10711         getSema().buildLambdaInitCaptureInitialization(
10712             C->getLocation(), OldVD->getType()->isReferenceType(),
10713             OldVD->getIdentifier(),
10714             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10715     NewExprInitResult = NewExprInit;
10716     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10717         std::make_pair(NewExprInitResult, NewInitCaptureType);
10718   }
10719 
10720   // Transform the template parameters, and add them to the current
10721   // instantiation scope. The null case is handled correctly.
10722   auto TPL = getDerived().TransformTemplateParameterList(
10723       E->getTemplateParameterList());
10724 
10725   // Transform the type of the original lambda's call operator.
10726   // The transformation MUST be done in the CurrentInstantiationScope since
10727   // it introduces a mapping of the original to the newly created
10728   // transformed parameters.
10729   TypeSourceInfo *NewCallOpTSI = nullptr;
10730   {
10731     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10732     FunctionProtoTypeLoc OldCallOpFPTL =
10733         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10734 
10735     TypeLocBuilder NewCallOpTLBuilder;
10736     SmallVector<QualType, 4> ExceptionStorage;
10737     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10738     QualType NewCallOpType = TransformFunctionProtoType(
10739         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10740         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10741           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10742                                               ExceptionStorage, Changed);
10743         });
10744     if (NewCallOpType.isNull())
10745       return ExprError();
10746     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10747                                                         NewCallOpType);
10748   }
10749 
10750   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10751   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10752   LSI->GLTemplateParameterList = TPL;
10753 
10754   // Create the local class that will describe the lambda.
10755   CXXRecordDecl *Class
10756     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10757                                         NewCallOpTSI,
10758                                         /*KnownDependent=*/false,
10759                                         E->getCaptureDefault());
10760   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10761 
10762   // Build the call operator.
10763   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10764       Class, E->getIntroducerRange(), NewCallOpTSI,
10765       E->getCallOperator()->getLocEnd(),
10766       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10767       E->getCallOperator()->isConstexpr());
10768 
10769   LSI->CallOperator = NewCallOperator;
10770 
10771   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10772        I != NumParams; ++I) {
10773     auto *P = NewCallOperator->getParamDecl(I);
10774     if (P->hasUninstantiatedDefaultArg()) {
10775       EnterExpressionEvaluationContext Eval(
10776           getSema(),
10777           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
10778       ExprResult R = getDerived().TransformExpr(
10779           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10780       P->setDefaultArg(R.get());
10781     }
10782   }
10783 
10784   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10785   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10786 
10787   // Introduce the context of the call operator.
10788   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10789                                  /*NewThisContext*/false);
10790 
10791   // Enter the scope of the lambda.
10792   getSema().buildLambdaScope(LSI, NewCallOperator,
10793                              E->getIntroducerRange(),
10794                              E->getCaptureDefault(),
10795                              E->getCaptureDefaultLoc(),
10796                              E->hasExplicitParameters(),
10797                              E->hasExplicitResultType(),
10798                              E->isMutable());
10799 
10800   bool Invalid = false;
10801 
10802   // Transform captures.
10803   bool FinishedExplicitCaptures = false;
10804   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10805                                  CEnd = E->capture_end();
10806        C != CEnd; ++C) {
10807     // When we hit the first implicit capture, tell Sema that we've finished
10808     // the list of explicit captures.
10809     if (!FinishedExplicitCaptures && C->isImplicit()) {
10810       getSema().finishLambdaExplicitCaptures(LSI);
10811       FinishedExplicitCaptures = true;
10812     }
10813 
10814     // Capturing 'this' is trivial.
10815     if (C->capturesThis()) {
10816       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10817                                     /*BuildAndDiagnose*/ true, nullptr,
10818                                     C->getCaptureKind() == LCK_StarThis);
10819       continue;
10820     }
10821     // Captured expression will be recaptured during captured variables
10822     // rebuilding.
10823     if (C->capturesVLAType())
10824       continue;
10825 
10826     // Rebuild init-captures, including the implied field declaration.
10827     if (E->isInitCapture(C)) {
10828       InitCaptureInfoTy InitExprTypePair =
10829           InitCaptureExprsAndTypes[C - E->capture_begin()];
10830       ExprResult Init = InitExprTypePair.first;
10831       QualType InitQualType = InitExprTypePair.second;
10832       if (Init.isInvalid() || InitQualType.isNull()) {
10833         Invalid = true;
10834         continue;
10835       }
10836       VarDecl *OldVD = C->getCapturedVar();
10837       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
10838           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
10839           OldVD->getInitStyle(), Init.get());
10840       if (!NewVD)
10841         Invalid = true;
10842       else {
10843         getDerived().transformedLocalDecl(OldVD, NewVD);
10844       }
10845       getSema().buildInitCaptureField(LSI, NewVD);
10846       continue;
10847     }
10848 
10849     assert(C->capturesVariable() && "unexpected kind of lambda capture");
10850 
10851     // Determine the capture kind for Sema.
10852     Sema::TryCaptureKind Kind
10853       = C->isImplicit()? Sema::TryCapture_Implicit
10854                        : C->getCaptureKind() == LCK_ByCopy
10855                            ? Sema::TryCapture_ExplicitByVal
10856                            : Sema::TryCapture_ExplicitByRef;
10857     SourceLocation EllipsisLoc;
10858     if (C->isPackExpansion()) {
10859       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
10860       bool ShouldExpand = false;
10861       bool RetainExpansion = false;
10862       Optional<unsigned> NumExpansions;
10863       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
10864                                                C->getLocation(),
10865                                                Unexpanded,
10866                                                ShouldExpand, RetainExpansion,
10867                                                NumExpansions)) {
10868         Invalid = true;
10869         continue;
10870       }
10871 
10872       if (ShouldExpand) {
10873         // The transform has determined that we should perform an expansion;
10874         // transform and capture each of the arguments.
10875         // expansion of the pattern. Do so.
10876         VarDecl *Pack = C->getCapturedVar();
10877         for (unsigned I = 0; I != *NumExpansions; ++I) {
10878           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
10879           VarDecl *CapturedVar
10880             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10881                                                                Pack));
10882           if (!CapturedVar) {
10883             Invalid = true;
10884             continue;
10885           }
10886 
10887           // Capture the transformed variable.
10888           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
10889         }
10890 
10891         // FIXME: Retain a pack expansion if RetainExpansion is true.
10892 
10893         continue;
10894       }
10895 
10896       EllipsisLoc = C->getEllipsisLoc();
10897     }
10898 
10899     // Transform the captured variable.
10900     VarDecl *CapturedVar
10901       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10902                                                          C->getCapturedVar()));
10903     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
10904       Invalid = true;
10905       continue;
10906     }
10907 
10908     // Capture the transformed variable.
10909     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
10910                                  EllipsisLoc);
10911   }
10912   if (!FinishedExplicitCaptures)
10913     getSema().finishLambdaExplicitCaptures(LSI);
10914 
10915   // Enter a new evaluation context to insulate the lambda from any
10916   // cleanups from the enclosing full-expression.
10917   getSema().PushExpressionEvaluationContext(
10918       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
10919 
10920   // Instantiate the body of the lambda expression.
10921   StmtResult Body =
10922       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
10923 
10924   // ActOnLambda* will pop the function scope for us.
10925   FuncScopeCleanup.disable();
10926 
10927   if (Body.isInvalid()) {
10928     SavedContext.pop();
10929     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
10930                                /*IsInstantiation=*/true);
10931     return ExprError();
10932   }
10933 
10934   // Copy the LSI before ActOnFinishFunctionBody removes it.
10935   // FIXME: This is dumb. Store the lambda information somewhere that outlives
10936   // the call operator.
10937   auto LSICopy = *LSI;
10938   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
10939                                     /*IsInstantiation*/ true);
10940   SavedContext.pop();
10941 
10942   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
10943                                    &LSICopy);
10944 }
10945 
10946 template<typename Derived>
10947 ExprResult
10948 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
10949                                                   CXXUnresolvedConstructExpr *E) {
10950   TypeSourceInfo *T =
10951       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
10952   if (!T)
10953     return ExprError();
10954 
10955   bool ArgumentChanged = false;
10956   SmallVector<Expr*, 8> Args;
10957   Args.reserve(E->arg_size());
10958   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
10959                                   &ArgumentChanged))
10960     return ExprError();
10961 
10962   if (!getDerived().AlwaysRebuild() &&
10963       T == E->getTypeSourceInfo() &&
10964       !ArgumentChanged)
10965     return E;
10966 
10967   // FIXME: we're faking the locations of the commas
10968   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
10969                                                         E->getLParenLoc(),
10970                                                         Args,
10971                                                         E->getRParenLoc());
10972 }
10973 
10974 template<typename Derived>
10975 ExprResult
10976 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
10977                                              CXXDependentScopeMemberExpr *E) {
10978   // Transform the base of the expression.
10979   ExprResult Base((Expr*) nullptr);
10980   Expr *OldBase;
10981   QualType BaseType;
10982   QualType ObjectType;
10983   if (!E->isImplicitAccess()) {
10984     OldBase = E->getBase();
10985     Base = getDerived().TransformExpr(OldBase);
10986     if (Base.isInvalid())
10987       return ExprError();
10988 
10989     // Start the member reference and compute the object's type.
10990     ParsedType ObjectTy;
10991     bool MayBePseudoDestructor = false;
10992     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10993                                                 E->getOperatorLoc(),
10994                                       E->isArrow()? tok::arrow : tok::period,
10995                                                 ObjectTy,
10996                                                 MayBePseudoDestructor);
10997     if (Base.isInvalid())
10998       return ExprError();
10999 
11000     ObjectType = ObjectTy.get();
11001     BaseType = ((Expr*) Base.get())->getType();
11002   } else {
11003     OldBase = nullptr;
11004     BaseType = getDerived().TransformType(E->getBaseType());
11005     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11006   }
11007 
11008   // Transform the first part of the nested-name-specifier that qualifies
11009   // the member name.
11010   NamedDecl *FirstQualifierInScope
11011     = getDerived().TransformFirstQualifierInScope(
11012                                             E->getFirstQualifierFoundInScope(),
11013                                             E->getQualifierLoc().getBeginLoc());
11014 
11015   NestedNameSpecifierLoc QualifierLoc;
11016   if (E->getQualifier()) {
11017     QualifierLoc
11018       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11019                                                      ObjectType,
11020                                                      FirstQualifierInScope);
11021     if (!QualifierLoc)
11022       return ExprError();
11023   }
11024 
11025   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11026 
11027   // TODO: If this is a conversion-function-id, verify that the
11028   // destination type name (if present) resolves the same way after
11029   // instantiation as it did in the local scope.
11030 
11031   DeclarationNameInfo NameInfo
11032     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11033   if (!NameInfo.getName())
11034     return ExprError();
11035 
11036   if (!E->hasExplicitTemplateArgs()) {
11037     // This is a reference to a member without an explicitly-specified
11038     // template argument list. Optimize for this common case.
11039     if (!getDerived().AlwaysRebuild() &&
11040         Base.get() == OldBase &&
11041         BaseType == E->getBaseType() &&
11042         QualifierLoc == E->getQualifierLoc() &&
11043         NameInfo.getName() == E->getMember() &&
11044         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11045       return E;
11046 
11047     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11048                                                        BaseType,
11049                                                        E->isArrow(),
11050                                                        E->getOperatorLoc(),
11051                                                        QualifierLoc,
11052                                                        TemplateKWLoc,
11053                                                        FirstQualifierInScope,
11054                                                        NameInfo,
11055                                                        /*TemplateArgs*/nullptr);
11056   }
11057 
11058   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11059   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11060                                               E->getNumTemplateArgs(),
11061                                               TransArgs))
11062     return ExprError();
11063 
11064   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11065                                                      BaseType,
11066                                                      E->isArrow(),
11067                                                      E->getOperatorLoc(),
11068                                                      QualifierLoc,
11069                                                      TemplateKWLoc,
11070                                                      FirstQualifierInScope,
11071                                                      NameInfo,
11072                                                      &TransArgs);
11073 }
11074 
11075 template<typename Derived>
11076 ExprResult
11077 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11078   // Transform the base of the expression.
11079   ExprResult Base((Expr*) nullptr);
11080   QualType BaseType;
11081   if (!Old->isImplicitAccess()) {
11082     Base = getDerived().TransformExpr(Old->getBase());
11083     if (Base.isInvalid())
11084       return ExprError();
11085     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11086                                                      Old->isArrow());
11087     if (Base.isInvalid())
11088       return ExprError();
11089     BaseType = Base.get()->getType();
11090   } else {
11091     BaseType = getDerived().TransformType(Old->getBaseType());
11092   }
11093 
11094   NestedNameSpecifierLoc QualifierLoc;
11095   if (Old->getQualifierLoc()) {
11096     QualifierLoc
11097     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11098     if (!QualifierLoc)
11099       return ExprError();
11100   }
11101 
11102   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11103 
11104   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11105                  Sema::LookupOrdinaryName);
11106 
11107   // Transform the declaration set.
11108   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11109     return ExprError();
11110 
11111   // Determine the naming class.
11112   if (Old->getNamingClass()) {
11113     CXXRecordDecl *NamingClass
11114       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11115                                                           Old->getMemberLoc(),
11116                                                         Old->getNamingClass()));
11117     if (!NamingClass)
11118       return ExprError();
11119 
11120     R.setNamingClass(NamingClass);
11121   }
11122 
11123   TemplateArgumentListInfo TransArgs;
11124   if (Old->hasExplicitTemplateArgs()) {
11125     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11126     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11127     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11128                                                 Old->getNumTemplateArgs(),
11129                                                 TransArgs))
11130       return ExprError();
11131   }
11132 
11133   // FIXME: to do this check properly, we will need to preserve the
11134   // first-qualifier-in-scope here, just in case we had a dependent
11135   // base (and therefore couldn't do the check) and a
11136   // nested-name-qualifier (and therefore could do the lookup).
11137   NamedDecl *FirstQualifierInScope = nullptr;
11138 
11139   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11140                                                   BaseType,
11141                                                   Old->getOperatorLoc(),
11142                                                   Old->isArrow(),
11143                                                   QualifierLoc,
11144                                                   TemplateKWLoc,
11145                                                   FirstQualifierInScope,
11146                                                   R,
11147                                               (Old->hasExplicitTemplateArgs()
11148                                                   ? &TransArgs : nullptr));
11149 }
11150 
11151 template<typename Derived>
11152 ExprResult
11153 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11154   EnterExpressionEvaluationContext Unevaluated(
11155       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11156   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11157   if (SubExpr.isInvalid())
11158     return ExprError();
11159 
11160   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11161     return E;
11162 
11163   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11164 }
11165 
11166 template<typename Derived>
11167 ExprResult
11168 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11169   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11170   if (Pattern.isInvalid())
11171     return ExprError();
11172 
11173   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11174     return E;
11175 
11176   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11177                                            E->getNumExpansions());
11178 }
11179 
11180 template<typename Derived>
11181 ExprResult
11182 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11183   // If E is not value-dependent, then nothing will change when we transform it.
11184   // Note: This is an instantiation-centric view.
11185   if (!E->isValueDependent())
11186     return E;
11187 
11188   EnterExpressionEvaluationContext Unevaluated(
11189       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11190 
11191   ArrayRef<TemplateArgument> PackArgs;
11192   TemplateArgument ArgStorage;
11193 
11194   // Find the argument list to transform.
11195   if (E->isPartiallySubstituted()) {
11196     PackArgs = E->getPartialArguments();
11197   } else if (E->isValueDependent()) {
11198     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11199     bool ShouldExpand = false;
11200     bool RetainExpansion = false;
11201     Optional<unsigned> NumExpansions;
11202     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11203                                              Unexpanded,
11204                                              ShouldExpand, RetainExpansion,
11205                                              NumExpansions))
11206       return ExprError();
11207 
11208     // If we need to expand the pack, build a template argument from it and
11209     // expand that.
11210     if (ShouldExpand) {
11211       auto *Pack = E->getPack();
11212       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11213         ArgStorage = getSema().Context.getPackExpansionType(
11214             getSema().Context.getTypeDeclType(TTPD), None);
11215       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11216         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11217       } else {
11218         auto *VD = cast<ValueDecl>(Pack);
11219         ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
11220                                                     VK_RValue, E->getPackLoc());
11221         if (DRE.isInvalid())
11222           return ExprError();
11223         ArgStorage = new (getSema().Context) PackExpansionExpr(
11224             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11225       }
11226       PackArgs = ArgStorage;
11227     }
11228   }
11229 
11230   // If we're not expanding the pack, just transform the decl.
11231   if (!PackArgs.size()) {
11232     auto *Pack = cast_or_null<NamedDecl>(
11233         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11234     if (!Pack)
11235       return ExprError();
11236     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11237                                               E->getPackLoc(),
11238                                               E->getRParenLoc(), None, None);
11239   }
11240 
11241   // Try to compute the result without performing a partial substitution.
11242   Optional<unsigned> Result = 0;
11243   for (const TemplateArgument &Arg : PackArgs) {
11244     if (!Arg.isPackExpansion()) {
11245       Result = *Result + 1;
11246       continue;
11247     }
11248 
11249     TemplateArgumentLoc ArgLoc;
11250     InventTemplateArgumentLoc(Arg, ArgLoc);
11251 
11252     // Find the pattern of the pack expansion.
11253     SourceLocation Ellipsis;
11254     Optional<unsigned> OrigNumExpansions;
11255     TemplateArgumentLoc Pattern =
11256         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11257                                                           OrigNumExpansions);
11258 
11259     // Substitute under the pack expansion. Do not expand the pack (yet).
11260     TemplateArgumentLoc OutPattern;
11261     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11262     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11263                                                /*Uneval*/ true))
11264       return true;
11265 
11266     // See if we can determine the number of arguments from the result.
11267     Optional<unsigned> NumExpansions =
11268         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11269     if (!NumExpansions) {
11270       // No: we must be in an alias template expansion, and we're going to need
11271       // to actually expand the packs.
11272       Result = None;
11273       break;
11274     }
11275 
11276     Result = *Result + *NumExpansions;
11277   }
11278 
11279   // Common case: we could determine the number of expansions without
11280   // substituting.
11281   if (Result)
11282     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11283                                               E->getPackLoc(),
11284                                               E->getRParenLoc(), *Result, None);
11285 
11286   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11287                                                E->getPackLoc());
11288   {
11289     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11290     typedef TemplateArgumentLocInventIterator<
11291         Derived, const TemplateArgument*> PackLocIterator;
11292     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11293                                    PackLocIterator(*this, PackArgs.end()),
11294                                    TransformedPackArgs, /*Uneval*/true))
11295       return ExprError();
11296   }
11297 
11298   // Check whether we managed to fully-expand the pack.
11299   // FIXME: Is it possible for us to do so and not hit the early exit path?
11300   SmallVector<TemplateArgument, 8> Args;
11301   bool PartialSubstitution = false;
11302   for (auto &Loc : TransformedPackArgs.arguments()) {
11303     Args.push_back(Loc.getArgument());
11304     if (Loc.getArgument().isPackExpansion())
11305       PartialSubstitution = true;
11306   }
11307 
11308   if (PartialSubstitution)
11309     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11310                                               E->getPackLoc(),
11311                                               E->getRParenLoc(), None, Args);
11312 
11313   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11314                                             E->getPackLoc(), E->getRParenLoc(),
11315                                             Args.size(), None);
11316 }
11317 
11318 template<typename Derived>
11319 ExprResult
11320 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11321                                           SubstNonTypeTemplateParmPackExpr *E) {
11322   // Default behavior is to do nothing with this transformation.
11323   return E;
11324 }
11325 
11326 template<typename Derived>
11327 ExprResult
11328 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11329                                           SubstNonTypeTemplateParmExpr *E) {
11330   // Default behavior is to do nothing with this transformation.
11331   return E;
11332 }
11333 
11334 template<typename Derived>
11335 ExprResult
11336 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11337   // Default behavior is to do nothing with this transformation.
11338   return E;
11339 }
11340 
11341 template<typename Derived>
11342 ExprResult
11343 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11344                                                   MaterializeTemporaryExpr *E) {
11345   return getDerived().TransformExpr(E->GetTemporaryExpr());
11346 }
11347 
11348 template<typename Derived>
11349 ExprResult
11350 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11351   Expr *Pattern = E->getPattern();
11352 
11353   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11354   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11355   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11356 
11357   // Determine whether the set of unexpanded parameter packs can and should
11358   // be expanded.
11359   bool Expand = true;
11360   bool RetainExpansion = false;
11361   Optional<unsigned> NumExpansions;
11362   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11363                                            Pattern->getSourceRange(),
11364                                            Unexpanded,
11365                                            Expand, RetainExpansion,
11366                                            NumExpansions))
11367     return true;
11368 
11369   if (!Expand) {
11370     // Do not expand any packs here, just transform and rebuild a fold
11371     // expression.
11372     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11373 
11374     ExprResult LHS =
11375         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11376     if (LHS.isInvalid())
11377       return true;
11378 
11379     ExprResult RHS =
11380         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11381     if (RHS.isInvalid())
11382       return true;
11383 
11384     if (!getDerived().AlwaysRebuild() &&
11385         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11386       return E;
11387 
11388     return getDerived().RebuildCXXFoldExpr(
11389         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11390         RHS.get(), E->getLocEnd());
11391   }
11392 
11393   // The transform has determined that we should perform an elementwise
11394   // expansion of the pattern. Do so.
11395   ExprResult Result = getDerived().TransformExpr(E->getInit());
11396   if (Result.isInvalid())
11397     return true;
11398   bool LeftFold = E->isLeftFold();
11399 
11400   // If we're retaining an expansion for a right fold, it is the innermost
11401   // component and takes the init (if any).
11402   if (!LeftFold && RetainExpansion) {
11403     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11404 
11405     ExprResult Out = getDerived().TransformExpr(Pattern);
11406     if (Out.isInvalid())
11407       return true;
11408 
11409     Result = getDerived().RebuildCXXFoldExpr(
11410         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11411         Result.get(), E->getLocEnd());
11412     if (Result.isInvalid())
11413       return true;
11414   }
11415 
11416   for (unsigned I = 0; I != *NumExpansions; ++I) {
11417     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11418         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11419     ExprResult Out = getDerived().TransformExpr(Pattern);
11420     if (Out.isInvalid())
11421       return true;
11422 
11423     if (Out.get()->containsUnexpandedParameterPack()) {
11424       // We still have a pack; retain a pack expansion for this slice.
11425       Result = getDerived().RebuildCXXFoldExpr(
11426           E->getLocStart(),
11427           LeftFold ? Result.get() : Out.get(),
11428           E->getOperator(), E->getEllipsisLoc(),
11429           LeftFold ? Out.get() : Result.get(),
11430           E->getLocEnd());
11431     } else if (Result.isUsable()) {
11432       // We've got down to a single element; build a binary operator.
11433       Result = getDerived().RebuildBinaryOperator(
11434           E->getEllipsisLoc(), E->getOperator(),
11435           LeftFold ? Result.get() : Out.get(),
11436           LeftFold ? Out.get() : Result.get());
11437     } else
11438       Result = Out;
11439 
11440     if (Result.isInvalid())
11441       return true;
11442   }
11443 
11444   // If we're retaining an expansion for a left fold, it is the outermost
11445   // component and takes the complete expansion so far as its init (if any).
11446   if (LeftFold && RetainExpansion) {
11447     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11448 
11449     ExprResult Out = getDerived().TransformExpr(Pattern);
11450     if (Out.isInvalid())
11451       return true;
11452 
11453     Result = getDerived().RebuildCXXFoldExpr(
11454         E->getLocStart(), Result.get(),
11455         E->getOperator(), E->getEllipsisLoc(),
11456         Out.get(), E->getLocEnd());
11457     if (Result.isInvalid())
11458       return true;
11459   }
11460 
11461   // If we had no init and an empty pack, and we're not retaining an expansion,
11462   // then produce a fallback value or error.
11463   if (Result.isUnset())
11464     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11465                                                 E->getOperator());
11466 
11467   return Result;
11468 }
11469 
11470 template<typename Derived>
11471 ExprResult
11472 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11473     CXXStdInitializerListExpr *E) {
11474   return getDerived().TransformExpr(E->getSubExpr());
11475 }
11476 
11477 template<typename Derived>
11478 ExprResult
11479 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11480   return SemaRef.MaybeBindToTemporary(E);
11481 }
11482 
11483 template<typename Derived>
11484 ExprResult
11485 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11486   return E;
11487 }
11488 
11489 template<typename Derived>
11490 ExprResult
11491 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11492   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11493   if (SubExpr.isInvalid())
11494     return ExprError();
11495 
11496   if (!getDerived().AlwaysRebuild() &&
11497       SubExpr.get() == E->getSubExpr())
11498     return E;
11499 
11500   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11501 }
11502 
11503 template<typename Derived>
11504 ExprResult
11505 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11506   // Transform each of the elements.
11507   SmallVector<Expr *, 8> Elements;
11508   bool ArgChanged = false;
11509   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11510                                   /*IsCall=*/false, Elements, &ArgChanged))
11511     return ExprError();
11512 
11513   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11514     return SemaRef.MaybeBindToTemporary(E);
11515 
11516   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11517                                               Elements.data(),
11518                                               Elements.size());
11519 }
11520 
11521 template<typename Derived>
11522 ExprResult
11523 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11524                                                     ObjCDictionaryLiteral *E) {
11525   // Transform each of the elements.
11526   SmallVector<ObjCDictionaryElement, 8> Elements;
11527   bool ArgChanged = false;
11528   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11529     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11530 
11531     if (OrigElement.isPackExpansion()) {
11532       // This key/value element is a pack expansion.
11533       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11534       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11535       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11536       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11537 
11538       // Determine whether the set of unexpanded parameter packs can
11539       // and should be expanded.
11540       bool Expand = true;
11541       bool RetainExpansion = false;
11542       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11543       Optional<unsigned> NumExpansions = OrigNumExpansions;
11544       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11545                                OrigElement.Value->getLocEnd());
11546      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11547                                                PatternRange,
11548                                                Unexpanded,
11549                                                Expand, RetainExpansion,
11550                                                NumExpansions))
11551         return ExprError();
11552 
11553       if (!Expand) {
11554         // The transform has determined that we should perform a simple
11555         // transformation on the pack expansion, producing another pack
11556         // expansion.
11557         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11558         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11559         if (Key.isInvalid())
11560           return ExprError();
11561 
11562         if (Key.get() != OrigElement.Key)
11563           ArgChanged = true;
11564 
11565         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11566         if (Value.isInvalid())
11567           return ExprError();
11568 
11569         if (Value.get() != OrigElement.Value)
11570           ArgChanged = true;
11571 
11572         ObjCDictionaryElement Expansion = {
11573           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11574         };
11575         Elements.push_back(Expansion);
11576         continue;
11577       }
11578 
11579       // Record right away that the argument was changed.  This needs
11580       // to happen even if the array expands to nothing.
11581       ArgChanged = true;
11582 
11583       // The transform has determined that we should perform an elementwise
11584       // expansion of the pattern. Do so.
11585       for (unsigned I = 0; I != *NumExpansions; ++I) {
11586         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11587         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11588         if (Key.isInvalid())
11589           return ExprError();
11590 
11591         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11592         if (Value.isInvalid())
11593           return ExprError();
11594 
11595         ObjCDictionaryElement Element = {
11596           Key.get(), Value.get(), SourceLocation(), NumExpansions
11597         };
11598 
11599         // If any unexpanded parameter packs remain, we still have a
11600         // pack expansion.
11601         // FIXME: Can this really happen?
11602         if (Key.get()->containsUnexpandedParameterPack() ||
11603             Value.get()->containsUnexpandedParameterPack())
11604           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11605 
11606         Elements.push_back(Element);
11607       }
11608 
11609       // FIXME: Retain a pack expansion if RetainExpansion is true.
11610 
11611       // We've finished with this pack expansion.
11612       continue;
11613     }
11614 
11615     // Transform and check key.
11616     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11617     if (Key.isInvalid())
11618       return ExprError();
11619 
11620     if (Key.get() != OrigElement.Key)
11621       ArgChanged = true;
11622 
11623     // Transform and check value.
11624     ExprResult Value
11625       = getDerived().TransformExpr(OrigElement.Value);
11626     if (Value.isInvalid())
11627       return ExprError();
11628 
11629     if (Value.get() != OrigElement.Value)
11630       ArgChanged = true;
11631 
11632     ObjCDictionaryElement Element = {
11633       Key.get(), Value.get(), SourceLocation(), None
11634     };
11635     Elements.push_back(Element);
11636   }
11637 
11638   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11639     return SemaRef.MaybeBindToTemporary(E);
11640 
11641   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11642                                                    Elements);
11643 }
11644 
11645 template<typename Derived>
11646 ExprResult
11647 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11648   TypeSourceInfo *EncodedTypeInfo
11649     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11650   if (!EncodedTypeInfo)
11651     return ExprError();
11652 
11653   if (!getDerived().AlwaysRebuild() &&
11654       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11655     return E;
11656 
11657   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11658                                             EncodedTypeInfo,
11659                                             E->getRParenLoc());
11660 }
11661 
11662 template<typename Derived>
11663 ExprResult TreeTransform<Derived>::
11664 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11665   // This is a kind of implicit conversion, and it needs to get dropped
11666   // and recomputed for the same general reasons that ImplicitCastExprs
11667   // do, as well a more specific one: this expression is only valid when
11668   // it appears *immediately* as an argument expression.
11669   return getDerived().TransformExpr(E->getSubExpr());
11670 }
11671 
11672 template<typename Derived>
11673 ExprResult TreeTransform<Derived>::
11674 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11675   TypeSourceInfo *TSInfo
11676     = getDerived().TransformType(E->getTypeInfoAsWritten());
11677   if (!TSInfo)
11678     return ExprError();
11679 
11680   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11681   if (Result.isInvalid())
11682     return ExprError();
11683 
11684   if (!getDerived().AlwaysRebuild() &&
11685       TSInfo == E->getTypeInfoAsWritten() &&
11686       Result.get() == E->getSubExpr())
11687     return E;
11688 
11689   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11690                                       E->getBridgeKeywordLoc(), TSInfo,
11691                                       Result.get());
11692 }
11693 
11694 template <typename Derived>
11695 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11696     ObjCAvailabilityCheckExpr *E) {
11697   return E;
11698 }
11699 
11700 template<typename Derived>
11701 ExprResult
11702 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11703   // Transform arguments.
11704   bool ArgChanged = false;
11705   SmallVector<Expr*, 8> Args;
11706   Args.reserve(E->getNumArgs());
11707   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11708                                   &ArgChanged))
11709     return ExprError();
11710 
11711   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11712     // Class message: transform the receiver type.
11713     TypeSourceInfo *ReceiverTypeInfo
11714       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11715     if (!ReceiverTypeInfo)
11716       return ExprError();
11717 
11718     // If nothing changed, just retain the existing message send.
11719     if (!getDerived().AlwaysRebuild() &&
11720         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11721       return SemaRef.MaybeBindToTemporary(E);
11722 
11723     // Build a new class message send.
11724     SmallVector<SourceLocation, 16> SelLocs;
11725     E->getSelectorLocs(SelLocs);
11726     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11727                                                E->getSelector(),
11728                                                SelLocs,
11729                                                E->getMethodDecl(),
11730                                                E->getLeftLoc(),
11731                                                Args,
11732                                                E->getRightLoc());
11733   }
11734   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11735            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11736     if (!E->getMethodDecl())
11737       return ExprError();
11738 
11739     // Build a new class message send to 'super'.
11740     SmallVector<SourceLocation, 16> SelLocs;
11741     E->getSelectorLocs(SelLocs);
11742     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11743                                                E->getSelector(),
11744                                                SelLocs,
11745                                                E->getReceiverType(),
11746                                                E->getMethodDecl(),
11747                                                E->getLeftLoc(),
11748                                                Args,
11749                                                E->getRightLoc());
11750   }
11751 
11752   // Instance message: transform the receiver
11753   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11754          "Only class and instance messages may be instantiated");
11755   ExprResult Receiver
11756     = getDerived().TransformExpr(E->getInstanceReceiver());
11757   if (Receiver.isInvalid())
11758     return ExprError();
11759 
11760   // If nothing changed, just retain the existing message send.
11761   if (!getDerived().AlwaysRebuild() &&
11762       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11763     return SemaRef.MaybeBindToTemporary(E);
11764 
11765   // Build a new instance message send.
11766   SmallVector<SourceLocation, 16> SelLocs;
11767   E->getSelectorLocs(SelLocs);
11768   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11769                                              E->getSelector(),
11770                                              SelLocs,
11771                                              E->getMethodDecl(),
11772                                              E->getLeftLoc(),
11773                                              Args,
11774                                              E->getRightLoc());
11775 }
11776 
11777 template<typename Derived>
11778 ExprResult
11779 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11780   return E;
11781 }
11782 
11783 template<typename Derived>
11784 ExprResult
11785 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11786   return E;
11787 }
11788 
11789 template<typename Derived>
11790 ExprResult
11791 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11792   // Transform the base expression.
11793   ExprResult Base = getDerived().TransformExpr(E->getBase());
11794   if (Base.isInvalid())
11795     return ExprError();
11796 
11797   // We don't need to transform the ivar; it will never change.
11798 
11799   // If nothing changed, just retain the existing expression.
11800   if (!getDerived().AlwaysRebuild() &&
11801       Base.get() == E->getBase())
11802     return E;
11803 
11804   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11805                                              E->getLocation(),
11806                                              E->isArrow(), E->isFreeIvar());
11807 }
11808 
11809 template<typename Derived>
11810 ExprResult
11811 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11812   // 'super' and types never change. Property never changes. Just
11813   // retain the existing expression.
11814   if (!E->isObjectReceiver())
11815     return E;
11816 
11817   // Transform the base expression.
11818   ExprResult Base = getDerived().TransformExpr(E->getBase());
11819   if (Base.isInvalid())
11820     return ExprError();
11821 
11822   // We don't need to transform the property; it will never change.
11823 
11824   // If nothing changed, just retain the existing expression.
11825   if (!getDerived().AlwaysRebuild() &&
11826       Base.get() == E->getBase())
11827     return E;
11828 
11829   if (E->isExplicitProperty())
11830     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11831                                                    E->getExplicitProperty(),
11832                                                    E->getLocation());
11833 
11834   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11835                                                  SemaRef.Context.PseudoObjectTy,
11836                                                  E->getImplicitPropertyGetter(),
11837                                                  E->getImplicitPropertySetter(),
11838                                                  E->getLocation());
11839 }
11840 
11841 template<typename Derived>
11842 ExprResult
11843 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
11844   // Transform the base expression.
11845   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
11846   if (Base.isInvalid())
11847     return ExprError();
11848 
11849   // Transform the key expression.
11850   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
11851   if (Key.isInvalid())
11852     return ExprError();
11853 
11854   // If nothing changed, just retain the existing expression.
11855   if (!getDerived().AlwaysRebuild() &&
11856       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
11857     return E;
11858 
11859   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
11860                                                   Base.get(), Key.get(),
11861                                                   E->getAtIndexMethodDecl(),
11862                                                   E->setAtIndexMethodDecl());
11863 }
11864 
11865 template<typename Derived>
11866 ExprResult
11867 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
11868   // Transform the base expression.
11869   ExprResult Base = getDerived().TransformExpr(E->getBase());
11870   if (Base.isInvalid())
11871     return ExprError();
11872 
11873   // If nothing changed, just retain the existing expression.
11874   if (!getDerived().AlwaysRebuild() &&
11875       Base.get() == E->getBase())
11876     return E;
11877 
11878   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
11879                                          E->getOpLoc(),
11880                                          E->isArrow());
11881 }
11882 
11883 template<typename Derived>
11884 ExprResult
11885 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
11886   bool ArgumentChanged = false;
11887   SmallVector<Expr*, 8> SubExprs;
11888   SubExprs.reserve(E->getNumSubExprs());
11889   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11890                                   SubExprs, &ArgumentChanged))
11891     return ExprError();
11892 
11893   if (!getDerived().AlwaysRebuild() &&
11894       !ArgumentChanged)
11895     return E;
11896 
11897   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
11898                                                SubExprs,
11899                                                E->getRParenLoc());
11900 }
11901 
11902 template<typename Derived>
11903 ExprResult
11904 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
11905   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
11906   if (SrcExpr.isInvalid())
11907     return ExprError();
11908 
11909   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
11910   if (!Type)
11911     return ExprError();
11912 
11913   if (!getDerived().AlwaysRebuild() &&
11914       Type == E->getTypeSourceInfo() &&
11915       SrcExpr.get() == E->getSrcExpr())
11916     return E;
11917 
11918   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
11919                                                SrcExpr.get(), Type,
11920                                                E->getRParenLoc());
11921 }
11922 
11923 template<typename Derived>
11924 ExprResult
11925 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
11926   BlockDecl *oldBlock = E->getBlockDecl();
11927 
11928   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
11929   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
11930 
11931   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
11932   blockScope->TheDecl->setBlockMissingReturnType(
11933                          oldBlock->blockMissingReturnType());
11934 
11935   SmallVector<ParmVarDecl*, 4> params;
11936   SmallVector<QualType, 4> paramTypes;
11937 
11938   const FunctionProtoType *exprFunctionType = E->getFunctionType();
11939 
11940   // Parameter substitution.
11941   Sema::ExtParameterInfoBuilder extParamInfos;
11942   if (getDerived().TransformFunctionTypeParams(
11943           E->getCaretLocation(), oldBlock->parameters(), nullptr,
11944           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
11945           extParamInfos)) {
11946     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11947     return ExprError();
11948   }
11949 
11950   QualType exprResultType =
11951       getDerived().TransformType(exprFunctionType->getReturnType());
11952 
11953   auto epi = exprFunctionType->getExtProtoInfo();
11954   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
11955 
11956   QualType functionType =
11957     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
11958   blockScope->FunctionType = functionType;
11959 
11960   // Set the parameters on the block decl.
11961   if (!params.empty())
11962     blockScope->TheDecl->setParams(params);
11963 
11964   if (!oldBlock->blockMissingReturnType()) {
11965     blockScope->HasImplicitReturnType = false;
11966     blockScope->ReturnType = exprResultType;
11967   }
11968 
11969   // Transform the body
11970   StmtResult body = getDerived().TransformStmt(E->getBody());
11971   if (body.isInvalid()) {
11972     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11973     return ExprError();
11974   }
11975 
11976 #ifndef NDEBUG
11977   // In builds with assertions, make sure that we captured everything we
11978   // captured before.
11979   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
11980     for (const auto &I : oldBlock->captures()) {
11981       VarDecl *oldCapture = I.getVariable();
11982 
11983       // Ignore parameter packs.
11984       if (isa<ParmVarDecl>(oldCapture) &&
11985           cast<ParmVarDecl>(oldCapture)->isParameterPack())
11986         continue;
11987 
11988       VarDecl *newCapture =
11989         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
11990                                                  oldCapture));
11991       assert(blockScope->CaptureMap.count(newCapture));
11992     }
11993     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
11994   }
11995 #endif
11996 
11997   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
11998                                     /*Scope=*/nullptr);
11999 }
12000 
12001 template<typename Derived>
12002 ExprResult
12003 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12004   llvm_unreachable("Cannot transform asType expressions yet");
12005 }
12006 
12007 template<typename Derived>
12008 ExprResult
12009 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12010   QualType RetTy = getDerived().TransformType(E->getType());
12011   bool ArgumentChanged = false;
12012   SmallVector<Expr*, 8> SubExprs;
12013   SubExprs.reserve(E->getNumSubExprs());
12014   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12015                                   SubExprs, &ArgumentChanged))
12016     return ExprError();
12017 
12018   if (!getDerived().AlwaysRebuild() &&
12019       !ArgumentChanged)
12020     return E;
12021 
12022   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12023                                         RetTy, E->getOp(), E->getRParenLoc());
12024 }
12025 
12026 //===----------------------------------------------------------------------===//
12027 // Type reconstruction
12028 //===----------------------------------------------------------------------===//
12029 
12030 template<typename Derived>
12031 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12032                                                     SourceLocation Star) {
12033   return SemaRef.BuildPointerType(PointeeType, Star,
12034                                   getDerived().getBaseEntity());
12035 }
12036 
12037 template<typename Derived>
12038 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12039                                                          SourceLocation Star) {
12040   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12041                                        getDerived().getBaseEntity());
12042 }
12043 
12044 template<typename Derived>
12045 QualType
12046 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12047                                              bool WrittenAsLValue,
12048                                              SourceLocation Sigil) {
12049   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12050                                     Sigil, getDerived().getBaseEntity());
12051 }
12052 
12053 template<typename Derived>
12054 QualType
12055 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12056                                                  QualType ClassType,
12057                                                  SourceLocation Sigil) {
12058   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12059                                         getDerived().getBaseEntity());
12060 }
12061 
12062 template<typename Derived>
12063 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12064            const ObjCTypeParamDecl *Decl,
12065            SourceLocation ProtocolLAngleLoc,
12066            ArrayRef<ObjCProtocolDecl *> Protocols,
12067            ArrayRef<SourceLocation> ProtocolLocs,
12068            SourceLocation ProtocolRAngleLoc) {
12069   return SemaRef.BuildObjCTypeParamType(Decl,
12070                                         ProtocolLAngleLoc, Protocols,
12071                                         ProtocolLocs, ProtocolRAngleLoc,
12072                                         /*FailOnError=*/true);
12073 }
12074 
12075 template<typename Derived>
12076 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12077            QualType BaseType,
12078            SourceLocation Loc,
12079            SourceLocation TypeArgsLAngleLoc,
12080            ArrayRef<TypeSourceInfo *> TypeArgs,
12081            SourceLocation TypeArgsRAngleLoc,
12082            SourceLocation ProtocolLAngleLoc,
12083            ArrayRef<ObjCProtocolDecl *> Protocols,
12084            ArrayRef<SourceLocation> ProtocolLocs,
12085            SourceLocation ProtocolRAngleLoc) {
12086   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12087                                      TypeArgs, TypeArgsRAngleLoc,
12088                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12089                                      ProtocolRAngleLoc,
12090                                      /*FailOnError=*/true);
12091 }
12092 
12093 template<typename Derived>
12094 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12095            QualType PointeeType,
12096            SourceLocation Star) {
12097   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12098 }
12099 
12100 template<typename Derived>
12101 QualType
12102 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12103                                          ArrayType::ArraySizeModifier SizeMod,
12104                                          const llvm::APInt *Size,
12105                                          Expr *SizeExpr,
12106                                          unsigned IndexTypeQuals,
12107                                          SourceRange BracketsRange) {
12108   if (SizeExpr || !Size)
12109     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12110                                   IndexTypeQuals, BracketsRange,
12111                                   getDerived().getBaseEntity());
12112 
12113   QualType Types[] = {
12114     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12115     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12116     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12117   };
12118   const unsigned NumTypes = llvm::array_lengthof(Types);
12119   QualType SizeType;
12120   for (unsigned I = 0; I != NumTypes; ++I)
12121     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12122       SizeType = Types[I];
12123       break;
12124     }
12125 
12126   // Note that we can return a VariableArrayType here in the case where
12127   // the element type was a dependent VariableArrayType.
12128   IntegerLiteral *ArraySize
12129       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12130                                /*FIXME*/BracketsRange.getBegin());
12131   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12132                                 IndexTypeQuals, BracketsRange,
12133                                 getDerived().getBaseEntity());
12134 }
12135 
12136 template<typename Derived>
12137 QualType
12138 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12139                                                  ArrayType::ArraySizeModifier SizeMod,
12140                                                  const llvm::APInt &Size,
12141                                                  unsigned IndexTypeQuals,
12142                                                  SourceRange BracketsRange) {
12143   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12144                                         IndexTypeQuals, BracketsRange);
12145 }
12146 
12147 template<typename Derived>
12148 QualType
12149 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12150                                           ArrayType::ArraySizeModifier SizeMod,
12151                                                  unsigned IndexTypeQuals,
12152                                                    SourceRange BracketsRange) {
12153   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12154                                        IndexTypeQuals, BracketsRange);
12155 }
12156 
12157 template<typename Derived>
12158 QualType
12159 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12160                                           ArrayType::ArraySizeModifier SizeMod,
12161                                                  Expr *SizeExpr,
12162                                                  unsigned IndexTypeQuals,
12163                                                  SourceRange BracketsRange) {
12164   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12165                                        SizeExpr,
12166                                        IndexTypeQuals, BracketsRange);
12167 }
12168 
12169 template<typename Derived>
12170 QualType
12171 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12172                                           ArrayType::ArraySizeModifier SizeMod,
12173                                                        Expr *SizeExpr,
12174                                                        unsigned IndexTypeQuals,
12175                                                    SourceRange BracketsRange) {
12176   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12177                                        SizeExpr,
12178                                        IndexTypeQuals, BracketsRange);
12179 }
12180 
12181 template<typename Derived>
12182 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12183                                                unsigned NumElements,
12184                                                VectorType::VectorKind VecKind) {
12185   // FIXME: semantic checking!
12186   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12187 }
12188 
12189 template<typename Derived>
12190 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12191                                                       unsigned NumElements,
12192                                                  SourceLocation AttributeLoc) {
12193   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12194                           NumElements, true);
12195   IntegerLiteral *VectorSize
12196     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12197                              AttributeLoc);
12198   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12199 }
12200 
12201 template<typename Derived>
12202 QualType
12203 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12204                                                            Expr *SizeExpr,
12205                                                   SourceLocation AttributeLoc) {
12206   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12207 }
12208 
12209 template<typename Derived>
12210 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12211     QualType T,
12212     MutableArrayRef<QualType> ParamTypes,
12213     const FunctionProtoType::ExtProtoInfo &EPI) {
12214   return SemaRef.BuildFunctionType(T, ParamTypes,
12215                                    getDerived().getBaseLocation(),
12216                                    getDerived().getBaseEntity(),
12217                                    EPI);
12218 }
12219 
12220 template<typename Derived>
12221 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12222   return SemaRef.Context.getFunctionNoProtoType(T);
12223 }
12224 
12225 template<typename Derived>
12226 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12227                                                             Decl *D) {
12228   assert(D && "no decl found");
12229   if (D->isInvalidDecl()) return QualType();
12230 
12231   // FIXME: Doesn't account for ObjCInterfaceDecl!
12232   TypeDecl *Ty;
12233   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12234     // A valid resolved using typename pack expansion decl can have multiple
12235     // UsingDecls, but they must each have exactly one type, and it must be
12236     // the same type in every case. But we must have at least one expansion!
12237     if (UPD->expansions().empty()) {
12238       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12239           << UPD->isCXXClassMember() << UPD;
12240       return QualType();
12241     }
12242 
12243     // We might still have some unresolved types. Try to pick a resolved type
12244     // if we can. The final instantiation will check that the remaining
12245     // unresolved types instantiate to the type we pick.
12246     QualType FallbackT;
12247     QualType T;
12248     for (auto *E : UPD->expansions()) {
12249       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12250       if (ThisT.isNull())
12251         continue;
12252       else if (ThisT->getAs<UnresolvedUsingType>())
12253         FallbackT = ThisT;
12254       else if (T.isNull())
12255         T = ThisT;
12256       else
12257         assert(getSema().Context.hasSameType(ThisT, T) &&
12258                "mismatched resolved types in using pack expansion");
12259     }
12260     return T.isNull() ? FallbackT : T;
12261   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12262     assert(Using->hasTypename() &&
12263            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12264 
12265     // A valid resolved using typename decl points to exactly one type decl.
12266     assert(++Using->shadow_begin() == Using->shadow_end());
12267     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12268   } else {
12269     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12270            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12271     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12272   }
12273 
12274   return SemaRef.Context.getTypeDeclType(Ty);
12275 }
12276 
12277 template<typename Derived>
12278 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12279                                                        SourceLocation Loc) {
12280   return SemaRef.BuildTypeofExprType(E, Loc);
12281 }
12282 
12283 template<typename Derived>
12284 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12285   return SemaRef.Context.getTypeOfType(Underlying);
12286 }
12287 
12288 template<typename Derived>
12289 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12290                                                      SourceLocation Loc) {
12291   return SemaRef.BuildDecltypeType(E, Loc);
12292 }
12293 
12294 template<typename Derived>
12295 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12296                                             UnaryTransformType::UTTKind UKind,
12297                                             SourceLocation Loc) {
12298   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12299 }
12300 
12301 template<typename Derived>
12302 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12303                                                       TemplateName Template,
12304                                              SourceLocation TemplateNameLoc,
12305                                      TemplateArgumentListInfo &TemplateArgs) {
12306   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12307 }
12308 
12309 template<typename Derived>
12310 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12311                                                    SourceLocation KWLoc) {
12312   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12313 }
12314 
12315 template<typename Derived>
12316 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12317                                                  SourceLocation KWLoc,
12318                                                  bool isReadPipe) {
12319   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12320                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12321 }
12322 
12323 template<typename Derived>
12324 TemplateName
12325 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12326                                             bool TemplateKW,
12327                                             TemplateDecl *Template) {
12328   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12329                                                   Template);
12330 }
12331 
12332 template<typename Derived>
12333 TemplateName
12334 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12335                                             const IdentifierInfo &Name,
12336                                             SourceLocation NameLoc,
12337                                             QualType ObjectType,
12338                                             NamedDecl *FirstQualifierInScope,
12339                                             bool AllowInjectedClassName) {
12340   UnqualifiedId TemplateName;
12341   TemplateName.setIdentifier(&Name, NameLoc);
12342   Sema::TemplateTy Template;
12343   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12344   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12345                                        SS, TemplateKWLoc, TemplateName,
12346                                        ParsedType::make(ObjectType),
12347                                        /*EnteringContext=*/false,
12348                                        Template, AllowInjectedClassName);
12349   return Template.get();
12350 }
12351 
12352 template<typename Derived>
12353 TemplateName
12354 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12355                                             OverloadedOperatorKind Operator,
12356                                             SourceLocation NameLoc,
12357                                             QualType ObjectType,
12358                                             bool AllowInjectedClassName) {
12359   UnqualifiedId Name;
12360   // FIXME: Bogus location information.
12361   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12362   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12363   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12364   Sema::TemplateTy Template;
12365   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12366                                        SS, TemplateKWLoc, Name,
12367                                        ParsedType::make(ObjectType),
12368                                        /*EnteringContext=*/false,
12369                                        Template, AllowInjectedClassName);
12370   return Template.get();
12371 }
12372 
12373 template<typename Derived>
12374 ExprResult
12375 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12376                                                    SourceLocation OpLoc,
12377                                                    Expr *OrigCallee,
12378                                                    Expr *First,
12379                                                    Expr *Second) {
12380   Expr *Callee = OrigCallee->IgnoreParenCasts();
12381   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12382 
12383   if (First->getObjectKind() == OK_ObjCProperty) {
12384     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12385     if (BinaryOperator::isAssignmentOp(Opc))
12386       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12387                                                  First, Second);
12388     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12389     if (Result.isInvalid())
12390       return ExprError();
12391     First = Result.get();
12392   }
12393 
12394   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12395     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12396     if (Result.isInvalid())
12397       return ExprError();
12398     Second = Result.get();
12399   }
12400 
12401   // Determine whether this should be a builtin operation.
12402   if (Op == OO_Subscript) {
12403     if (!First->getType()->isOverloadableType() &&
12404         !Second->getType()->isOverloadableType())
12405       return getSema().CreateBuiltinArraySubscriptExpr(First,
12406                                                        Callee->getLocStart(),
12407                                                        Second, OpLoc);
12408   } else if (Op == OO_Arrow) {
12409     // -> is never a builtin operation.
12410     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12411   } else if (Second == nullptr || isPostIncDec) {
12412     if (!First->getType()->isOverloadableType()) {
12413       // The argument is not of overloadable type, so try to create a
12414       // built-in unary operation.
12415       UnaryOperatorKind Opc
12416         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12417 
12418       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12419     }
12420   } else {
12421     if (!First->getType()->isOverloadableType() &&
12422         !Second->getType()->isOverloadableType()) {
12423       // Neither of the arguments is an overloadable type, so try to
12424       // create a built-in binary operation.
12425       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12426       ExprResult Result
12427         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12428       if (Result.isInvalid())
12429         return ExprError();
12430 
12431       return Result;
12432     }
12433   }
12434 
12435   // Compute the transformed set of functions (and function templates) to be
12436   // used during overload resolution.
12437   UnresolvedSet<16> Functions;
12438 
12439   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12440     assert(ULE->requiresADL());
12441     Functions.append(ULE->decls_begin(), ULE->decls_end());
12442   } else {
12443     // If we've resolved this to a particular non-member function, just call
12444     // that function. If we resolved it to a member function,
12445     // CreateOverloaded* will find that function for us.
12446     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12447     if (!isa<CXXMethodDecl>(ND))
12448       Functions.addDecl(ND);
12449   }
12450 
12451   // Add any functions found via argument-dependent lookup.
12452   Expr *Args[2] = { First, Second };
12453   unsigned NumArgs = 1 + (Second != nullptr);
12454 
12455   // Create the overloaded operator invocation for unary operators.
12456   if (NumArgs == 1 || isPostIncDec) {
12457     UnaryOperatorKind Opc
12458       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12459     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
12460   }
12461 
12462   if (Op == OO_Subscript) {
12463     SourceLocation LBrace;
12464     SourceLocation RBrace;
12465 
12466     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12467         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12468         LBrace = SourceLocation::getFromRawEncoding(
12469                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12470         RBrace = SourceLocation::getFromRawEncoding(
12471                     NameLoc.CXXOperatorName.EndOpNameLoc);
12472     } else {
12473         LBrace = Callee->getLocStart();
12474         RBrace = OpLoc;
12475     }
12476 
12477     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12478                                                       First, Second);
12479   }
12480 
12481   // Create the overloaded operator invocation for binary operators.
12482   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12483   ExprResult Result
12484     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
12485   if (Result.isInvalid())
12486     return ExprError();
12487 
12488   return Result;
12489 }
12490 
12491 template<typename Derived>
12492 ExprResult
12493 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12494                                                      SourceLocation OperatorLoc,
12495                                                        bool isArrow,
12496                                                        CXXScopeSpec &SS,
12497                                                      TypeSourceInfo *ScopeType,
12498                                                        SourceLocation CCLoc,
12499                                                        SourceLocation TildeLoc,
12500                                         PseudoDestructorTypeStorage Destroyed) {
12501   QualType BaseType = Base->getType();
12502   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12503       (!isArrow && !BaseType->getAs<RecordType>()) ||
12504       (isArrow && BaseType->getAs<PointerType>() &&
12505        !BaseType->getAs<PointerType>()->getPointeeType()
12506                                               ->template getAs<RecordType>())){
12507     // This pseudo-destructor expression is still a pseudo-destructor.
12508     return SemaRef.BuildPseudoDestructorExpr(
12509         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12510         CCLoc, TildeLoc, Destroyed);
12511   }
12512 
12513   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12514   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12515                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12516   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12517   NameInfo.setNamedTypeInfo(DestroyedType);
12518 
12519   // The scope type is now known to be a valid nested name specifier
12520   // component. Tack it on to the end of the nested name specifier.
12521   if (ScopeType) {
12522     if (!ScopeType->getType()->getAs<TagType>()) {
12523       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12524                      diag::err_expected_class_or_namespace)
12525           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12526       return ExprError();
12527     }
12528     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12529               CCLoc);
12530   }
12531 
12532   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12533   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12534                                             OperatorLoc, isArrow,
12535                                             SS, TemplateKWLoc,
12536                                             /*FIXME: FirstQualifier*/ nullptr,
12537                                             NameInfo,
12538                                             /*TemplateArgs*/ nullptr,
12539                                             /*S*/nullptr);
12540 }
12541 
12542 template<typename Derived>
12543 StmtResult
12544 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12545   SourceLocation Loc = S->getLocStart();
12546   CapturedDecl *CD = S->getCapturedDecl();
12547   unsigned NumParams = CD->getNumParams();
12548   unsigned ContextParamPos = CD->getContextParamPosition();
12549   SmallVector<Sema::CapturedParamNameType, 4> Params;
12550   for (unsigned I = 0; I < NumParams; ++I) {
12551     if (I != ContextParamPos) {
12552       Params.push_back(
12553              std::make_pair(
12554                   CD->getParam(I)->getName(),
12555                   getDerived().TransformType(CD->getParam(I)->getType())));
12556     } else {
12557       Params.push_back(std::make_pair(StringRef(), QualType()));
12558     }
12559   }
12560   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12561                                      S->getCapturedRegionKind(), Params);
12562   StmtResult Body;
12563   {
12564     Sema::CompoundScopeRAII CompoundScope(getSema());
12565     Body = getDerived().TransformStmt(S->getCapturedStmt());
12566   }
12567 
12568   if (Body.isInvalid()) {
12569     getSema().ActOnCapturedRegionError();
12570     return StmtError();
12571   }
12572 
12573   return getSema().ActOnCapturedRegionEnd(Body.get());
12574 }
12575 
12576 } // end namespace clang
12577 
12578 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12579