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