1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements a semantic tree transformation that takes a given
10 //  AST and rebuilds it, possibly transforming some nodes in the process.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
16 
17 #include "CoroutineStmtBuilder.h"
18 #include "TypeLocBuilder.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/Expr.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/Stmt.h"
27 #include "clang/AST/StmtCXX.h"
28 #include "clang/AST/StmtObjC.h"
29 #include "clang/AST/StmtOpenMP.h"
30 #include "clang/Sema/Designator.h"
31 #include "clang/Sema/Lookup.h"
32 #include "clang/Sema/Ownership.h"
33 #include "clang/Sema/ParsedTemplate.h"
34 #include "clang/Sema/ScopeInfo.h"
35 #include "clang/Sema/SemaDiagnostic.h"
36 #include "clang/Sema/SemaInternal.h"
37 #include "llvm/ADT/ArrayRef.h"
38 #include "llvm/Support/ErrorHandling.h"
39 #include <algorithm>
40 
41 namespace clang {
42 using namespace sema;
43 
44 /// A semantic tree transformation that allows one to transform one
45 /// abstract syntax tree into another.
46 ///
47 /// A new tree transformation is defined by creating a new subclass \c X of
48 /// \c TreeTransform<X> and then overriding certain operations to provide
49 /// behavior specific to that transformation. For example, template
50 /// instantiation is implemented as a tree transformation where the
51 /// transformation of TemplateTypeParmType nodes involves substituting the
52 /// template arguments for their corresponding template parameters; a similar
53 /// transformation is performed for non-type template parameters and
54 /// template template parameters.
55 ///
56 /// This tree-transformation template uses static polymorphism to allow
57 /// subclasses to customize any of its operations. Thus, a subclass can
58 /// override any of the transformation or rebuild operators by providing an
59 /// operation with the same signature as the default implementation. The
60 /// overriding function should not be virtual.
61 ///
62 /// Semantic tree transformations are split into two stages, either of which
63 /// can be replaced by a subclass. The "transform" step transforms an AST node
64 /// or the parts of an AST node using the various transformation functions,
65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
66 /// node of the appropriate kind from the pieces. The default transformation
67 /// routines recursively transform the operands to composite AST nodes (e.g.,
68 /// the pointee type of a PointerType node) and, if any of those operand nodes
69 /// were changed by the transformation, invokes the rebuild operation to create
70 /// a new AST node.
71 ///
72 /// Subclasses can customize the transformation at various levels. The
73 /// most coarse-grained transformations involve replacing TransformType(),
74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
76 /// new implementations.
77 ///
78 /// For more fine-grained transformations, subclasses can replace any of the
79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
81 /// replacing TransformTemplateTypeParmType() allows template instantiation
82 /// to substitute template arguments for their corresponding template
83 /// parameters. Additionally, subclasses can override the \c RebuildXXX
84 /// functions to control how AST nodes are rebuilt when their operands change.
85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
87 /// be able to use more efficient rebuild steps.
88 ///
89 /// There are a handful of other functions that can be overridden, allowing one
90 /// to avoid traversing nodes that don't need any transformation
91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
92 /// operands have not changed (\c AlwaysRebuild()), and customize the
93 /// default locations and entity names used for type-checking
94 /// (\c getBaseLocation(), \c getBaseEntity()).
95 template<typename Derived>
96 class TreeTransform {
97   /// Private RAII object that helps us forget and then re-remember
98   /// the template argument corresponding to a partially-substituted parameter
99   /// pack.
100   class ForgetPartiallySubstitutedPackRAII {
101     Derived &Self;
102     TemplateArgument Old;
103 
104   public:
105     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
106       Old = Self.ForgetPartiallySubstitutedPack();
107     }
108 
109     ~ForgetPartiallySubstitutedPackRAII() {
110       Self.RememberPartiallySubstitutedPack(Old);
111     }
112   };
113 
114 protected:
115   Sema &SemaRef;
116 
117   /// The set of local declarations that have been transformed, for
118   /// cases where we are forced to build new declarations within the transformer
119   /// rather than in the subclass (e.g., lambda closure types).
120   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
121 
122 public:
123   /// Initializes a new tree transformer.
124   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
125 
126   /// Retrieves a reference to the derived class.
127   Derived &getDerived() { return static_cast<Derived&>(*this); }
128 
129   /// Retrieves a reference to the derived class.
130   const Derived &getDerived() const {
131     return static_cast<const Derived&>(*this);
132   }
133 
134   static inline ExprResult Owned(Expr *E) { return E; }
135   static inline StmtResult Owned(Stmt *S) { return S; }
136 
137   /// Retrieves a reference to the semantic analysis object used for
138   /// this tree transform.
139   Sema &getSema() const { return SemaRef; }
140 
141   /// Whether the transformation should always rebuild AST nodes, even
142   /// if none of the children have changed.
143   ///
144   /// Subclasses may override this function to specify when the transformation
145   /// should rebuild all AST nodes.
146   ///
147   /// We must always rebuild all AST nodes when performing variadic template
148   /// pack expansion, in order to avoid violating the AST invariant that each
149   /// statement node appears at most once in its containing declaration.
150   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
151 
152   /// Returns the location of the entity being transformed, if that
153   /// information was not available elsewhere in the AST.
154   ///
155   /// By default, returns no source-location information. Subclasses can
156   /// provide an alternative implementation that provides better location
157   /// information.
158   SourceLocation getBaseLocation() { return SourceLocation(); }
159 
160   /// Returns the name of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns an empty name. Subclasses can provide an alternative
164   /// implementation with a more precise name.
165   DeclarationName getBaseEntity() { return DeclarationName(); }
166 
167   /// Sets the "base" location and entity when that
168   /// information is known based on another transformation.
169   ///
170   /// By default, the source location and entity are ignored. Subclasses can
171   /// override this function to provide a customized implementation.
172   void setBase(SourceLocation Loc, DeclarationName Entity) { }
173 
174   /// RAII object that temporarily sets the base location and entity
175   /// used for reporting diagnostics in types.
176   class TemporaryBase {
177     TreeTransform &Self;
178     SourceLocation OldLocation;
179     DeclarationName OldEntity;
180 
181   public:
182     TemporaryBase(TreeTransform &Self, SourceLocation Location,
183                   DeclarationName Entity) : Self(Self) {
184       OldLocation = Self.getDerived().getBaseLocation();
185       OldEntity = Self.getDerived().getBaseEntity();
186 
187       if (Location.isValid())
188         Self.getDerived().setBase(Location, Entity);
189     }
190 
191     ~TemporaryBase() {
192       Self.getDerived().setBase(OldLocation, OldEntity);
193     }
194   };
195 
196   /// Determine whether the given type \p T has already been
197   /// transformed.
198   ///
199   /// Subclasses can provide an alternative implementation of this routine
200   /// to short-circuit evaluation when it is known that a given type will
201   /// not change. For example, template instantiation need not traverse
202   /// non-dependent types.
203   bool AlreadyTransformed(QualType T) {
204     return T.isNull();
205   }
206 
207   /// Determine whether the given call argument should be dropped, e.g.,
208   /// because it is a default argument.
209   ///
210   /// Subclasses can provide an alternative implementation of this routine to
211   /// determine which kinds of call arguments get dropped. By default,
212   /// CXXDefaultArgument nodes are dropped (prior to transformation).
213   bool DropCallArgument(Expr *E) {
214     return E->isDefaultArgument();
215   }
216 
217   /// Determine whether we should expand a pack expansion with the
218   /// given set of parameter packs into separate arguments by repeatedly
219   /// transforming the pattern.
220   ///
221   /// By default, the transformer never tries to expand pack expansions.
222   /// Subclasses can override this routine to provide different behavior.
223   ///
224   /// \param EllipsisLoc The location of the ellipsis that identifies the
225   /// pack expansion.
226   ///
227   /// \param PatternRange The source range that covers the entire pattern of
228   /// the pack expansion.
229   ///
230   /// \param Unexpanded The set of unexpanded parameter packs within the
231   /// pattern.
232   ///
233   /// \param ShouldExpand Will be set to \c true if the transformer should
234   /// expand the corresponding pack expansions into separate arguments. When
235   /// set, \c NumExpansions must also be set.
236   ///
237   /// \param RetainExpansion Whether the caller should add an unexpanded
238   /// pack expansion after all of the expanded arguments. This is used
239   /// when extending explicitly-specified template argument packs per
240   /// C++0x [temp.arg.explicit]p9.
241   ///
242   /// \param NumExpansions The number of separate arguments that will be in
243   /// the expanded form of the corresponding pack expansion. This is both an
244   /// input and an output parameter, which can be set by the caller if the
245   /// number of expansions is known a priori (e.g., due to a prior substitution)
246   /// and will be set by the callee when the number of expansions is known.
247   /// The callee must set this value when \c ShouldExpand is \c true; it may
248   /// set this value in other cases.
249   ///
250   /// \returns true if an error occurred (e.g., because the parameter packs
251   /// are to be instantiated with arguments of different lengths), false
252   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
253   /// must be set.
254   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
255                                SourceRange PatternRange,
256                                ArrayRef<UnexpandedParameterPack> Unexpanded,
257                                bool &ShouldExpand,
258                                bool &RetainExpansion,
259                                Optional<unsigned> &NumExpansions) {
260     ShouldExpand = false;
261     return false;
262   }
263 
264   /// "Forget" about the partially-substituted pack template argument,
265   /// when performing an instantiation that must preserve the parameter pack
266   /// use.
267   ///
268   /// This routine is meant to be overridden by the template instantiator.
269   TemplateArgument ForgetPartiallySubstitutedPack() {
270     return TemplateArgument();
271   }
272 
273   /// "Remember" the partially-substituted pack template argument
274   /// after performing an instantiation that must preserve the parameter pack
275   /// use.
276   ///
277   /// This routine is meant to be overridden by the template instantiator.
278   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
279 
280   /// Note to the derived class when a function parameter pack is
281   /// being expanded.
282   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
283 
284   /// Transforms the given type into another type.
285   ///
286   /// By default, this routine transforms a type by creating a
287   /// TypeSourceInfo for it and delegating to the appropriate
288   /// function.  This is expensive, but we don't mind, because
289   /// this method is deprecated anyway;  all users should be
290   /// switched to storing TypeSourceInfos.
291   ///
292   /// \returns the transformed type.
293   QualType TransformType(QualType T);
294 
295   /// Transforms the given type-with-location into a new
296   /// type-with-location.
297   ///
298   /// By default, this routine transforms a type by delegating to the
299   /// appropriate TransformXXXType to build a new type.  Subclasses
300   /// may override this function (to take over all type
301   /// transformations) or some set of the TransformXXXType functions
302   /// to alter the transformation.
303   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
304 
305   /// Transform the given type-with-location into a new
306   /// type, collecting location information in the given builder
307   /// as necessary.
308   ///
309   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
310 
311   /// Transform a type that is permitted to produce a
312   /// DeducedTemplateSpecializationType.
313   ///
314   /// This is used in the (relatively rare) contexts where it is acceptable
315   /// for transformation to produce a class template type with deduced
316   /// template arguments.
317   /// @{
318   QualType TransformTypeWithDeducedTST(QualType T);
319   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
320   /// @}
321 
322   /// Transform the given statement.
323   ///
324   /// By default, this routine transforms a statement by delegating to the
325   /// appropriate TransformXXXStmt function to transform a specific kind of
326   /// statement or the TransformExpr() function to transform an expression.
327   /// Subclasses may override this function to transform statements using some
328   /// other mechanism.
329   ///
330   /// \returns the transformed statement.
331   StmtResult TransformStmt(Stmt *S);
332 
333   /// Transform the given statement.
334   ///
335   /// By default, this routine transforms a statement by delegating to the
336   /// appropriate TransformOMPXXXClause function to transform a specific kind
337   /// of clause. Subclasses may override this function to transform statements
338   /// using some other mechanism.
339   ///
340   /// \returns the transformed OpenMP clause.
341   OMPClause *TransformOMPClause(OMPClause *S);
342 
343   /// Transform the given attribute.
344   ///
345   /// By default, this routine transforms a statement by delegating to the
346   /// appropriate TransformXXXAttr function to transform a specific kind
347   /// of attribute. Subclasses may override this function to transform
348   /// attributed statements using some other mechanism.
349   ///
350   /// \returns the transformed attribute
351   const Attr *TransformAttr(const Attr *S);
352 
353 /// Transform the specified attribute.
354 ///
355 /// Subclasses should override the transformation of attributes with a pragma
356 /// spelling to transform expressions stored within the attribute.
357 ///
358 /// \returns the transformed attribute.
359 #define ATTR(X)
360 #define PRAGMA_SPELLING_ATTR(X)                                                \
361   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
362 #include "clang/Basic/AttrList.inc"
363 
364   /// Transform the given expression.
365   ///
366   /// By default, this routine transforms an expression by delegating to the
367   /// appropriate TransformXXXExpr function to build a new expression.
368   /// Subclasses may override this function to transform expressions using some
369   /// other mechanism.
370   ///
371   /// \returns the transformed expression.
372   ExprResult TransformExpr(Expr *E);
373 
374   /// Transform the given initializer.
375   ///
376   /// By default, this routine transforms an initializer by stripping off the
377   /// semantic nodes added by initialization, then passing the result to
378   /// TransformExpr or TransformExprs.
379   ///
380   /// \returns the transformed initializer.
381   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
382 
383   /// Transform the given list of expressions.
384   ///
385   /// This routine transforms a list of expressions by invoking
386   /// \c TransformExpr() for each subexpression. However, it also provides
387   /// support for variadic templates by expanding any pack expansions (if the
388   /// derived class permits such expansion) along the way. When pack expansions
389   /// are present, the number of outputs may not equal the number of inputs.
390   ///
391   /// \param Inputs The set of expressions to be transformed.
392   ///
393   /// \param NumInputs The number of expressions in \c Inputs.
394   ///
395   /// \param IsCall If \c true, then this transform is being performed on
396   /// function-call arguments, and any arguments that should be dropped, will
397   /// be.
398   ///
399   /// \param Outputs The transformed input expressions will be added to this
400   /// vector.
401   ///
402   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
403   /// due to transformation.
404   ///
405   /// \returns true if an error occurred, false otherwise.
406   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
407                       SmallVectorImpl<Expr *> &Outputs,
408                       bool *ArgChanged = nullptr);
409 
410   /// Transform the given declaration, which is referenced from a type
411   /// or expression.
412   ///
413   /// By default, acts as the identity function on declarations, unless the
414   /// transformer has had to transform the declaration itself. Subclasses
415   /// may override this function to provide alternate behavior.
416   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
417     llvm::DenseMap<Decl *, Decl *>::iterator Known
418       = TransformedLocalDecls.find(D);
419     if (Known != TransformedLocalDecls.end())
420       return Known->second;
421 
422     return D;
423   }
424 
425   /// Transform the specified condition.
426   ///
427   /// By default, this transforms the variable and expression and rebuilds
428   /// the condition.
429   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
430                                            Expr *Expr,
431                                            Sema::ConditionKind Kind);
432 
433   /// Transform the attributes associated with the given declaration and
434   /// place them on the new declaration.
435   ///
436   /// By default, this operation does nothing. Subclasses may override this
437   /// behavior to transform attributes.
438   void transformAttrs(Decl *Old, Decl *New) { }
439 
440   /// Note that a local declaration has been transformed by this
441   /// transformer.
442   ///
443   /// Local declarations are typically transformed via a call to
444   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
445   /// the transformer itself has to transform the declarations. This routine
446   /// can be overridden by a subclass that keeps track of such mappings.
447   void transformedLocalDecl(Decl *Old, Decl *New) {
448     TransformedLocalDecls[Old] = New;
449   }
450 
451   /// Transform the definition of the given declaration.
452   ///
453   /// By default, invokes TransformDecl() to transform the declaration.
454   /// Subclasses may override this function to provide alternate behavior.
455   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
456     return getDerived().TransformDecl(Loc, D);
457   }
458 
459   /// Transform the given declaration, which was the first part of a
460   /// nested-name-specifier in a member access expression.
461   ///
462   /// This specific declaration transformation only applies to the first
463   /// identifier in a nested-name-specifier of a member access expression, e.g.,
464   /// the \c T in \c x->T::member
465   ///
466   /// By default, invokes TransformDecl() to transform the declaration.
467   /// Subclasses may override this function to provide alternate behavior.
468   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
469     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
470   }
471 
472   /// Transform the set of declarations in an OverloadExpr.
473   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
474                                   LookupResult &R);
475 
476   /// Transform the given nested-name-specifier with source-location
477   /// information.
478   ///
479   /// By default, transforms all of the types and declarations within the
480   /// nested-name-specifier. Subclasses may override this function to provide
481   /// alternate behavior.
482   NestedNameSpecifierLoc
483   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
484                                   QualType ObjectType = QualType(),
485                                   NamedDecl *FirstQualifierInScope = nullptr);
486 
487   /// Transform the given declaration name.
488   ///
489   /// By default, transforms the types of conversion function, constructor,
490   /// and destructor names and then (if needed) rebuilds the declaration name.
491   /// Identifiers and selectors are returned unmodified. Sublcasses may
492   /// override this function to provide alternate behavior.
493   DeclarationNameInfo
494   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
495 
496   /// Transform the given template name.
497   ///
498   /// \param SS The nested-name-specifier that qualifies the template
499   /// name. This nested-name-specifier must already have been transformed.
500   ///
501   /// \param Name The template name to transform.
502   ///
503   /// \param NameLoc The source location of the template name.
504   ///
505   /// \param ObjectType If we're translating a template name within a member
506   /// access expression, this is the type of the object whose member template
507   /// is being referenced.
508   ///
509   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
510   /// also refers to a name within the current (lexical) scope, this is the
511   /// declaration it refers to.
512   ///
513   /// By default, transforms the template name by transforming the declarations
514   /// and nested-name-specifiers that occur within the template name.
515   /// Subclasses may override this function to provide alternate behavior.
516   TemplateName
517   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
518                         SourceLocation NameLoc,
519                         QualType ObjectType = QualType(),
520                         NamedDecl *FirstQualifierInScope = nullptr,
521                         bool AllowInjectedClassName = false);
522 
523   /// Transform the given template argument.
524   ///
525   /// By default, this operation transforms the type, expression, or
526   /// declaration stored within the template argument and constructs a
527   /// new template argument from the transformed result. Subclasses may
528   /// override this function to provide alternate behavior.
529   ///
530   /// Returns true if there was an error.
531   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
532                                  TemplateArgumentLoc &Output,
533                                  bool Uneval = false);
534 
535   /// Transform the given set of template arguments.
536   ///
537   /// By default, this operation transforms all of the template arguments
538   /// in the input set using \c TransformTemplateArgument(), and appends
539   /// the transformed arguments to the output list.
540   ///
541   /// Note that this overload of \c TransformTemplateArguments() is merely
542   /// a convenience function. Subclasses that wish to override this behavior
543   /// should override the iterator-based member template version.
544   ///
545   /// \param Inputs The set of template arguments to be transformed.
546   ///
547   /// \param NumInputs The number of template arguments in \p Inputs.
548   ///
549   /// \param Outputs The set of transformed template arguments output by this
550   /// routine.
551   ///
552   /// Returns true if an error occurred.
553   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
554                                   unsigned NumInputs,
555                                   TemplateArgumentListInfo &Outputs,
556                                   bool Uneval = false) {
557     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
558                                       Uneval);
559   }
560 
561   /// Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// \param First An iterator to the first template argument.
568   ///
569   /// \param Last An iterator one step past the last template argument.
570   ///
571   /// \param Outputs The set of transformed template arguments output by this
572   /// routine.
573   ///
574   /// Returns true if an error occurred.
575   template<typename InputIterator>
576   bool TransformTemplateArguments(InputIterator First,
577                                   InputIterator Last,
578                                   TemplateArgumentListInfo &Outputs,
579                                   bool Uneval = false);
580 
581   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
582   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
583                                  TemplateArgumentLoc &ArgLoc);
584 
585   /// Fakes up a TypeSourceInfo for a type.
586   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
587     return SemaRef.Context.getTrivialTypeSourceInfo(T,
588                        getDerived().getBaseLocation());
589   }
590 
591 #define ABSTRACT_TYPELOC(CLASS, PARENT)
592 #define TYPELOC(CLASS, PARENT)                                   \
593   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
594 #include "clang/AST/TypeLocNodes.def"
595 
596   template<typename Fn>
597   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
598                                       FunctionProtoTypeLoc TL,
599                                       CXXRecordDecl *ThisContext,
600                                       unsigned ThisTypeQuals,
601                                       Fn TransformExceptionSpec);
602 
603   bool TransformExceptionSpec(SourceLocation Loc,
604                               FunctionProtoType::ExceptionSpecInfo &ESI,
605                               SmallVectorImpl<QualType> &Exceptions,
606                               bool &Changed);
607 
608   StmtResult TransformSEHHandler(Stmt *Handler);
609 
610   QualType
611   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
612                                       TemplateSpecializationTypeLoc TL,
613                                       TemplateName Template);
614 
615   QualType
616   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
617                                       DependentTemplateSpecializationTypeLoc TL,
618                                                TemplateName Template,
619                                                CXXScopeSpec &SS);
620 
621   QualType TransformDependentTemplateSpecializationType(
622       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
623       NestedNameSpecifierLoc QualifierLoc);
624 
625   /// Transforms the parameters of a function type into the
626   /// given vectors.
627   ///
628   /// The result vectors should be kept in sync; null entries in the
629   /// variables vector are acceptable.
630   ///
631   /// Return true on error.
632   bool TransformFunctionTypeParams(
633       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
634       const QualType *ParamTypes,
635       const FunctionProtoType::ExtParameterInfo *ParamInfos,
636       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
637       Sema::ExtParameterInfoBuilder &PInfos);
638 
639   /// Transforms a single function-type parameter.  Return null
640   /// on error.
641   ///
642   /// \param indexAdjustment - A number to add to the parameter's
643   ///   scope index;  can be negative
644   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
645                                           int indexAdjustment,
646                                           Optional<unsigned> NumExpansions,
647                                           bool ExpectParameterPack);
648 
649   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
650 
651   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
652   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
653 
654   TemplateParameterList *TransformTemplateParameterList(
655         TemplateParameterList *TPL) {
656     return TPL;
657   }
658 
659   ExprResult TransformAddressOfOperand(Expr *E);
660 
661   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
662                                                 bool IsAddressOfOperand,
663                                                 TypeSourceInfo **RecoveryTSI);
664 
665   ExprResult TransformParenDependentScopeDeclRefExpr(
666       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
667       TypeSourceInfo **RecoveryTSI);
668 
669   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
670 
671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
672 // amount of stack usage with clang.
673 #define STMT(Node, Parent)                        \
674   LLVM_ATTRIBUTE_NOINLINE \
675   StmtResult Transform##Node(Node *S);
676 #define EXPR(Node, Parent)                        \
677   LLVM_ATTRIBUTE_NOINLINE \
678   ExprResult Transform##Node(Node *E);
679 #define ABSTRACT_STMT(Stmt)
680 #include "clang/AST/StmtNodes.inc"
681 
682 #define OPENMP_CLAUSE(Name, Class)                        \
683   LLVM_ATTRIBUTE_NOINLINE \
684   OMPClause *Transform ## Class(Class *S);
685 #include "clang/Basic/OpenMPKinds.def"
686 
687   /// Build a new qualified type given its unqualified type and type
688   /// qualifiers.
689   ///
690   /// By default, this routine adds type qualifiers only to types that can
691   /// have qualifiers, and silently suppresses those qualifiers that are not
692   /// permitted. Subclasses may override this routine to provide different
693   /// behavior.
694   QualType RebuildQualifiedType(QualType T, SourceLocation Loc,
695                                 Qualifiers Quals);
696 
697   /// Build a new pointer type given its pointee type.
698   ///
699   /// By default, performs semantic analysis when building the pointer type.
700   /// Subclasses may override this routine to provide different behavior.
701   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
702 
703   /// Build a new block pointer type given its pointee type.
704   ///
705   /// By default, performs semantic analysis when building the block pointer
706   /// type. Subclasses may override this routine to provide different behavior.
707   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
708 
709   /// Build a new reference type given the type it references.
710   ///
711   /// By default, performs semantic analysis when building the
712   /// reference type. Subclasses may override this routine to provide
713   /// different behavior.
714   ///
715   /// \param LValue whether the type was written with an lvalue sigil
716   /// or an rvalue sigil.
717   QualType RebuildReferenceType(QualType ReferentType,
718                                 bool LValue,
719                                 SourceLocation Sigil);
720 
721   /// Build a new member pointer type given the pointee type and the
722   /// class type it refers into.
723   ///
724   /// By default, performs semantic analysis when building the member pointer
725   /// type. Subclasses may override this routine to provide different behavior.
726   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
727                                     SourceLocation Sigil);
728 
729   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
730                                     SourceLocation ProtocolLAngleLoc,
731                                     ArrayRef<ObjCProtocolDecl *> Protocols,
732                                     ArrayRef<SourceLocation> ProtocolLocs,
733                                     SourceLocation ProtocolRAngleLoc);
734 
735   /// Build an Objective-C object type.
736   ///
737   /// By default, performs semantic analysis when building the object type.
738   /// Subclasses may override this routine to provide different behavior.
739   QualType RebuildObjCObjectType(QualType BaseType,
740                                  SourceLocation Loc,
741                                  SourceLocation TypeArgsLAngleLoc,
742                                  ArrayRef<TypeSourceInfo *> TypeArgs,
743                                  SourceLocation TypeArgsRAngleLoc,
744                                  SourceLocation ProtocolLAngleLoc,
745                                  ArrayRef<ObjCProtocolDecl *> Protocols,
746                                  ArrayRef<SourceLocation> ProtocolLocs,
747                                  SourceLocation ProtocolRAngleLoc);
748 
749   /// Build a new Objective-C object pointer type given the pointee type.
750   ///
751   /// By default, directly builds the pointer type, with no additional semantic
752   /// analysis.
753   QualType RebuildObjCObjectPointerType(QualType PointeeType,
754                                         SourceLocation Star);
755 
756   /// Build a new array type given the element type, size
757   /// modifier, size of the array (if known), size expression, and index type
758   /// qualifiers.
759   ///
760   /// By default, performs semantic analysis when building the array type.
761   /// Subclasses may override this routine to provide different behavior.
762   /// Also by default, all of the other Rebuild*Array
763   QualType RebuildArrayType(QualType ElementType,
764                             ArrayType::ArraySizeModifier SizeMod,
765                             const llvm::APInt *Size,
766                             Expr *SizeExpr,
767                             unsigned IndexTypeQuals,
768                             SourceRange BracketsRange);
769 
770   /// Build a new constant array type given the element type, size
771   /// modifier, (known) size of the array, and index type qualifiers.
772   ///
773   /// By default, performs semantic analysis when building the array type.
774   /// Subclasses may override this routine to provide different behavior.
775   QualType RebuildConstantArrayType(QualType ElementType,
776                                     ArrayType::ArraySizeModifier SizeMod,
777                                     const llvm::APInt &Size,
778                                     unsigned IndexTypeQuals,
779                                     SourceRange BracketsRange);
780 
781   /// Build a new incomplete array type given the element type, size
782   /// modifier, and index type qualifiers.
783   ///
784   /// By default, performs semantic analysis when building the array type.
785   /// Subclasses may override this routine to provide different behavior.
786   QualType RebuildIncompleteArrayType(QualType ElementType,
787                                       ArrayType::ArraySizeModifier SizeMod,
788                                       unsigned IndexTypeQuals,
789                                       SourceRange BracketsRange);
790 
791   /// Build a new variable-length array type given the element type,
792   /// size modifier, size expression, and index type qualifiers.
793   ///
794   /// By default, performs semantic analysis when building the array type.
795   /// Subclasses may override this routine to provide different behavior.
796   QualType RebuildVariableArrayType(QualType ElementType,
797                                     ArrayType::ArraySizeModifier SizeMod,
798                                     Expr *SizeExpr,
799                                     unsigned IndexTypeQuals,
800                                     SourceRange BracketsRange);
801 
802   /// Build a new dependent-sized array type given the element type,
803   /// size modifier, size expression, and index type qualifiers.
804   ///
805   /// By default, performs semantic analysis when building the array type.
806   /// Subclasses may override this routine to provide different behavior.
807   QualType RebuildDependentSizedArrayType(QualType ElementType,
808                                           ArrayType::ArraySizeModifier SizeMod,
809                                           Expr *SizeExpr,
810                                           unsigned IndexTypeQuals,
811                                           SourceRange BracketsRange);
812 
813   /// Build a new vector type given the element type and
814   /// number of elements.
815   ///
816   /// By default, performs semantic analysis when building the vector type.
817   /// Subclasses may override this routine to provide different behavior.
818   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
819                              VectorType::VectorKind VecKind);
820 
821   /// Build a new potentially dependently-sized extended vector type
822   /// given the element type and number of elements.
823   ///
824   /// By default, performs semantic analysis when building the vector type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
827                                            SourceLocation AttributeLoc,
828                                            VectorType::VectorKind);
829 
830   /// Build a new extended vector type given the element type and
831   /// number of elements.
832   ///
833   /// By default, performs semantic analysis when building the vector type.
834   /// Subclasses may override this routine to provide different behavior.
835   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
836                                 SourceLocation AttributeLoc);
837 
838   /// Build a new potentially dependently-sized extended vector type
839   /// given the element type and number of elements.
840   ///
841   /// By default, performs semantic analysis when building the vector type.
842   /// Subclasses may override this routine to provide different behavior.
843   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
844                                               Expr *SizeExpr,
845                                               SourceLocation AttributeLoc);
846 
847   /// Build a new DependentAddressSpaceType or return the pointee
848   /// type variable with the correct address space (retrieved from
849   /// AddrSpaceExpr) applied to it. The former will be returned in cases
850   /// where the address space remains dependent.
851   ///
852   /// By default, performs semantic analysis when building the type with address
853   /// space applied. Subclasses may override this routine to provide different
854   /// behavior.
855   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
856                                             Expr *AddrSpaceExpr,
857                                             SourceLocation AttributeLoc);
858 
859   /// Build a new function type.
860   ///
861   /// By default, performs semantic analysis when building the function type.
862   /// Subclasses may override this routine to provide different behavior.
863   QualType RebuildFunctionProtoType(QualType T,
864                                     MutableArrayRef<QualType> ParamTypes,
865                                     const FunctionProtoType::ExtProtoInfo &EPI);
866 
867   /// Build a new unprototyped function type.
868   QualType RebuildFunctionNoProtoType(QualType ResultType);
869 
870   /// Rebuild an unresolved typename type, given the decl that
871   /// the UnresolvedUsingTypenameDecl was transformed to.
872   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
873 
874   /// Build a new typedef type.
875   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
876     return SemaRef.Context.getTypeDeclType(Typedef);
877   }
878 
879   /// Build a new class/struct/union type.
880   QualType RebuildRecordType(RecordDecl *Record) {
881     return SemaRef.Context.getTypeDeclType(Record);
882   }
883 
884   /// Build a new Enum type.
885   QualType RebuildEnumType(EnumDecl *Enum) {
886     return SemaRef.Context.getTypeDeclType(Enum);
887   }
888 
889   /// Build a new typeof(expr) type.
890   ///
891   /// By default, performs semantic analysis when building the typeof type.
892   /// Subclasses may override this routine to provide different behavior.
893   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
894 
895   /// Build a new typeof(type) type.
896   ///
897   /// By default, builds a new TypeOfType with the given underlying type.
898   QualType RebuildTypeOfType(QualType Underlying);
899 
900   /// Build a new unary transform type.
901   QualType RebuildUnaryTransformType(QualType BaseType,
902                                      UnaryTransformType::UTTKind UKind,
903                                      SourceLocation Loc);
904 
905   /// Build a new C++11 decltype type.
906   ///
907   /// By default, performs semantic analysis when building the decltype type.
908   /// Subclasses may override this routine to provide different behavior.
909   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
910 
911   /// Build a new C++11 auto type.
912   ///
913   /// By default, builds a new AutoType with the given deduced type.
914   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
915     // Note, IsDependent is always false here: we implicitly convert an 'auto'
916     // which has been deduced to a dependent type into an undeduced 'auto', so
917     // that we'll retry deduction after the transformation.
918     return SemaRef.Context.getAutoType(Deduced, Keyword,
919                                        /*IsDependent*/ false);
920   }
921 
922   /// By default, builds a new DeducedTemplateSpecializationType with the given
923   /// deduced type.
924   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
925       QualType Deduced) {
926     return SemaRef.Context.getDeducedTemplateSpecializationType(
927         Template, Deduced, /*IsDependent*/ false);
928   }
929 
930   /// Build a new template specialization type.
931   ///
932   /// By default, performs semantic analysis when building the template
933   /// specialization type. Subclasses may override this routine to provide
934   /// different behavior.
935   QualType RebuildTemplateSpecializationType(TemplateName Template,
936                                              SourceLocation TemplateLoc,
937                                              TemplateArgumentListInfo &Args);
938 
939   /// Build a new parenthesized type.
940   ///
941   /// By default, builds a new ParenType type from the inner type.
942   /// Subclasses may override this routine to provide different behavior.
943   QualType RebuildParenType(QualType InnerType) {
944     return SemaRef.BuildParenType(InnerType);
945   }
946 
947   /// Build a new qualified name type.
948   ///
949   /// By default, builds a new ElaboratedType type from the keyword,
950   /// the nested-name-specifier and the named type.
951   /// Subclasses may override this routine to provide different behavior.
952   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
953                                  ElaboratedTypeKeyword Keyword,
954                                  NestedNameSpecifierLoc QualifierLoc,
955                                  QualType Named) {
956     return SemaRef.Context.getElaboratedType(Keyword,
957                                          QualifierLoc.getNestedNameSpecifier(),
958                                              Named);
959   }
960 
961   /// Build a new typename type that refers to a template-id.
962   ///
963   /// By default, builds a new DependentNameType type from the
964   /// nested-name-specifier and the given type. Subclasses may override
965   /// this routine to provide different behavior.
966   QualType RebuildDependentTemplateSpecializationType(
967                                           ElaboratedTypeKeyword Keyword,
968                                           NestedNameSpecifierLoc QualifierLoc,
969                                           SourceLocation TemplateKWLoc,
970                                           const IdentifierInfo *Name,
971                                           SourceLocation NameLoc,
972                                           TemplateArgumentListInfo &Args,
973                                           bool AllowInjectedClassName) {
974     // Rebuild the template name.
975     // TODO: avoid TemplateName abstraction
976     CXXScopeSpec SS;
977     SS.Adopt(QualifierLoc);
978     TemplateName InstName = getDerived().RebuildTemplateName(
979         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
980         AllowInjectedClassName);
981 
982     if (InstName.isNull())
983       return QualType();
984 
985     // If it's still dependent, make a dependent specialization.
986     if (InstName.getAsDependentTemplateName())
987       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
988                                           QualifierLoc.getNestedNameSpecifier(),
989                                                                     Name,
990                                                                     Args);
991 
992     // Otherwise, make an elaborated type wrapping a non-dependent
993     // specialization.
994     QualType T =
995     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
996     if (T.isNull()) return QualType();
997 
998     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
999       return T;
1000 
1001     return SemaRef.Context.getElaboratedType(Keyword,
1002                                        QualifierLoc.getNestedNameSpecifier(),
1003                                              T);
1004   }
1005 
1006   /// Build a new typename type that refers to an identifier.
1007   ///
1008   /// By default, performs semantic analysis when building the typename type
1009   /// (or elaborated type). Subclasses may override this routine to provide
1010   /// different behavior.
1011   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1012                                     SourceLocation KeywordLoc,
1013                                     NestedNameSpecifierLoc QualifierLoc,
1014                                     const IdentifierInfo *Id,
1015                                     SourceLocation IdLoc,
1016                                     bool DeducedTSTContext) {
1017     CXXScopeSpec SS;
1018     SS.Adopt(QualifierLoc);
1019 
1020     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1021       // If the name is still dependent, just build a new dependent name type.
1022       if (!SemaRef.computeDeclContext(SS))
1023         return SemaRef.Context.getDependentNameType(Keyword,
1024                                           QualifierLoc.getNestedNameSpecifier(),
1025                                                     Id);
1026     }
1027 
1028     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1029       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1030                                              *Id, IdLoc);
1031       // If a dependent name resolves to a deduced template specialization type,
1032       // check that we're in one of the syntactic contexts permitting it.
1033       if (!DeducedTSTContext) {
1034         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1035                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1036           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1037             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1038                    Deduced->getTemplateName())
1039             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1040           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1041             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1042           return QualType();
1043         }
1044       }
1045       return T;
1046     }
1047 
1048     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1049 
1050     // We had a dependent elaborated-type-specifier that has been transformed
1051     // into a non-dependent elaborated-type-specifier. Find the tag we're
1052     // referring to.
1053     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1054     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1055     if (!DC)
1056       return QualType();
1057 
1058     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1059       return QualType();
1060 
1061     TagDecl *Tag = nullptr;
1062     SemaRef.LookupQualifiedName(Result, DC);
1063     switch (Result.getResultKind()) {
1064       case LookupResult::NotFound:
1065       case LookupResult::NotFoundInCurrentInstantiation:
1066         break;
1067 
1068       case LookupResult::Found:
1069         Tag = Result.getAsSingle<TagDecl>();
1070         break;
1071 
1072       case LookupResult::FoundOverloaded:
1073       case LookupResult::FoundUnresolvedValue:
1074         llvm_unreachable("Tag lookup cannot find non-tags");
1075 
1076       case LookupResult::Ambiguous:
1077         // Let the LookupResult structure handle ambiguities.
1078         return QualType();
1079     }
1080 
1081     if (!Tag) {
1082       // Check where the name exists but isn't a tag type and use that to emit
1083       // better diagnostics.
1084       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1085       SemaRef.LookupQualifiedName(Result, DC);
1086       switch (Result.getResultKind()) {
1087         case LookupResult::Found:
1088         case LookupResult::FoundOverloaded:
1089         case LookupResult::FoundUnresolvedValue: {
1090           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1091           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1092           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1093                                                                << NTK << Kind;
1094           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1095           break;
1096         }
1097         default:
1098           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1099               << Kind << Id << DC << QualifierLoc.getSourceRange();
1100           break;
1101       }
1102       return QualType();
1103     }
1104 
1105     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1106                                               IdLoc, Id)) {
1107       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1108       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1109       return QualType();
1110     }
1111 
1112     // Build the elaborated-type-specifier type.
1113     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1114     return SemaRef.Context.getElaboratedType(Keyword,
1115                                          QualifierLoc.getNestedNameSpecifier(),
1116                                              T);
1117   }
1118 
1119   /// Build a new pack expansion type.
1120   ///
1121   /// By default, builds a new PackExpansionType type from the given pattern.
1122   /// Subclasses may override this routine to provide different behavior.
1123   QualType RebuildPackExpansionType(QualType Pattern,
1124                                     SourceRange PatternRange,
1125                                     SourceLocation EllipsisLoc,
1126                                     Optional<unsigned> NumExpansions) {
1127     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1128                                         NumExpansions);
1129   }
1130 
1131   /// Build a new atomic type given its value type.
1132   ///
1133   /// By default, performs semantic analysis when building the atomic type.
1134   /// Subclasses may override this routine to provide different behavior.
1135   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1136 
1137   /// Build a new pipe type given its value type.
1138   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1139                            bool isReadPipe);
1140 
1141   /// Build a new template name given a nested name specifier, a flag
1142   /// indicating whether the "template" keyword was provided, and the template
1143   /// that the template name refers to.
1144   ///
1145   /// By default, builds the new template name directly. Subclasses may override
1146   /// this routine to provide different behavior.
1147   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1148                                    bool TemplateKW,
1149                                    TemplateDecl *Template);
1150 
1151   /// Build a new template name given a nested name specifier and the
1152   /// name that is referred to as a template.
1153   ///
1154   /// By default, performs semantic analysis to determine whether the name can
1155   /// be resolved to a specific template, then builds the appropriate kind of
1156   /// template name. Subclasses may override this routine to provide different
1157   /// behavior.
1158   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1159                                    SourceLocation TemplateKWLoc,
1160                                    const IdentifierInfo &Name,
1161                                    SourceLocation NameLoc, QualType ObjectType,
1162                                    NamedDecl *FirstQualifierInScope,
1163                                    bool AllowInjectedClassName);
1164 
1165   /// Build a new template name given a nested name specifier and the
1166   /// overloaded operator name that is referred to as a template.
1167   ///
1168   /// By default, performs semantic analysis to determine whether the name can
1169   /// be resolved to a specific template, then builds the appropriate kind of
1170   /// template name. Subclasses may override this routine to provide different
1171   /// behavior.
1172   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1173                                    SourceLocation TemplateKWLoc,
1174                                    OverloadedOperatorKind Operator,
1175                                    SourceLocation NameLoc, QualType ObjectType,
1176                                    bool AllowInjectedClassName);
1177 
1178   /// Build a new template name given a template template parameter pack
1179   /// and the
1180   ///
1181   /// By default, performs semantic analysis to determine whether the name can
1182   /// be resolved to a specific template, then builds the appropriate kind of
1183   /// template name. Subclasses may override this routine to provide different
1184   /// behavior.
1185   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1186                                    const TemplateArgument &ArgPack) {
1187     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1188   }
1189 
1190   /// Build a new compound statement.
1191   ///
1192   /// By default, performs semantic analysis to build the new statement.
1193   /// Subclasses may override this routine to provide different behavior.
1194   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1195                                        MultiStmtArg Statements,
1196                                        SourceLocation RBraceLoc,
1197                                        bool IsStmtExpr) {
1198     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1199                                        IsStmtExpr);
1200   }
1201 
1202   /// Build a new case statement.
1203   ///
1204   /// By default, performs semantic analysis to build the new statement.
1205   /// Subclasses may override this routine to provide different behavior.
1206   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1207                                    Expr *LHS,
1208                                    SourceLocation EllipsisLoc,
1209                                    Expr *RHS,
1210                                    SourceLocation ColonLoc) {
1211     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1212                                    ColonLoc);
1213   }
1214 
1215   /// Attach the body to a new case statement.
1216   ///
1217   /// By default, performs semantic analysis to build the new statement.
1218   /// Subclasses may override this routine to provide different behavior.
1219   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1220     getSema().ActOnCaseStmtBody(S, Body);
1221     return S;
1222   }
1223 
1224   /// Build a new default statement.
1225   ///
1226   /// By default, performs semantic analysis to build the new statement.
1227   /// Subclasses may override this routine to provide different behavior.
1228   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1229                                       SourceLocation ColonLoc,
1230                                       Stmt *SubStmt) {
1231     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1232                                       /*CurScope=*/nullptr);
1233   }
1234 
1235   /// Build a new label statement.
1236   ///
1237   /// By default, performs semantic analysis to build the new statement.
1238   /// Subclasses may override this routine to provide different behavior.
1239   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1240                               SourceLocation ColonLoc, Stmt *SubStmt) {
1241     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1242   }
1243 
1244   /// Build a new label statement.
1245   ///
1246   /// By default, performs semantic analysis to build the new statement.
1247   /// Subclasses may override this routine to provide different behavior.
1248   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1249                                    ArrayRef<const Attr*> Attrs,
1250                                    Stmt *SubStmt) {
1251     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1252   }
1253 
1254   /// Build a new "if" statement.
1255   ///
1256   /// By default, performs semantic analysis to build the new statement.
1257   /// Subclasses may override this routine to provide different behavior.
1258   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1259                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1260                            SourceLocation ElseLoc, Stmt *Else) {
1261     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1262                                  ElseLoc, Else);
1263   }
1264 
1265   /// Start building a new switch statement.
1266   ///
1267   /// By default, performs semantic analysis to build the new statement.
1268   /// Subclasses may override this routine to provide different behavior.
1269   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1270                                     Sema::ConditionResult Cond) {
1271     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1272   }
1273 
1274   /// Attach the body to the switch statement.
1275   ///
1276   /// By default, performs semantic analysis to build the new statement.
1277   /// Subclasses may override this routine to provide different behavior.
1278   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1279                                    Stmt *Switch, Stmt *Body) {
1280     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1281   }
1282 
1283   /// Build a new while statement.
1284   ///
1285   /// By default, performs semantic analysis to build the new statement.
1286   /// Subclasses may override this routine to provide different behavior.
1287   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1288                               Sema::ConditionResult Cond, Stmt *Body) {
1289     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1290   }
1291 
1292   /// Build a new do-while statement.
1293   ///
1294   /// By default, performs semantic analysis to build the new statement.
1295   /// Subclasses may override this routine to provide different behavior.
1296   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1297                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1298                            Expr *Cond, SourceLocation RParenLoc) {
1299     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1300                                  Cond, RParenLoc);
1301   }
1302 
1303   /// Build a new for statement.
1304   ///
1305   /// By default, performs semantic analysis to build the new statement.
1306   /// Subclasses may override this routine to provide different behavior.
1307   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1308                             Stmt *Init, Sema::ConditionResult Cond,
1309                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1310                             Stmt *Body) {
1311     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1312                                   Inc, RParenLoc, Body);
1313   }
1314 
1315   /// Build a new goto statement.
1316   ///
1317   /// By default, performs semantic analysis to build the new statement.
1318   /// Subclasses may override this routine to provide different behavior.
1319   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1320                              LabelDecl *Label) {
1321     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1322   }
1323 
1324   /// Build a new indirect goto statement.
1325   ///
1326   /// By default, performs semantic analysis to build the new statement.
1327   /// Subclasses may override this routine to provide different behavior.
1328   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1329                                      SourceLocation StarLoc,
1330                                      Expr *Target) {
1331     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1332   }
1333 
1334   /// Build a new return statement.
1335   ///
1336   /// By default, performs semantic analysis to build the new statement.
1337   /// Subclasses may override this routine to provide different behavior.
1338   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1339     return getSema().BuildReturnStmt(ReturnLoc, Result);
1340   }
1341 
1342   /// Build a new declaration statement.
1343   ///
1344   /// By default, performs semantic analysis to build the new statement.
1345   /// Subclasses may override this routine to provide different behavior.
1346   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1347                              SourceLocation StartLoc, SourceLocation EndLoc) {
1348     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1349     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1350   }
1351 
1352   /// Build a new inline asm statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
1356   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1357                                bool IsVolatile, unsigned NumOutputs,
1358                                unsigned NumInputs, IdentifierInfo **Names,
1359                                MultiExprArg Constraints, MultiExprArg Exprs,
1360                                Expr *AsmString, MultiExprArg Clobbers,
1361                                SourceLocation RParenLoc) {
1362     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1363                                      NumInputs, Names, Constraints, Exprs,
1364                                      AsmString, Clobbers, RParenLoc);
1365   }
1366 
1367   /// Build a new MS style inline asm statement.
1368   ///
1369   /// By default, performs semantic analysis to build the new statement.
1370   /// Subclasses may override this routine to provide different behavior.
1371   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1372                               ArrayRef<Token> AsmToks,
1373                               StringRef AsmString,
1374                               unsigned NumOutputs, unsigned NumInputs,
1375                               ArrayRef<StringRef> Constraints,
1376                               ArrayRef<StringRef> Clobbers,
1377                               ArrayRef<Expr*> Exprs,
1378                               SourceLocation EndLoc) {
1379     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1380                                     NumOutputs, NumInputs,
1381                                     Constraints, Clobbers, Exprs, EndLoc);
1382   }
1383 
1384   /// Build a new co_return statement.
1385   ///
1386   /// By default, performs semantic analysis to build the new statement.
1387   /// Subclasses may override this routine to provide different behavior.
1388   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1389                                  bool IsImplicit) {
1390     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1391   }
1392 
1393   /// Build a new co_await expression.
1394   ///
1395   /// By default, performs semantic analysis to build the new expression.
1396   /// Subclasses may override this routine to provide different behavior.
1397   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1398                                 bool IsImplicit) {
1399     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1400   }
1401 
1402   /// Build a new co_await expression.
1403   ///
1404   /// By default, performs semantic analysis to build the new expression.
1405   /// Subclasses may override this routine to provide different behavior.
1406   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1407                                          Expr *Result,
1408                                          UnresolvedLookupExpr *Lookup) {
1409     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1410   }
1411 
1412   /// Build a new co_yield expression.
1413   ///
1414   /// By default, performs semantic analysis to build the new expression.
1415   /// Subclasses may override this routine to provide different behavior.
1416   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1417     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1418   }
1419 
1420   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1421     return getSema().BuildCoroutineBodyStmt(Args);
1422   }
1423 
1424   /// Build a new Objective-C \@try statement.
1425   ///
1426   /// By default, performs semantic analysis to build the new statement.
1427   /// Subclasses may override this routine to provide different behavior.
1428   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1429                                         Stmt *TryBody,
1430                                         MultiStmtArg CatchStmts,
1431                                         Stmt *Finally) {
1432     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1433                                         Finally);
1434   }
1435 
1436   /// Rebuild an Objective-C exception declaration.
1437   ///
1438   /// By default, performs semantic analysis to build the new declaration.
1439   /// Subclasses may override this routine to provide different behavior.
1440   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1441                                     TypeSourceInfo *TInfo, QualType T) {
1442     return getSema().BuildObjCExceptionDecl(TInfo, T,
1443                                             ExceptionDecl->getInnerLocStart(),
1444                                             ExceptionDecl->getLocation(),
1445                                             ExceptionDecl->getIdentifier());
1446   }
1447 
1448   /// Build a new Objective-C \@catch statement.
1449   ///
1450   /// By default, performs semantic analysis to build the new statement.
1451   /// Subclasses may override this routine to provide different behavior.
1452   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1453                                           SourceLocation RParenLoc,
1454                                           VarDecl *Var,
1455                                           Stmt *Body) {
1456     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1457                                           Var, Body);
1458   }
1459 
1460   /// Build a new Objective-C \@finally statement.
1461   ///
1462   /// By default, performs semantic analysis to build the new statement.
1463   /// Subclasses may override this routine to provide different behavior.
1464   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1465                                             Stmt *Body) {
1466     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1467   }
1468 
1469   /// Build a new Objective-C \@throw statement.
1470   ///
1471   /// By default, performs semantic analysis to build the new statement.
1472   /// Subclasses may override this routine to provide different behavior.
1473   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1474                                           Expr *Operand) {
1475     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1476   }
1477 
1478   /// Build a new OpenMP executable directive.
1479   ///
1480   /// By default, performs semantic analysis to build the new statement.
1481   /// Subclasses may override this routine to provide different behavior.
1482   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1483                                            DeclarationNameInfo DirName,
1484                                            OpenMPDirectiveKind CancelRegion,
1485                                            ArrayRef<OMPClause *> Clauses,
1486                                            Stmt *AStmt, SourceLocation StartLoc,
1487                                            SourceLocation EndLoc) {
1488     return getSema().ActOnOpenMPExecutableDirective(
1489         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1490   }
1491 
1492   /// Build a new OpenMP 'if' clause.
1493   ///
1494   /// By default, performs semantic analysis to build the new OpenMP clause.
1495   /// Subclasses may override this routine to provide different behavior.
1496   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1497                                 Expr *Condition, SourceLocation StartLoc,
1498                                 SourceLocation LParenLoc,
1499                                 SourceLocation NameModifierLoc,
1500                                 SourceLocation ColonLoc,
1501                                 SourceLocation EndLoc) {
1502     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1503                                          LParenLoc, NameModifierLoc, ColonLoc,
1504                                          EndLoc);
1505   }
1506 
1507   /// Build a new OpenMP 'final' clause.
1508   ///
1509   /// By default, performs semantic analysis to build the new OpenMP clause.
1510   /// Subclasses may override this routine to provide different behavior.
1511   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1512                                    SourceLocation LParenLoc,
1513                                    SourceLocation EndLoc) {
1514     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1515                                             EndLoc);
1516   }
1517 
1518   /// Build a new OpenMP 'num_threads' clause.
1519   ///
1520   /// By default, performs semantic analysis to build the new OpenMP clause.
1521   /// Subclasses may override this routine to provide different behavior.
1522   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1523                                         SourceLocation StartLoc,
1524                                         SourceLocation LParenLoc,
1525                                         SourceLocation EndLoc) {
1526     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1527                                                  LParenLoc, EndLoc);
1528   }
1529 
1530   /// Build a new OpenMP 'safelen' clause.
1531   ///
1532   /// By default, performs semantic analysis to build the new OpenMP clause.
1533   /// Subclasses may override this routine to provide different behavior.
1534   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1535                                      SourceLocation LParenLoc,
1536                                      SourceLocation EndLoc) {
1537     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1538   }
1539 
1540   /// Build a new OpenMP 'simdlen' clause.
1541   ///
1542   /// By default, performs semantic analysis to build the new OpenMP clause.
1543   /// Subclasses may override this routine to provide different behavior.
1544   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1545                                      SourceLocation LParenLoc,
1546                                      SourceLocation EndLoc) {
1547     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1548   }
1549 
1550   /// Build a new OpenMP 'collapse' clause.
1551   ///
1552   /// By default, performs semantic analysis to build the new OpenMP clause.
1553   /// Subclasses may override this routine to provide different behavior.
1554   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1555                                       SourceLocation LParenLoc,
1556                                       SourceLocation EndLoc) {
1557     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1558                                                EndLoc);
1559   }
1560 
1561   /// Build a new OpenMP 'default' clause.
1562   ///
1563   /// By default, performs semantic analysis to build the new OpenMP clause.
1564   /// Subclasses may override this routine to provide different behavior.
1565   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1566                                      SourceLocation KindKwLoc,
1567                                      SourceLocation StartLoc,
1568                                      SourceLocation LParenLoc,
1569                                      SourceLocation EndLoc) {
1570     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1571                                               StartLoc, LParenLoc, EndLoc);
1572   }
1573 
1574   /// Build a new OpenMP 'proc_bind' clause.
1575   ///
1576   /// By default, performs semantic analysis to build the new OpenMP clause.
1577   /// Subclasses may override this routine to provide different behavior.
1578   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1579                                       SourceLocation KindKwLoc,
1580                                       SourceLocation StartLoc,
1581                                       SourceLocation LParenLoc,
1582                                       SourceLocation EndLoc) {
1583     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1584                                                StartLoc, LParenLoc, EndLoc);
1585   }
1586 
1587   /// Build a new OpenMP 'schedule' clause.
1588   ///
1589   /// By default, performs semantic analysis to build the new OpenMP clause.
1590   /// Subclasses may override this routine to provide different behavior.
1591   OMPClause *RebuildOMPScheduleClause(
1592       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1593       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1594       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1595       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1596     return getSema().ActOnOpenMPScheduleClause(
1597         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1598         CommaLoc, EndLoc);
1599   }
1600 
1601   /// Build a new OpenMP 'ordered' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1606                                      SourceLocation EndLoc,
1607                                      SourceLocation LParenLoc, Expr *Num) {
1608     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1609   }
1610 
1611   /// Build a new OpenMP 'private' clause.
1612   ///
1613   /// By default, performs semantic analysis to build the new OpenMP clause.
1614   /// Subclasses may override this routine to provide different behavior.
1615   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1616                                      SourceLocation StartLoc,
1617                                      SourceLocation LParenLoc,
1618                                      SourceLocation EndLoc) {
1619     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1620                                               EndLoc);
1621   }
1622 
1623   /// Build a new OpenMP 'firstprivate' clause.
1624   ///
1625   /// By default, performs semantic analysis to build the new OpenMP clause.
1626   /// Subclasses may override this routine to provide different behavior.
1627   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1628                                           SourceLocation StartLoc,
1629                                           SourceLocation LParenLoc,
1630                                           SourceLocation EndLoc) {
1631     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1632                                                    EndLoc);
1633   }
1634 
1635   /// Build a new OpenMP 'lastprivate' clause.
1636   ///
1637   /// By default, performs semantic analysis to build the new OpenMP clause.
1638   /// Subclasses may override this routine to provide different behavior.
1639   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1640                                          SourceLocation StartLoc,
1641                                          SourceLocation LParenLoc,
1642                                          SourceLocation EndLoc) {
1643     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1644                                                   EndLoc);
1645   }
1646 
1647   /// Build a new OpenMP 'shared' clause.
1648   ///
1649   /// By default, performs semantic analysis to build the new OpenMP clause.
1650   /// Subclasses may override this routine to provide different behavior.
1651   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1652                                     SourceLocation StartLoc,
1653                                     SourceLocation LParenLoc,
1654                                     SourceLocation EndLoc) {
1655     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1656                                              EndLoc);
1657   }
1658 
1659   /// Build a new OpenMP 'reduction' clause.
1660   ///
1661   /// By default, performs semantic analysis to build the new statement.
1662   /// Subclasses may override this routine to provide different behavior.
1663   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1664                                        SourceLocation StartLoc,
1665                                        SourceLocation LParenLoc,
1666                                        SourceLocation ColonLoc,
1667                                        SourceLocation EndLoc,
1668                                        CXXScopeSpec &ReductionIdScopeSpec,
1669                                        const DeclarationNameInfo &ReductionId,
1670                                        ArrayRef<Expr *> UnresolvedReductions) {
1671     return getSema().ActOnOpenMPReductionClause(
1672         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1673         ReductionId, UnresolvedReductions);
1674   }
1675 
1676   /// Build a new OpenMP 'task_reduction' clause.
1677   ///
1678   /// By default, performs semantic analysis to build the new statement.
1679   /// Subclasses may override this routine to provide different behavior.
1680   OMPClause *RebuildOMPTaskReductionClause(
1681       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1682       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1683       CXXScopeSpec &ReductionIdScopeSpec,
1684       const DeclarationNameInfo &ReductionId,
1685       ArrayRef<Expr *> UnresolvedReductions) {
1686     return getSema().ActOnOpenMPTaskReductionClause(
1687         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1688         ReductionId, UnresolvedReductions);
1689   }
1690 
1691   /// Build a new OpenMP 'in_reduction' clause.
1692   ///
1693   /// By default, performs semantic analysis to build the new statement.
1694   /// Subclasses may override this routine to provide different behavior.
1695   OMPClause *
1696   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1697                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1698                               SourceLocation EndLoc,
1699                               CXXScopeSpec &ReductionIdScopeSpec,
1700                               const DeclarationNameInfo &ReductionId,
1701                               ArrayRef<Expr *> UnresolvedReductions) {
1702     return getSema().ActOnOpenMPInReductionClause(
1703         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1704         ReductionId, UnresolvedReductions);
1705   }
1706 
1707   /// Build a new OpenMP 'linear' clause.
1708   ///
1709   /// By default, performs semantic analysis to build the new OpenMP clause.
1710   /// Subclasses may override this routine to provide different behavior.
1711   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1712                                     SourceLocation StartLoc,
1713                                     SourceLocation LParenLoc,
1714                                     OpenMPLinearClauseKind Modifier,
1715                                     SourceLocation ModifierLoc,
1716                                     SourceLocation ColonLoc,
1717                                     SourceLocation EndLoc) {
1718     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1719                                              Modifier, ModifierLoc, ColonLoc,
1720                                              EndLoc);
1721   }
1722 
1723   /// Build a new OpenMP 'aligned' clause.
1724   ///
1725   /// By default, performs semantic analysis to build the new OpenMP clause.
1726   /// Subclasses may override this routine to provide different behavior.
1727   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1728                                      SourceLocation StartLoc,
1729                                      SourceLocation LParenLoc,
1730                                      SourceLocation ColonLoc,
1731                                      SourceLocation EndLoc) {
1732     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1733                                               LParenLoc, ColonLoc, EndLoc);
1734   }
1735 
1736   /// Build a new OpenMP 'copyin' clause.
1737   ///
1738   /// By default, performs semantic analysis to build the new OpenMP clause.
1739   /// Subclasses may override this routine to provide different behavior.
1740   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1741                                     SourceLocation StartLoc,
1742                                     SourceLocation LParenLoc,
1743                                     SourceLocation EndLoc) {
1744     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1745                                              EndLoc);
1746   }
1747 
1748   /// Build a new OpenMP 'copyprivate' clause.
1749   ///
1750   /// By default, performs semantic analysis to build the new OpenMP clause.
1751   /// Subclasses may override this routine to provide different behavior.
1752   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1753                                          SourceLocation StartLoc,
1754                                          SourceLocation LParenLoc,
1755                                          SourceLocation EndLoc) {
1756     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1757                                                   EndLoc);
1758   }
1759 
1760   /// Build a new OpenMP 'flush' pseudo clause.
1761   ///
1762   /// By default, performs semantic analysis to build the new OpenMP clause.
1763   /// Subclasses may override this routine to provide different behavior.
1764   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1765                                    SourceLocation StartLoc,
1766                                    SourceLocation LParenLoc,
1767                                    SourceLocation EndLoc) {
1768     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1769                                             EndLoc);
1770   }
1771 
1772   /// Build a new OpenMP 'depend' pseudo clause.
1773   ///
1774   /// By default, performs semantic analysis to build the new OpenMP clause.
1775   /// Subclasses may override this routine to provide different behavior.
1776   OMPClause *
1777   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1778                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1779                          SourceLocation StartLoc, SourceLocation LParenLoc,
1780                          SourceLocation EndLoc) {
1781     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1782                                              StartLoc, LParenLoc, EndLoc);
1783   }
1784 
1785   /// Build a new OpenMP 'device' clause.
1786   ///
1787   /// By default, performs semantic analysis to build the new statement.
1788   /// Subclasses may override this routine to provide different behavior.
1789   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1790                                     SourceLocation LParenLoc,
1791                                     SourceLocation EndLoc) {
1792     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1793                                              EndLoc);
1794   }
1795 
1796   /// Build a new OpenMP 'map' clause.
1797   ///
1798   /// By default, performs semantic analysis to build the new OpenMP clause.
1799   /// Subclasses may override this routine to provide different behavior.
1800   OMPClause *
1801   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1802                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1803                       SourceLocation MapLoc, SourceLocation ColonLoc,
1804                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1805                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1806     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1807                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1808                                           VarList, StartLoc, LParenLoc, EndLoc);
1809   }
1810 
1811   /// Build a new OpenMP 'num_teams' clause.
1812   ///
1813   /// By default, performs semantic analysis to build the new statement.
1814   /// Subclasses may override this routine to provide different behavior.
1815   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1816                                       SourceLocation LParenLoc,
1817                                       SourceLocation EndLoc) {
1818     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1819                                                EndLoc);
1820   }
1821 
1822   /// Build a new OpenMP 'thread_limit' clause.
1823   ///
1824   /// By default, performs semantic analysis to build the new statement.
1825   /// Subclasses may override this routine to provide different behavior.
1826   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1827                                          SourceLocation StartLoc,
1828                                          SourceLocation LParenLoc,
1829                                          SourceLocation EndLoc) {
1830     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1831                                                   LParenLoc, EndLoc);
1832   }
1833 
1834   /// Build a new OpenMP 'priority' clause.
1835   ///
1836   /// By default, performs semantic analysis to build the new statement.
1837   /// Subclasses may override this routine to provide different behavior.
1838   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1839                                       SourceLocation LParenLoc,
1840                                       SourceLocation EndLoc) {
1841     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1842                                                EndLoc);
1843   }
1844 
1845   /// Build a new OpenMP 'grainsize' clause.
1846   ///
1847   /// By default, performs semantic analysis to build the new statement.
1848   /// Subclasses may override this routine to provide different behavior.
1849   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1850                                        SourceLocation LParenLoc,
1851                                        SourceLocation EndLoc) {
1852     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1853                                                 EndLoc);
1854   }
1855 
1856   /// Build a new OpenMP 'num_tasks' clause.
1857   ///
1858   /// By default, performs semantic analysis to build the new statement.
1859   /// Subclasses may override this routine to provide different behavior.
1860   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1861                                       SourceLocation LParenLoc,
1862                                       SourceLocation EndLoc) {
1863     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1864                                                EndLoc);
1865   }
1866 
1867   /// Build a new OpenMP 'hint' clause.
1868   ///
1869   /// By default, performs semantic analysis to build the new statement.
1870   /// Subclasses may override this routine to provide different behavior.
1871   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1872                                   SourceLocation LParenLoc,
1873                                   SourceLocation EndLoc) {
1874     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1875   }
1876 
1877   /// Build a new OpenMP 'dist_schedule' clause.
1878   ///
1879   /// By default, performs semantic analysis to build the new OpenMP clause.
1880   /// Subclasses may override this routine to provide different behavior.
1881   OMPClause *
1882   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1883                                Expr *ChunkSize, SourceLocation StartLoc,
1884                                SourceLocation LParenLoc, SourceLocation KindLoc,
1885                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1886     return getSema().ActOnOpenMPDistScheduleClause(
1887         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1888   }
1889 
1890   /// Build a new OpenMP 'to' clause.
1891   ///
1892   /// By default, performs semantic analysis to build the new statement.
1893   /// Subclasses may override this routine to provide different behavior.
1894   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1895                                 SourceLocation StartLoc,
1896                                 SourceLocation LParenLoc,
1897                                 SourceLocation EndLoc) {
1898     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1899   }
1900 
1901   /// Build a new OpenMP 'from' clause.
1902   ///
1903   /// By default, performs semantic analysis to build the new statement.
1904   /// Subclasses may override this routine to provide different behavior.
1905   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1906                                   SourceLocation StartLoc,
1907                                   SourceLocation LParenLoc,
1908                                   SourceLocation EndLoc) {
1909     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1910                                            EndLoc);
1911   }
1912 
1913   /// Build a new OpenMP 'use_device_ptr' clause.
1914   ///
1915   /// By default, performs semantic analysis to build the new OpenMP clause.
1916   /// Subclasses may override this routine to provide different behavior.
1917   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1918                                           SourceLocation StartLoc,
1919                                           SourceLocation LParenLoc,
1920                                           SourceLocation EndLoc) {
1921     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1922                                                    EndLoc);
1923   }
1924 
1925   /// Build a new OpenMP 'is_device_ptr' clause.
1926   ///
1927   /// By default, performs semantic analysis to build the new OpenMP clause.
1928   /// Subclasses may override this routine to provide different behavior.
1929   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1930                                          SourceLocation StartLoc,
1931                                          SourceLocation LParenLoc,
1932                                          SourceLocation EndLoc) {
1933     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1934                                                   EndLoc);
1935   }
1936 
1937   /// Rebuild the operand to an Objective-C \@synchronized statement.
1938   ///
1939   /// By default, performs semantic analysis to build the new statement.
1940   /// Subclasses may override this routine to provide different behavior.
1941   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1942                                               Expr *object) {
1943     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1944   }
1945 
1946   /// Build a new Objective-C \@synchronized statement.
1947   ///
1948   /// By default, performs semantic analysis to build the new statement.
1949   /// Subclasses may override this routine to provide different behavior.
1950   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1951                                            Expr *Object, Stmt *Body) {
1952     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1953   }
1954 
1955   /// Build a new Objective-C \@autoreleasepool statement.
1956   ///
1957   /// By default, performs semantic analysis to build the new statement.
1958   /// Subclasses may override this routine to provide different behavior.
1959   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1960                                             Stmt *Body) {
1961     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1962   }
1963 
1964   /// Build a new Objective-C fast enumeration statement.
1965   ///
1966   /// By default, performs semantic analysis to build the new statement.
1967   /// Subclasses may override this routine to provide different behavior.
1968   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1969                                           Stmt *Element,
1970                                           Expr *Collection,
1971                                           SourceLocation RParenLoc,
1972                                           Stmt *Body) {
1973     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1974                                                 Element,
1975                                                 Collection,
1976                                                 RParenLoc);
1977     if (ForEachStmt.isInvalid())
1978       return StmtError();
1979 
1980     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1981   }
1982 
1983   /// Build a new C++ exception declaration.
1984   ///
1985   /// By default, performs semantic analysis to build the new decaration.
1986   /// Subclasses may override this routine to provide different behavior.
1987   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1988                                 TypeSourceInfo *Declarator,
1989                                 SourceLocation StartLoc,
1990                                 SourceLocation IdLoc,
1991                                 IdentifierInfo *Id) {
1992     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1993                                                        StartLoc, IdLoc, Id);
1994     if (Var)
1995       getSema().CurContext->addDecl(Var);
1996     return Var;
1997   }
1998 
1999   /// Build a new C++ catch statement.
2000   ///
2001   /// By default, performs semantic analysis to build the new statement.
2002   /// Subclasses may override this routine to provide different behavior.
2003   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2004                                  VarDecl *ExceptionDecl,
2005                                  Stmt *Handler) {
2006     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2007                                                       Handler));
2008   }
2009 
2010   /// Build a new C++ try statement.
2011   ///
2012   /// By default, performs semantic analysis to build the new statement.
2013   /// Subclasses may override this routine to provide different behavior.
2014   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2015                                ArrayRef<Stmt *> Handlers) {
2016     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2017   }
2018 
2019   /// Build a new C++0x range-based for statement.
2020   ///
2021   /// By default, performs semantic analysis to build the new statement.
2022   /// Subclasses may override this routine to provide different behavior.
2023   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2024                                     SourceLocation CoawaitLoc,
2025                                     SourceLocation ColonLoc,
2026                                     Stmt *Range, Stmt *Begin, Stmt *End,
2027                                     Expr *Cond, Expr *Inc,
2028                                     Stmt *LoopVar,
2029                                     SourceLocation RParenLoc) {
2030     // If we've just learned that the range is actually an Objective-C
2031     // collection, treat this as an Objective-C fast enumeration loop.
2032     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2033       if (RangeStmt->isSingleDecl()) {
2034         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2035           if (RangeVar->isInvalidDecl())
2036             return StmtError();
2037 
2038           Expr *RangeExpr = RangeVar->getInit();
2039           if (!RangeExpr->isTypeDependent() &&
2040               RangeExpr->getType()->isObjCObjectPointerType())
2041             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
2042                                                         RParenLoc);
2043         }
2044       }
2045     }
2046 
2047     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
2048                                           Range, Begin, End,
2049                                           Cond, Inc, LoopVar, RParenLoc,
2050                                           Sema::BFRK_Rebuild);
2051   }
2052 
2053   /// Build a new C++0x range-based for statement.
2054   ///
2055   /// By default, performs semantic analysis to build the new statement.
2056   /// Subclasses may override this routine to provide different behavior.
2057   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2058                                           bool IsIfExists,
2059                                           NestedNameSpecifierLoc QualifierLoc,
2060                                           DeclarationNameInfo NameInfo,
2061                                           Stmt *Nested) {
2062     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2063                                                 QualifierLoc, NameInfo, Nested);
2064   }
2065 
2066   /// Attach body to a C++0x range-based for statement.
2067   ///
2068   /// By default, performs semantic analysis to finish the new statement.
2069   /// Subclasses may override this routine to provide different behavior.
2070   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2071     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2072   }
2073 
2074   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2075                                Stmt *TryBlock, Stmt *Handler) {
2076     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2077   }
2078 
2079   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2080                                   Stmt *Block) {
2081     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2082   }
2083 
2084   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2085     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2086   }
2087 
2088   /// Build a new predefined expression.
2089   ///
2090   /// By default, performs semantic analysis to build the new expression.
2091   /// Subclasses may override this routine to provide different behavior.
2092   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2093                                    PredefinedExpr::IdentType IT) {
2094     return getSema().BuildPredefinedExpr(Loc, IT);
2095   }
2096 
2097   /// Build a new expression that references a declaration.
2098   ///
2099   /// By default, performs semantic analysis to build the new expression.
2100   /// Subclasses may override this routine to provide different behavior.
2101   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2102                                         LookupResult &R,
2103                                         bool RequiresADL) {
2104     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2105   }
2106 
2107 
2108   /// Build a new expression that references a declaration.
2109   ///
2110   /// By default, performs semantic analysis to build the new expression.
2111   /// Subclasses may override this routine to provide different behavior.
2112   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2113                                 ValueDecl *VD,
2114                                 const DeclarationNameInfo &NameInfo,
2115                                 TemplateArgumentListInfo *TemplateArgs) {
2116     CXXScopeSpec SS;
2117     SS.Adopt(QualifierLoc);
2118 
2119     // FIXME: loses template args.
2120 
2121     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2122   }
2123 
2124   /// Build a new expression in parentheses.
2125   ///
2126   /// By default, performs semantic analysis to build the new expression.
2127   /// Subclasses may override this routine to provide different behavior.
2128   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2129                                     SourceLocation RParen) {
2130     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2131   }
2132 
2133   /// Build a new pseudo-destructor expression.
2134   ///
2135   /// By default, performs semantic analysis to build the new expression.
2136   /// Subclasses may override this routine to provide different behavior.
2137   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2138                                             SourceLocation OperatorLoc,
2139                                             bool isArrow,
2140                                             CXXScopeSpec &SS,
2141                                             TypeSourceInfo *ScopeType,
2142                                             SourceLocation CCLoc,
2143                                             SourceLocation TildeLoc,
2144                                         PseudoDestructorTypeStorage Destroyed);
2145 
2146   /// Build a new unary operator expression.
2147   ///
2148   /// By default, performs semantic analysis to build the new expression.
2149   /// Subclasses may override this routine to provide different behavior.
2150   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2151                                         UnaryOperatorKind Opc,
2152                                         Expr *SubExpr) {
2153     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2154   }
2155 
2156   /// Build a new builtin offsetof expression.
2157   ///
2158   /// By default, performs semantic analysis to build the new expression.
2159   /// Subclasses may override this routine to provide different behavior.
2160   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2161                                  TypeSourceInfo *Type,
2162                                  ArrayRef<Sema::OffsetOfComponent> Components,
2163                                  SourceLocation RParenLoc) {
2164     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2165                                           RParenLoc);
2166   }
2167 
2168   /// Build a new sizeof, alignof or vec_step expression with a
2169   /// type argument.
2170   ///
2171   /// By default, performs semantic analysis to build the new expression.
2172   /// Subclasses may override this routine to provide different behavior.
2173   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2174                                          SourceLocation OpLoc,
2175                                          UnaryExprOrTypeTrait ExprKind,
2176                                          SourceRange R) {
2177     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2178   }
2179 
2180   /// Build a new sizeof, alignof or vec step expression with an
2181   /// expression argument.
2182   ///
2183   /// By default, performs semantic analysis to build the new expression.
2184   /// Subclasses may override this routine to provide different behavior.
2185   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2186                                          UnaryExprOrTypeTrait ExprKind,
2187                                          SourceRange R) {
2188     ExprResult Result
2189       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2190     if (Result.isInvalid())
2191       return ExprError();
2192 
2193     return Result;
2194   }
2195 
2196   /// Build a new array subscript expression.
2197   ///
2198   /// By default, performs semantic analysis to build the new expression.
2199   /// Subclasses may override this routine to provide different behavior.
2200   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2201                                              SourceLocation LBracketLoc,
2202                                              Expr *RHS,
2203                                              SourceLocation RBracketLoc) {
2204     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2205                                              LBracketLoc, RHS,
2206                                              RBracketLoc);
2207   }
2208 
2209   /// Build a new array section expression.
2210   ///
2211   /// By default, performs semantic analysis to build the new expression.
2212   /// Subclasses may override this routine to provide different behavior.
2213   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2214                                         Expr *LowerBound,
2215                                         SourceLocation ColonLoc, Expr *Length,
2216                                         SourceLocation RBracketLoc) {
2217     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2218                                               ColonLoc, Length, RBracketLoc);
2219   }
2220 
2221   /// Build a new call expression.
2222   ///
2223   /// By default, performs semantic analysis to build the new expression.
2224   /// Subclasses may override this routine to provide different behavior.
2225   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2226                                    MultiExprArg Args,
2227                                    SourceLocation RParenLoc,
2228                                    Expr *ExecConfig = nullptr) {
2229     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2230                                    Args, RParenLoc, ExecConfig);
2231   }
2232 
2233   /// Build a new member access expression.
2234   ///
2235   /// By default, performs semantic analysis to build the new expression.
2236   /// Subclasses may override this routine to provide different behavior.
2237   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2238                                bool isArrow,
2239                                NestedNameSpecifierLoc QualifierLoc,
2240                                SourceLocation TemplateKWLoc,
2241                                const DeclarationNameInfo &MemberNameInfo,
2242                                ValueDecl *Member,
2243                                NamedDecl *FoundDecl,
2244                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2245                                NamedDecl *FirstQualifierInScope) {
2246     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2247                                                                       isArrow);
2248     if (!Member->getDeclName()) {
2249       // We have a reference to an unnamed field.  This is always the
2250       // base of an anonymous struct/union member access, i.e. the
2251       // field is always of record type.
2252       assert(Member->getType()->isRecordType() &&
2253              "unnamed member not of record type?");
2254 
2255       BaseResult =
2256         getSema().PerformObjectMemberConversion(BaseResult.get(),
2257                                                 QualifierLoc.getNestedNameSpecifier(),
2258                                                 FoundDecl, Member);
2259       if (BaseResult.isInvalid())
2260         return ExprError();
2261       Base = BaseResult.get();
2262 
2263       CXXScopeSpec EmptySS;
2264       return getSema().BuildFieldReferenceExpr(
2265           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2266           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2267     }
2268 
2269     CXXScopeSpec SS;
2270     SS.Adopt(QualifierLoc);
2271 
2272     Base = BaseResult.get();
2273     QualType BaseType = Base->getType();
2274 
2275     if (isArrow && !BaseType->isPointerType())
2276       return ExprError();
2277 
2278     // FIXME: this involves duplicating earlier analysis in a lot of
2279     // cases; we should avoid this when possible.
2280     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2281     R.addDecl(FoundDecl);
2282     R.resolveKind();
2283 
2284     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2285                                               SS, TemplateKWLoc,
2286                                               FirstQualifierInScope,
2287                                               R, ExplicitTemplateArgs,
2288                                               /*S*/nullptr);
2289   }
2290 
2291   /// Build a new binary operator 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 RebuildBinaryOperator(SourceLocation OpLoc,
2296                                          BinaryOperatorKind Opc,
2297                                          Expr *LHS, Expr *RHS) {
2298     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2299   }
2300 
2301   /// Build a new conditional operator expression.
2302   ///
2303   /// By default, performs semantic analysis to build the new expression.
2304   /// Subclasses may override this routine to provide different behavior.
2305   ExprResult RebuildConditionalOperator(Expr *Cond,
2306                                         SourceLocation QuestionLoc,
2307                                         Expr *LHS,
2308                                         SourceLocation ColonLoc,
2309                                         Expr *RHS) {
2310     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2311                                         LHS, RHS);
2312   }
2313 
2314   /// Build a new C-style cast expression.
2315   ///
2316   /// By default, performs semantic analysis to build the new expression.
2317   /// Subclasses may override this routine to provide different behavior.
2318   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2319                                          TypeSourceInfo *TInfo,
2320                                          SourceLocation RParenLoc,
2321                                          Expr *SubExpr) {
2322     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2323                                          SubExpr);
2324   }
2325 
2326   /// Build a new compound literal expression.
2327   ///
2328   /// By default, performs semantic analysis to build the new expression.
2329   /// Subclasses may override this routine to provide different behavior.
2330   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2331                                               TypeSourceInfo *TInfo,
2332                                               SourceLocation RParenLoc,
2333                                               Expr *Init) {
2334     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2335                                               Init);
2336   }
2337 
2338   /// Build a new extended vector element access expression.
2339   ///
2340   /// By default, performs semantic analysis to build the new expression.
2341   /// Subclasses may override this routine to provide different behavior.
2342   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2343                                                SourceLocation OpLoc,
2344                                                SourceLocation AccessorLoc,
2345                                                IdentifierInfo &Accessor) {
2346 
2347     CXXScopeSpec SS;
2348     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2349     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2350                                               OpLoc, /*IsArrow*/ false,
2351                                               SS, SourceLocation(),
2352                                               /*FirstQualifierInScope*/ nullptr,
2353                                               NameInfo,
2354                                               /* TemplateArgs */ nullptr,
2355                                               /*S*/ nullptr);
2356   }
2357 
2358   /// Build a new initializer list expression.
2359   ///
2360   /// By default, performs semantic analysis to build the new expression.
2361   /// Subclasses may override this routine to provide different behavior.
2362   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2363                              MultiExprArg Inits,
2364                              SourceLocation RBraceLoc) {
2365     return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2366   }
2367 
2368   /// Build a new designated initializer expression.
2369   ///
2370   /// By default, performs semantic analysis to build the new expression.
2371   /// Subclasses may override this routine to provide different behavior.
2372   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2373                                              MultiExprArg ArrayExprs,
2374                                              SourceLocation EqualOrColonLoc,
2375                                              bool GNUSyntax,
2376                                              Expr *Init) {
2377     ExprResult Result
2378       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2379                                            Init);
2380     if (Result.isInvalid())
2381       return ExprError();
2382 
2383     return Result;
2384   }
2385 
2386   /// Build a new value-initialized expression.
2387   ///
2388   /// By default, builds the implicit value initialization without performing
2389   /// any semantic analysis. Subclasses may override this routine to provide
2390   /// different behavior.
2391   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2392     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2393   }
2394 
2395   /// Build a new \c va_arg expression.
2396   ///
2397   /// By default, performs semantic analysis to build the new expression.
2398   /// Subclasses may override this routine to provide different behavior.
2399   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2400                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2401                                     SourceLocation RParenLoc) {
2402     return getSema().BuildVAArgExpr(BuiltinLoc,
2403                                     SubExpr, TInfo,
2404                                     RParenLoc);
2405   }
2406 
2407   /// Build a new expression list in parentheses.
2408   ///
2409   /// By default, performs semantic analysis to build the new expression.
2410   /// Subclasses may override this routine to provide different behavior.
2411   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2412                                   MultiExprArg SubExprs,
2413                                   SourceLocation RParenLoc) {
2414     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2415   }
2416 
2417   /// Build a new address-of-label expression.
2418   ///
2419   /// By default, performs semantic analysis, using the name of the label
2420   /// rather than attempting to map the label statement itself.
2421   /// Subclasses may override this routine to provide different behavior.
2422   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2423                                   SourceLocation LabelLoc, LabelDecl *Label) {
2424     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2425   }
2426 
2427   /// Build a new GNU statement expression.
2428   ///
2429   /// By default, performs semantic analysis to build the new expression.
2430   /// Subclasses may override this routine to provide different behavior.
2431   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2432                                    Stmt *SubStmt,
2433                                    SourceLocation RParenLoc) {
2434     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2435   }
2436 
2437   /// Build a new __builtin_choose_expr expression.
2438   ///
2439   /// By default, performs semantic analysis to build the new expression.
2440   /// Subclasses may override this routine to provide different behavior.
2441   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2442                                      Expr *Cond, Expr *LHS, Expr *RHS,
2443                                      SourceLocation RParenLoc) {
2444     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2445                                    Cond, LHS, RHS,
2446                                    RParenLoc);
2447   }
2448 
2449   /// Build a new generic selection expression.
2450   ///
2451   /// By default, performs semantic analysis to build the new expression.
2452   /// Subclasses may override this routine to provide different behavior.
2453   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2454                                          SourceLocation DefaultLoc,
2455                                          SourceLocation RParenLoc,
2456                                          Expr *ControllingExpr,
2457                                          ArrayRef<TypeSourceInfo *> Types,
2458                                          ArrayRef<Expr *> Exprs) {
2459     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2460                                                 ControllingExpr, Types, Exprs);
2461   }
2462 
2463   /// Build a new overloaded operator call expression.
2464   ///
2465   /// By default, performs semantic analysis to build the new expression.
2466   /// The semantic analysis provides the behavior of template instantiation,
2467   /// copying with transformations that turn what looks like an overloaded
2468   /// operator call into a use of a builtin operator, performing
2469   /// argument-dependent lookup, etc. Subclasses may override this routine to
2470   /// provide different behavior.
2471   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2472                                               SourceLocation OpLoc,
2473                                               Expr *Callee,
2474                                               Expr *First,
2475                                               Expr *Second);
2476 
2477   /// Build a new C++ "named" cast expression, such as static_cast or
2478   /// reinterpret_cast.
2479   ///
2480   /// By default, this routine dispatches to one of the more-specific routines
2481   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2482   /// Subclasses may override this routine to provide different behavior.
2483   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2484                                            Stmt::StmtClass Class,
2485                                            SourceLocation LAngleLoc,
2486                                            TypeSourceInfo *TInfo,
2487                                            SourceLocation RAngleLoc,
2488                                            SourceLocation LParenLoc,
2489                                            Expr *SubExpr,
2490                                            SourceLocation RParenLoc) {
2491     switch (Class) {
2492     case Stmt::CXXStaticCastExprClass:
2493       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2494                                                    RAngleLoc, LParenLoc,
2495                                                    SubExpr, RParenLoc);
2496 
2497     case Stmt::CXXDynamicCastExprClass:
2498       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2499                                                     RAngleLoc, LParenLoc,
2500                                                     SubExpr, RParenLoc);
2501 
2502     case Stmt::CXXReinterpretCastExprClass:
2503       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2504                                                         RAngleLoc, LParenLoc,
2505                                                         SubExpr,
2506                                                         RParenLoc);
2507 
2508     case Stmt::CXXConstCastExprClass:
2509       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2510                                                    RAngleLoc, LParenLoc,
2511                                                    SubExpr, RParenLoc);
2512 
2513     default:
2514       llvm_unreachable("Invalid C++ named cast");
2515     }
2516   }
2517 
2518   /// Build a new C++ static_cast expression.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2523                                             SourceLocation LAngleLoc,
2524                                             TypeSourceInfo *TInfo,
2525                                             SourceLocation RAngleLoc,
2526                                             SourceLocation LParenLoc,
2527                                             Expr *SubExpr,
2528                                             SourceLocation RParenLoc) {
2529     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2530                                        TInfo, SubExpr,
2531                                        SourceRange(LAngleLoc, RAngleLoc),
2532                                        SourceRange(LParenLoc, RParenLoc));
2533   }
2534 
2535   /// Build a new C++ dynamic_cast expression.
2536   ///
2537   /// By default, performs semantic analysis to build the new expression.
2538   /// Subclasses may override this routine to provide different behavior.
2539   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2540                                              SourceLocation LAngleLoc,
2541                                              TypeSourceInfo *TInfo,
2542                                              SourceLocation RAngleLoc,
2543                                              SourceLocation LParenLoc,
2544                                              Expr *SubExpr,
2545                                              SourceLocation RParenLoc) {
2546     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2547                                        TInfo, SubExpr,
2548                                        SourceRange(LAngleLoc, RAngleLoc),
2549                                        SourceRange(LParenLoc, RParenLoc));
2550   }
2551 
2552   /// Build a new C++ reinterpret_cast expression.
2553   ///
2554   /// By default, performs semantic analysis to build the new expression.
2555   /// Subclasses may override this routine to provide different behavior.
2556   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2557                                                  SourceLocation LAngleLoc,
2558                                                  TypeSourceInfo *TInfo,
2559                                                  SourceLocation RAngleLoc,
2560                                                  SourceLocation LParenLoc,
2561                                                  Expr *SubExpr,
2562                                                  SourceLocation RParenLoc) {
2563     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2564                                        TInfo, SubExpr,
2565                                        SourceRange(LAngleLoc, RAngleLoc),
2566                                        SourceRange(LParenLoc, RParenLoc));
2567   }
2568 
2569   /// Build a new C++ const_cast expression.
2570   ///
2571   /// By default, performs semantic analysis to build the new expression.
2572   /// Subclasses may override this routine to provide different behavior.
2573   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2574                                            SourceLocation LAngleLoc,
2575                                            TypeSourceInfo *TInfo,
2576                                            SourceLocation RAngleLoc,
2577                                            SourceLocation LParenLoc,
2578                                            Expr *SubExpr,
2579                                            SourceLocation RParenLoc) {
2580     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2581                                        TInfo, SubExpr,
2582                                        SourceRange(LAngleLoc, RAngleLoc),
2583                                        SourceRange(LParenLoc, RParenLoc));
2584   }
2585 
2586   /// Build a new C++ functional-style cast expression.
2587   ///
2588   /// By default, performs semantic analysis to build the new expression.
2589   /// Subclasses may override this routine to provide different behavior.
2590   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2591                                           SourceLocation LParenLoc,
2592                                           Expr *Sub,
2593                                           SourceLocation RParenLoc,
2594                                           bool ListInitialization) {
2595     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2596                                                MultiExprArg(&Sub, 1), RParenLoc,
2597                                                ListInitialization);
2598   }
2599 
2600   /// Build a new C++ typeid(type) expression.
2601   ///
2602   /// By default, performs semantic analysis to build the new expression.
2603   /// Subclasses may override this routine to provide different behavior.
2604   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2605                                         SourceLocation TypeidLoc,
2606                                         TypeSourceInfo *Operand,
2607                                         SourceLocation RParenLoc) {
2608     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2609                                     RParenLoc);
2610   }
2611 
2612 
2613   /// Build a new C++ typeid(expr) expression.
2614   ///
2615   /// By default, performs semantic analysis to build the new expression.
2616   /// Subclasses may override this routine to provide different behavior.
2617   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2618                                         SourceLocation TypeidLoc,
2619                                         Expr *Operand,
2620                                         SourceLocation RParenLoc) {
2621     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2622                                     RParenLoc);
2623   }
2624 
2625   /// Build a new C++ __uuidof(type) expression.
2626   ///
2627   /// By default, performs semantic analysis to build the new expression.
2628   /// Subclasses may override this routine to provide different behavior.
2629   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2630                                         SourceLocation TypeidLoc,
2631                                         TypeSourceInfo *Operand,
2632                                         SourceLocation RParenLoc) {
2633     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2634                                     RParenLoc);
2635   }
2636 
2637   /// Build a new C++ __uuidof(expr) expression.
2638   ///
2639   /// By default, performs semantic analysis to build the new expression.
2640   /// Subclasses may override this routine to provide different behavior.
2641   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2642                                         SourceLocation TypeidLoc,
2643                                         Expr *Operand,
2644                                         SourceLocation RParenLoc) {
2645     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2646                                     RParenLoc);
2647   }
2648 
2649   /// Build a new C++ "this" expression.
2650   ///
2651   /// By default, builds a new "this" expression without performing any
2652   /// semantic analysis. Subclasses may override this routine to provide
2653   /// different behavior.
2654   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2655                                 QualType ThisType,
2656                                 bool isImplicit) {
2657     getSema().CheckCXXThisCapture(ThisLoc);
2658     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2659   }
2660 
2661   /// Build a new C++ throw expression.
2662   ///
2663   /// By default, performs semantic analysis to build the new expression.
2664   /// Subclasses may override this routine to provide different behavior.
2665   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2666                                  bool IsThrownVariableInScope) {
2667     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2668   }
2669 
2670   /// Build a new C++ default-argument expression.
2671   ///
2672   /// By default, builds a new default-argument expression, which does not
2673   /// require any semantic analysis. Subclasses may override this routine to
2674   /// provide different behavior.
2675   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2676                                             ParmVarDecl *Param) {
2677     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2678   }
2679 
2680   /// Build a new C++11 default-initialization expression.
2681   ///
2682   /// By default, builds a new default field initialization expression, which
2683   /// does not require any semantic analysis. Subclasses may override this
2684   /// routine to provide different behavior.
2685   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2686                                        FieldDecl *Field) {
2687     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2688   }
2689 
2690   /// Build a new C++ zero-initialization expression.
2691   ///
2692   /// By default, performs semantic analysis to build the new expression.
2693   /// Subclasses may override this routine to provide different behavior.
2694   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2695                                            SourceLocation LParenLoc,
2696                                            SourceLocation RParenLoc) {
2697     return getSema().BuildCXXTypeConstructExpr(
2698         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2699   }
2700 
2701   /// Build a new C++ "new" expression.
2702   ///
2703   /// By default, performs semantic analysis to build the new expression.
2704   /// Subclasses may override this routine to provide different behavior.
2705   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2706                                bool UseGlobal,
2707                                SourceLocation PlacementLParen,
2708                                MultiExprArg PlacementArgs,
2709                                SourceLocation PlacementRParen,
2710                                SourceRange TypeIdParens,
2711                                QualType AllocatedType,
2712                                TypeSourceInfo *AllocatedTypeInfo,
2713                                Expr *ArraySize,
2714                                SourceRange DirectInitRange,
2715                                Expr *Initializer) {
2716     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2717                                  PlacementLParen,
2718                                  PlacementArgs,
2719                                  PlacementRParen,
2720                                  TypeIdParens,
2721                                  AllocatedType,
2722                                  AllocatedTypeInfo,
2723                                  ArraySize,
2724                                  DirectInitRange,
2725                                  Initializer);
2726   }
2727 
2728   /// Build a new C++ "delete" expression.
2729   ///
2730   /// By default, performs semantic analysis to build the new expression.
2731   /// Subclasses may override this routine to provide different behavior.
2732   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2733                                         bool IsGlobalDelete,
2734                                         bool IsArrayForm,
2735                                         Expr *Operand) {
2736     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2737                                     Operand);
2738   }
2739 
2740   /// Build a new type trait expression.
2741   ///
2742   /// By default, performs semantic analysis to build the new expression.
2743   /// Subclasses may override this routine to provide different behavior.
2744   ExprResult RebuildTypeTrait(TypeTrait Trait,
2745                               SourceLocation StartLoc,
2746                               ArrayRef<TypeSourceInfo *> Args,
2747                               SourceLocation RParenLoc) {
2748     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2749   }
2750 
2751   /// Build a new array type trait expression.
2752   ///
2753   /// By default, performs semantic analysis to build the new expression.
2754   /// Subclasses may override this routine to provide different behavior.
2755   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2756                                    SourceLocation StartLoc,
2757                                    TypeSourceInfo *TSInfo,
2758                                    Expr *DimExpr,
2759                                    SourceLocation RParenLoc) {
2760     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2761   }
2762 
2763   /// Build a new expression trait expression.
2764   ///
2765   /// By default, performs semantic analysis to build the new expression.
2766   /// Subclasses may override this routine to provide different behavior.
2767   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2768                                    SourceLocation StartLoc,
2769                                    Expr *Queried,
2770                                    SourceLocation RParenLoc) {
2771     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2772   }
2773 
2774   /// Build a new (previously unresolved) declaration reference
2775   /// expression.
2776   ///
2777   /// By default, performs semantic analysis to build the new expression.
2778   /// Subclasses may override this routine to provide different behavior.
2779   ExprResult RebuildDependentScopeDeclRefExpr(
2780                                           NestedNameSpecifierLoc QualifierLoc,
2781                                           SourceLocation TemplateKWLoc,
2782                                        const DeclarationNameInfo &NameInfo,
2783                               const TemplateArgumentListInfo *TemplateArgs,
2784                                           bool IsAddressOfOperand,
2785                                           TypeSourceInfo **RecoveryTSI) {
2786     CXXScopeSpec SS;
2787     SS.Adopt(QualifierLoc);
2788 
2789     if (TemplateArgs || TemplateKWLoc.isValid())
2790       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2791                                                     TemplateArgs);
2792 
2793     return getSema().BuildQualifiedDeclarationNameExpr(
2794         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2795   }
2796 
2797   /// Build a new template-id expression.
2798   ///
2799   /// By default, performs semantic analysis to build the new expression.
2800   /// Subclasses may override this routine to provide different behavior.
2801   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2802                                    SourceLocation TemplateKWLoc,
2803                                    LookupResult &R,
2804                                    bool RequiresADL,
2805                               const TemplateArgumentListInfo *TemplateArgs) {
2806     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2807                                          TemplateArgs);
2808   }
2809 
2810   /// Build a new object-construction expression.
2811   ///
2812   /// By default, performs semantic analysis to build the new expression.
2813   /// Subclasses may override this routine to provide different behavior.
2814   ExprResult RebuildCXXConstructExpr(QualType T,
2815                                      SourceLocation Loc,
2816                                      CXXConstructorDecl *Constructor,
2817                                      bool IsElidable,
2818                                      MultiExprArg Args,
2819                                      bool HadMultipleCandidates,
2820                                      bool ListInitialization,
2821                                      bool StdInitListInitialization,
2822                                      bool RequiresZeroInit,
2823                              CXXConstructExpr::ConstructionKind ConstructKind,
2824                                      SourceRange ParenRange) {
2825     SmallVector<Expr*, 8> ConvertedArgs;
2826     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2827                                           ConvertedArgs))
2828       return ExprError();
2829 
2830     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2831                                            IsElidable,
2832                                            ConvertedArgs,
2833                                            HadMultipleCandidates,
2834                                            ListInitialization,
2835                                            StdInitListInitialization,
2836                                            RequiresZeroInit, ConstructKind,
2837                                            ParenRange);
2838   }
2839 
2840   /// Build a new implicit construction via inherited constructor
2841   /// expression.
2842   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2843                                              CXXConstructorDecl *Constructor,
2844                                              bool ConstructsVBase,
2845                                              bool InheritedFromVBase) {
2846     return new (getSema().Context) CXXInheritedCtorInitExpr(
2847         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2848   }
2849 
2850   /// Build a new object-construction expression.
2851   ///
2852   /// By default, performs semantic analysis to build the new expression.
2853   /// Subclasses may override this routine to provide different behavior.
2854   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2855                                            SourceLocation LParenOrBraceLoc,
2856                                            MultiExprArg Args,
2857                                            SourceLocation RParenOrBraceLoc,
2858                                            bool ListInitialization) {
2859     return getSema().BuildCXXTypeConstructExpr(
2860         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2861   }
2862 
2863   /// Build a new object-construction expression.
2864   ///
2865   /// By default, performs semantic analysis to build the new expression.
2866   /// Subclasses may override this routine to provide different behavior.
2867   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2868                                                SourceLocation LParenLoc,
2869                                                MultiExprArg Args,
2870                                                SourceLocation RParenLoc,
2871                                                bool ListInitialization) {
2872     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2873                                                RParenLoc, ListInitialization);
2874   }
2875 
2876   /// Build a new member reference expression.
2877   ///
2878   /// By default, performs semantic analysis to build the new expression.
2879   /// Subclasses may override this routine to provide different behavior.
2880   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2881                                                 QualType BaseType,
2882                                                 bool IsArrow,
2883                                                 SourceLocation OperatorLoc,
2884                                           NestedNameSpecifierLoc QualifierLoc,
2885                                                 SourceLocation TemplateKWLoc,
2886                                             NamedDecl *FirstQualifierInScope,
2887                                    const DeclarationNameInfo &MemberNameInfo,
2888                               const TemplateArgumentListInfo *TemplateArgs) {
2889     CXXScopeSpec SS;
2890     SS.Adopt(QualifierLoc);
2891 
2892     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2893                                             OperatorLoc, IsArrow,
2894                                             SS, TemplateKWLoc,
2895                                             FirstQualifierInScope,
2896                                             MemberNameInfo,
2897                                             TemplateArgs, /*S*/nullptr);
2898   }
2899 
2900   /// Build a new member reference expression.
2901   ///
2902   /// By default, performs semantic analysis to build the new expression.
2903   /// Subclasses may override this routine to provide different behavior.
2904   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2905                                          SourceLocation OperatorLoc,
2906                                          bool IsArrow,
2907                                          NestedNameSpecifierLoc QualifierLoc,
2908                                          SourceLocation TemplateKWLoc,
2909                                          NamedDecl *FirstQualifierInScope,
2910                                          LookupResult &R,
2911                                 const TemplateArgumentListInfo *TemplateArgs) {
2912     CXXScopeSpec SS;
2913     SS.Adopt(QualifierLoc);
2914 
2915     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2916                                             OperatorLoc, IsArrow,
2917                                             SS, TemplateKWLoc,
2918                                             FirstQualifierInScope,
2919                                             R, TemplateArgs, /*S*/nullptr);
2920   }
2921 
2922   /// Build a new noexcept expression.
2923   ///
2924   /// By default, performs semantic analysis to build the new expression.
2925   /// Subclasses may override this routine to provide different behavior.
2926   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2927     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2928   }
2929 
2930   /// Build a new expression to compute the length of a parameter pack.
2931   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2932                                    NamedDecl *Pack,
2933                                    SourceLocation PackLoc,
2934                                    SourceLocation RParenLoc,
2935                                    Optional<unsigned> Length,
2936                                    ArrayRef<TemplateArgument> PartialArgs) {
2937     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2938                                   RParenLoc, Length, PartialArgs);
2939   }
2940 
2941   /// Build a new Objective-C boxed expression.
2942   ///
2943   /// By default, performs semantic analysis to build the new expression.
2944   /// Subclasses may override this routine to provide different behavior.
2945   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2946     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2947   }
2948 
2949   /// Build a new Objective-C array literal.
2950   ///
2951   /// By default, performs semantic analysis to build the new expression.
2952   /// Subclasses may override this routine to provide different behavior.
2953   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2954                                      Expr **Elements, unsigned NumElements) {
2955     return getSema().BuildObjCArrayLiteral(Range,
2956                                            MultiExprArg(Elements, NumElements));
2957   }
2958 
2959   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2960                                          Expr *Base, Expr *Key,
2961                                          ObjCMethodDecl *getterMethod,
2962                                          ObjCMethodDecl *setterMethod) {
2963     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2964                                                    getterMethod, setterMethod);
2965   }
2966 
2967   /// Build a new Objective-C dictionary literal.
2968   ///
2969   /// By default, performs semantic analysis to build the new expression.
2970   /// Subclasses may override this routine to provide different behavior.
2971   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2972                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2973     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2974   }
2975 
2976   /// Build a new Objective-C \@encode expression.
2977   ///
2978   /// By default, performs semantic analysis to build the new expression.
2979   /// Subclasses may override this routine to provide different behavior.
2980   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2981                                          TypeSourceInfo *EncodeTypeInfo,
2982                                          SourceLocation RParenLoc) {
2983     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2984   }
2985 
2986   /// Build a new Objective-C class message.
2987   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2988                                           Selector Sel,
2989                                           ArrayRef<SourceLocation> SelectorLocs,
2990                                           ObjCMethodDecl *Method,
2991                                           SourceLocation LBracLoc,
2992                                           MultiExprArg Args,
2993                                           SourceLocation RBracLoc) {
2994     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2995                                      ReceiverTypeInfo->getType(),
2996                                      /*SuperLoc=*/SourceLocation(),
2997                                      Sel, Method, LBracLoc, SelectorLocs,
2998                                      RBracLoc, Args);
2999   }
3000 
3001   /// Build a new Objective-C instance message.
3002   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3003                                           Selector Sel,
3004                                           ArrayRef<SourceLocation> SelectorLocs,
3005                                           ObjCMethodDecl *Method,
3006                                           SourceLocation LBracLoc,
3007                                           MultiExprArg Args,
3008                                           SourceLocation RBracLoc) {
3009     return SemaRef.BuildInstanceMessage(Receiver,
3010                                         Receiver->getType(),
3011                                         /*SuperLoc=*/SourceLocation(),
3012                                         Sel, Method, LBracLoc, SelectorLocs,
3013                                         RBracLoc, Args);
3014   }
3015 
3016   /// Build a new Objective-C instance/class message to 'super'.
3017   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3018                                     Selector Sel,
3019                                     ArrayRef<SourceLocation> SelectorLocs,
3020                                     QualType SuperType,
3021                                     ObjCMethodDecl *Method,
3022                                     SourceLocation LBracLoc,
3023                                     MultiExprArg Args,
3024                                     SourceLocation RBracLoc) {
3025     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3026                                           SuperType,
3027                                           SuperLoc,
3028                                           Sel, Method, LBracLoc, SelectorLocs,
3029                                           RBracLoc, Args)
3030                                       : SemaRef.BuildClassMessage(nullptr,
3031                                           SuperType,
3032                                           SuperLoc,
3033                                           Sel, Method, LBracLoc, SelectorLocs,
3034                                           RBracLoc, Args);
3035 
3036 
3037   }
3038 
3039   /// Build a new Objective-C ivar reference expression.
3040   ///
3041   /// By default, performs semantic analysis to build the new expression.
3042   /// Subclasses may override this routine to provide different behavior.
3043   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3044                                           SourceLocation IvarLoc,
3045                                           bool IsArrow, bool IsFreeIvar) {
3046     CXXScopeSpec SS;
3047     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3048     ExprResult Result = getSema().BuildMemberReferenceExpr(
3049         BaseArg, BaseArg->getType(),
3050         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3051         /*FirstQualifierInScope=*/nullptr, NameInfo,
3052         /*TemplateArgs=*/nullptr,
3053         /*S=*/nullptr);
3054     if (IsFreeIvar && Result.isUsable())
3055       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3056     return Result;
3057   }
3058 
3059   /// Build a new Objective-C property reference expression.
3060   ///
3061   /// By default, performs semantic analysis to build the new expression.
3062   /// Subclasses may override this routine to provide different behavior.
3063   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3064                                         ObjCPropertyDecl *Property,
3065                                         SourceLocation PropertyLoc) {
3066     CXXScopeSpec SS;
3067     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3068     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3069                                               /*FIXME:*/PropertyLoc,
3070                                               /*IsArrow=*/false,
3071                                               SS, SourceLocation(),
3072                                               /*FirstQualifierInScope=*/nullptr,
3073                                               NameInfo,
3074                                               /*TemplateArgs=*/nullptr,
3075                                               /*S=*/nullptr);
3076   }
3077 
3078   /// Build a new Objective-C property reference expression.
3079   ///
3080   /// By default, performs semantic analysis to build the new expression.
3081   /// Subclasses may override this routine to provide different behavior.
3082   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3083                                         ObjCMethodDecl *Getter,
3084                                         ObjCMethodDecl *Setter,
3085                                         SourceLocation PropertyLoc) {
3086     // Since these expressions can only be value-dependent, we do not
3087     // need to perform semantic analysis again.
3088     return Owned(
3089       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3090                                                   VK_LValue, OK_ObjCProperty,
3091                                                   PropertyLoc, Base));
3092   }
3093 
3094   /// Build a new Objective-C "isa" expression.
3095   ///
3096   /// By default, performs semantic analysis to build the new expression.
3097   /// Subclasses may override this routine to provide different behavior.
3098   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3099                                 SourceLocation OpLoc, bool IsArrow) {
3100     CXXScopeSpec SS;
3101     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3102     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3103                                               OpLoc, IsArrow,
3104                                               SS, SourceLocation(),
3105                                               /*FirstQualifierInScope=*/nullptr,
3106                                               NameInfo,
3107                                               /*TemplateArgs=*/nullptr,
3108                                               /*S=*/nullptr);
3109   }
3110 
3111   /// Build a new shuffle vector expression.
3112   ///
3113   /// By default, performs semantic analysis to build the new expression.
3114   /// Subclasses may override this routine to provide different behavior.
3115   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3116                                       MultiExprArg SubExprs,
3117                                       SourceLocation RParenLoc) {
3118     // Find the declaration for __builtin_shufflevector
3119     const IdentifierInfo &Name
3120       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3121     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3122     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3123     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3124 
3125     // Build a reference to the __builtin_shufflevector builtin
3126     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3127     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3128                                                   SemaRef.Context.BuiltinFnTy,
3129                                                   VK_RValue, BuiltinLoc);
3130     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3131     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3132                                        CK_BuiltinFnToFnPtr).get();
3133 
3134     // Build the CallExpr
3135     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3136         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3137         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3138 
3139     // Type-check the __builtin_shufflevector expression.
3140     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3141   }
3142 
3143   /// Build a new convert vector expression.
3144   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3145                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3146                                       SourceLocation RParenLoc) {
3147     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3148                                          BuiltinLoc, RParenLoc);
3149   }
3150 
3151   /// Build a new template argument pack expansion.
3152   ///
3153   /// By default, performs semantic analysis to build a new pack expansion
3154   /// for a template argument. Subclasses may override this routine to provide
3155   /// different behavior.
3156   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3157                                            SourceLocation EllipsisLoc,
3158                                            Optional<unsigned> NumExpansions) {
3159     switch (Pattern.getArgument().getKind()) {
3160     case TemplateArgument::Expression: {
3161       ExprResult Result
3162         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3163                                        EllipsisLoc, NumExpansions);
3164       if (Result.isInvalid())
3165         return TemplateArgumentLoc();
3166 
3167       return TemplateArgumentLoc(Result.get(), Result.get());
3168     }
3169 
3170     case TemplateArgument::Template:
3171       return TemplateArgumentLoc(TemplateArgument(
3172                                           Pattern.getArgument().getAsTemplate(),
3173                                                   NumExpansions),
3174                                  Pattern.getTemplateQualifierLoc(),
3175                                  Pattern.getTemplateNameLoc(),
3176                                  EllipsisLoc);
3177 
3178     case TemplateArgument::Null:
3179     case TemplateArgument::Integral:
3180     case TemplateArgument::Declaration:
3181     case TemplateArgument::Pack:
3182     case TemplateArgument::TemplateExpansion:
3183     case TemplateArgument::NullPtr:
3184       llvm_unreachable("Pack expansion pattern has no parameter packs");
3185 
3186     case TemplateArgument::Type:
3187       if (TypeSourceInfo *Expansion
3188             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3189                                            EllipsisLoc,
3190                                            NumExpansions))
3191         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3192                                    Expansion);
3193       break;
3194     }
3195 
3196     return TemplateArgumentLoc();
3197   }
3198 
3199   /// Build a new expression pack expansion.
3200   ///
3201   /// By default, performs semantic analysis to build a new pack expansion
3202   /// for an expression. Subclasses may override this routine to provide
3203   /// different behavior.
3204   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3205                                   Optional<unsigned> NumExpansions) {
3206     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3207   }
3208 
3209   /// Build a new C++1z fold-expression.
3210   ///
3211   /// By default, performs semantic analysis in order to build a new fold
3212   /// expression.
3213   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3214                                 BinaryOperatorKind Operator,
3215                                 SourceLocation EllipsisLoc, Expr *RHS,
3216                                 SourceLocation RParenLoc) {
3217     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3218                                       RHS, RParenLoc);
3219   }
3220 
3221   /// Build an empty C++1z fold-expression with the given operator.
3222   ///
3223   /// By default, produces the fallback value for the fold-expression, or
3224   /// produce an error if there is no fallback value.
3225   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3226                                      BinaryOperatorKind Operator) {
3227     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3228   }
3229 
3230   /// Build a new atomic operation expression.
3231   ///
3232   /// By default, performs semantic analysis to build the new expression.
3233   /// Subclasses may override this routine to provide different behavior.
3234   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3235                                MultiExprArg SubExprs,
3236                                QualType RetTy,
3237                                AtomicExpr::AtomicOp Op,
3238                                SourceLocation RParenLoc) {
3239     // Just create the expression; there is not any interesting semantic
3240     // analysis here because we can't actually build an AtomicExpr until
3241     // we are sure it is semantically sound.
3242     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3243                                             RParenLoc);
3244   }
3245 
3246 private:
3247   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3248                                      QualType ObjectType,
3249                                      NamedDecl *FirstQualifierInScope,
3250                                      CXXScopeSpec &SS);
3251 
3252   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3253                                              QualType ObjectType,
3254                                              NamedDecl *FirstQualifierInScope,
3255                                              CXXScopeSpec &SS);
3256 
3257   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3258                                             NamedDecl *FirstQualifierInScope,
3259                                             CXXScopeSpec &SS);
3260 
3261   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3262                                       DependentNameTypeLoc TL,
3263                                       bool DeducibleTSTContext);
3264 };
3265 
3266 template<typename Derived>
3267 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3268   if (!S)
3269     return S;
3270 
3271   switch (S->getStmtClass()) {
3272   case Stmt::NoStmtClass: break;
3273 
3274   // Transform individual statement nodes
3275 #define STMT(Node, Parent)                                              \
3276   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3277 #define ABSTRACT_STMT(Node)
3278 #define EXPR(Node, Parent)
3279 #include "clang/AST/StmtNodes.inc"
3280 
3281   // Transform expressions by calling TransformExpr.
3282 #define STMT(Node, Parent)
3283 #define ABSTRACT_STMT(Stmt)
3284 #define EXPR(Node, Parent) case Stmt::Node##Class:
3285 #include "clang/AST/StmtNodes.inc"
3286     {
3287       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3288       if (E.isInvalid())
3289         return StmtError();
3290 
3291       return getSema().ActOnExprStmt(E);
3292     }
3293   }
3294 
3295   return S;
3296 }
3297 
3298 template<typename Derived>
3299 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3300   if (!S)
3301     return S;
3302 
3303   switch (S->getClauseKind()) {
3304   default: break;
3305   // Transform individual clause nodes
3306 #define OPENMP_CLAUSE(Name, Class)                                             \
3307   case OMPC_ ## Name :                                                         \
3308     return getDerived().Transform ## Class(cast<Class>(S));
3309 #include "clang/Basic/OpenMPKinds.def"
3310   }
3311 
3312   return S;
3313 }
3314 
3315 
3316 template<typename Derived>
3317 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3318   if (!E)
3319     return E;
3320 
3321   switch (E->getStmtClass()) {
3322     case Stmt::NoStmtClass: break;
3323 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3324 #define ABSTRACT_STMT(Stmt)
3325 #define EXPR(Node, Parent)                                              \
3326     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3327 #include "clang/AST/StmtNodes.inc"
3328   }
3329 
3330   return E;
3331 }
3332 
3333 template<typename Derived>
3334 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3335                                                         bool NotCopyInit) {
3336   // Initializers are instantiated like expressions, except that various outer
3337   // layers are stripped.
3338   if (!Init)
3339     return Init;
3340 
3341   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3342     Init = ExprTemp->getSubExpr();
3343 
3344   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3345     Init = AIL->getCommonExpr();
3346 
3347   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3348     Init = MTE->GetTemporaryExpr();
3349 
3350   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3351     Init = Binder->getSubExpr();
3352 
3353   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3354     Init = ICE->getSubExprAsWritten();
3355 
3356   if (CXXStdInitializerListExpr *ILE =
3357           dyn_cast<CXXStdInitializerListExpr>(Init))
3358     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3359 
3360   // If this is copy-initialization, we only need to reconstruct
3361   // InitListExprs. Other forms of copy-initialization will be a no-op if
3362   // the initializer is already the right type.
3363   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3364   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3365     return getDerived().TransformExpr(Init);
3366 
3367   // Revert value-initialization back to empty parens.
3368   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3369     SourceRange Parens = VIE->getSourceRange();
3370     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3371                                              Parens.getEnd());
3372   }
3373 
3374   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3375   if (isa<ImplicitValueInitExpr>(Init))
3376     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3377                                              SourceLocation());
3378 
3379   // Revert initialization by constructor back to a parenthesized or braced list
3380   // of expressions. Any other form of initializer can just be reused directly.
3381   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3382     return getDerived().TransformExpr(Init);
3383 
3384   // If the initialization implicitly converted an initializer list to a
3385   // std::initializer_list object, unwrap the std::initializer_list too.
3386   if (Construct && Construct->isStdInitListInitialization())
3387     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3388 
3389   SmallVector<Expr*, 8> NewArgs;
3390   bool ArgChanged = false;
3391   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3392                                   /*IsCall*/true, NewArgs, &ArgChanged))
3393     return ExprError();
3394 
3395   // If this was list initialization, revert to syntactic list form.
3396   if (Construct->isListInitialization())
3397     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3398                                         Construct->getEndLoc());
3399 
3400   // Build a ParenListExpr to represent anything else.
3401   SourceRange Parens = Construct->getParenOrBraceRange();
3402   if (Parens.isInvalid()) {
3403     // This was a variable declaration's initialization for which no initializer
3404     // was specified.
3405     assert(NewArgs.empty() &&
3406            "no parens or braces but have direct init with arguments?");
3407     return ExprEmpty();
3408   }
3409   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3410                                            Parens.getEnd());
3411 }
3412 
3413 template<typename Derived>
3414 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3415                                             unsigned NumInputs,
3416                                             bool IsCall,
3417                                       SmallVectorImpl<Expr *> &Outputs,
3418                                             bool *ArgChanged) {
3419   for (unsigned I = 0; I != NumInputs; ++I) {
3420     // If requested, drop call arguments that need to be dropped.
3421     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3422       if (ArgChanged)
3423         *ArgChanged = true;
3424 
3425       break;
3426     }
3427 
3428     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3429       Expr *Pattern = Expansion->getPattern();
3430 
3431       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3432       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3433       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3434 
3435       // Determine whether the set of unexpanded parameter packs can and should
3436       // be expanded.
3437       bool Expand = true;
3438       bool RetainExpansion = false;
3439       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3440       Optional<unsigned> NumExpansions = OrigNumExpansions;
3441       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3442                                                Pattern->getSourceRange(),
3443                                                Unexpanded,
3444                                                Expand, RetainExpansion,
3445                                                NumExpansions))
3446         return true;
3447 
3448       if (!Expand) {
3449         // The transform has determined that we should perform a simple
3450         // transformation on the pack expansion, producing another pack
3451         // expansion.
3452         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3453         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3454         if (OutPattern.isInvalid())
3455           return true;
3456 
3457         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3458                                                 Expansion->getEllipsisLoc(),
3459                                                            NumExpansions);
3460         if (Out.isInvalid())
3461           return true;
3462 
3463         if (ArgChanged)
3464           *ArgChanged = true;
3465         Outputs.push_back(Out.get());
3466         continue;
3467       }
3468 
3469       // Record right away that the argument was changed.  This needs
3470       // to happen even if the array expands to nothing.
3471       if (ArgChanged) *ArgChanged = true;
3472 
3473       // The transform has determined that we should perform an elementwise
3474       // expansion of the pattern. Do so.
3475       for (unsigned I = 0; I != *NumExpansions; ++I) {
3476         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3477         ExprResult Out = getDerived().TransformExpr(Pattern);
3478         if (Out.isInvalid())
3479           return true;
3480 
3481         if (Out.get()->containsUnexpandedParameterPack()) {
3482           Out = getDerived().RebuildPackExpansion(
3483               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3484           if (Out.isInvalid())
3485             return true;
3486         }
3487 
3488         Outputs.push_back(Out.get());
3489       }
3490 
3491       // If we're supposed to retain a pack expansion, do so by temporarily
3492       // forgetting the partially-substituted parameter pack.
3493       if (RetainExpansion) {
3494         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3495 
3496         ExprResult Out = getDerived().TransformExpr(Pattern);
3497         if (Out.isInvalid())
3498           return true;
3499 
3500         Out = getDerived().RebuildPackExpansion(
3501             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3502         if (Out.isInvalid())
3503           return true;
3504 
3505         Outputs.push_back(Out.get());
3506       }
3507 
3508       continue;
3509     }
3510 
3511     ExprResult Result =
3512       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3513              : getDerived().TransformExpr(Inputs[I]);
3514     if (Result.isInvalid())
3515       return true;
3516 
3517     if (Result.get() != Inputs[I] && ArgChanged)
3518       *ArgChanged = true;
3519 
3520     Outputs.push_back(Result.get());
3521   }
3522 
3523   return false;
3524 }
3525 
3526 template <typename Derived>
3527 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3528     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3529   if (Var) {
3530     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3531         getDerived().TransformDefinition(Var->getLocation(), Var));
3532 
3533     if (!ConditionVar)
3534       return Sema::ConditionError();
3535 
3536     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3537   }
3538 
3539   if (Expr) {
3540     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3541 
3542     if (CondExpr.isInvalid())
3543       return Sema::ConditionError();
3544 
3545     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3546   }
3547 
3548   return Sema::ConditionResult();
3549 }
3550 
3551 template<typename Derived>
3552 NestedNameSpecifierLoc
3553 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3554                                                     NestedNameSpecifierLoc NNS,
3555                                                      QualType ObjectType,
3556                                              NamedDecl *FirstQualifierInScope) {
3557   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3558   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3559        Qualifier = Qualifier.getPrefix())
3560     Qualifiers.push_back(Qualifier);
3561 
3562   CXXScopeSpec SS;
3563   while (!Qualifiers.empty()) {
3564     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3565     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3566 
3567     switch (QNNS->getKind()) {
3568     case NestedNameSpecifier::Identifier: {
3569       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3570                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3571       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3572                                               SS, FirstQualifierInScope, false))
3573         return NestedNameSpecifierLoc();
3574     }
3575       break;
3576 
3577     case NestedNameSpecifier::Namespace: {
3578       NamespaceDecl *NS
3579         = cast_or_null<NamespaceDecl>(
3580                                     getDerived().TransformDecl(
3581                                                           Q.getLocalBeginLoc(),
3582                                                        QNNS->getAsNamespace()));
3583       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3584       break;
3585     }
3586 
3587     case NestedNameSpecifier::NamespaceAlias: {
3588       NamespaceAliasDecl *Alias
3589         = cast_or_null<NamespaceAliasDecl>(
3590                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3591                                                  QNNS->getAsNamespaceAlias()));
3592       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3593                 Q.getLocalEndLoc());
3594       break;
3595     }
3596 
3597     case NestedNameSpecifier::Global:
3598       // There is no meaningful transformation that one could perform on the
3599       // global scope.
3600       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3601       break;
3602 
3603     case NestedNameSpecifier::Super: {
3604       CXXRecordDecl *RD =
3605           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3606               SourceLocation(), QNNS->getAsRecordDecl()));
3607       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3608       break;
3609     }
3610 
3611     case NestedNameSpecifier::TypeSpecWithTemplate:
3612     case NestedNameSpecifier::TypeSpec: {
3613       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3614                                               FirstQualifierInScope, SS);
3615 
3616       if (!TL)
3617         return NestedNameSpecifierLoc();
3618 
3619       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3620           (SemaRef.getLangOpts().CPlusPlus11 &&
3621            TL.getType()->isEnumeralType())) {
3622         assert(!TL.getType().hasLocalQualifiers() &&
3623                "Can't get cv-qualifiers here");
3624         if (TL.getType()->isEnumeralType())
3625           SemaRef.Diag(TL.getBeginLoc(),
3626                        diag::warn_cxx98_compat_enum_nested_name_spec);
3627         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3628                   Q.getLocalEndLoc());
3629         break;
3630       }
3631       // If the nested-name-specifier is an invalid type def, don't emit an
3632       // error because a previous error should have already been emitted.
3633       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3634       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3635         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3636           << TL.getType() << SS.getRange();
3637       }
3638       return NestedNameSpecifierLoc();
3639     }
3640     }
3641 
3642     // The qualifier-in-scope and object type only apply to the leftmost entity.
3643     FirstQualifierInScope = nullptr;
3644     ObjectType = QualType();
3645   }
3646 
3647   // Don't rebuild the nested-name-specifier if we don't have to.
3648   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3649       !getDerived().AlwaysRebuild())
3650     return NNS;
3651 
3652   // If we can re-use the source-location data from the original
3653   // nested-name-specifier, do so.
3654   if (SS.location_size() == NNS.getDataLength() &&
3655       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3656     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3657 
3658   // Allocate new nested-name-specifier location information.
3659   return SS.getWithLocInContext(SemaRef.Context);
3660 }
3661 
3662 template<typename Derived>
3663 DeclarationNameInfo
3664 TreeTransform<Derived>
3665 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3666   DeclarationName Name = NameInfo.getName();
3667   if (!Name)
3668     return DeclarationNameInfo();
3669 
3670   switch (Name.getNameKind()) {
3671   case DeclarationName::Identifier:
3672   case DeclarationName::ObjCZeroArgSelector:
3673   case DeclarationName::ObjCOneArgSelector:
3674   case DeclarationName::ObjCMultiArgSelector:
3675   case DeclarationName::CXXOperatorName:
3676   case DeclarationName::CXXLiteralOperatorName:
3677   case DeclarationName::CXXUsingDirective:
3678     return NameInfo;
3679 
3680   case DeclarationName::CXXDeductionGuideName: {
3681     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3682     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3683         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3684     if (!NewTemplate)
3685       return DeclarationNameInfo();
3686 
3687     DeclarationNameInfo NewNameInfo(NameInfo);
3688     NewNameInfo.setName(
3689         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3690     return NewNameInfo;
3691   }
3692 
3693   case DeclarationName::CXXConstructorName:
3694   case DeclarationName::CXXDestructorName:
3695   case DeclarationName::CXXConversionFunctionName: {
3696     TypeSourceInfo *NewTInfo;
3697     CanQualType NewCanTy;
3698     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3699       NewTInfo = getDerived().TransformType(OldTInfo);
3700       if (!NewTInfo)
3701         return DeclarationNameInfo();
3702       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3703     }
3704     else {
3705       NewTInfo = nullptr;
3706       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3707       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3708       if (NewT.isNull())
3709         return DeclarationNameInfo();
3710       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3711     }
3712 
3713     DeclarationName NewName
3714       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3715                                                            NewCanTy);
3716     DeclarationNameInfo NewNameInfo(NameInfo);
3717     NewNameInfo.setName(NewName);
3718     NewNameInfo.setNamedTypeInfo(NewTInfo);
3719     return NewNameInfo;
3720   }
3721   }
3722 
3723   llvm_unreachable("Unknown name kind.");
3724 }
3725 
3726 template<typename Derived>
3727 TemplateName
3728 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3729                                               TemplateName Name,
3730                                               SourceLocation NameLoc,
3731                                               QualType ObjectType,
3732                                               NamedDecl *FirstQualifierInScope,
3733                                               bool AllowInjectedClassName) {
3734   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3735     TemplateDecl *Template = QTN->getTemplateDecl();
3736     assert(Template && "qualified template name must refer to a template");
3737 
3738     TemplateDecl *TransTemplate
3739       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3740                                                               Template));
3741     if (!TransTemplate)
3742       return TemplateName();
3743 
3744     if (!getDerived().AlwaysRebuild() &&
3745         SS.getScopeRep() == QTN->getQualifier() &&
3746         TransTemplate == Template)
3747       return Name;
3748 
3749     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3750                                             TransTemplate);
3751   }
3752 
3753   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3754     if (SS.getScopeRep()) {
3755       // These apply to the scope specifier, not the template.
3756       ObjectType = QualType();
3757       FirstQualifierInScope = nullptr;
3758     }
3759 
3760     if (!getDerived().AlwaysRebuild() &&
3761         SS.getScopeRep() == DTN->getQualifier() &&
3762         ObjectType.isNull())
3763       return Name;
3764 
3765     // FIXME: Preserve the location of the "template" keyword.
3766     SourceLocation TemplateKWLoc = NameLoc;
3767 
3768     if (DTN->isIdentifier()) {
3769       return getDerived().RebuildTemplateName(SS,
3770                                               TemplateKWLoc,
3771                                               *DTN->getIdentifier(),
3772                                               NameLoc,
3773                                               ObjectType,
3774                                               FirstQualifierInScope,
3775                                               AllowInjectedClassName);
3776     }
3777 
3778     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3779                                             DTN->getOperator(), NameLoc,
3780                                             ObjectType, AllowInjectedClassName);
3781   }
3782 
3783   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3784     TemplateDecl *TransTemplate
3785       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3786                                                               Template));
3787     if (!TransTemplate)
3788       return TemplateName();
3789 
3790     if (!getDerived().AlwaysRebuild() &&
3791         TransTemplate == Template)
3792       return Name;
3793 
3794     return TemplateName(TransTemplate);
3795   }
3796 
3797   if (SubstTemplateTemplateParmPackStorage *SubstPack
3798       = Name.getAsSubstTemplateTemplateParmPack()) {
3799     TemplateTemplateParmDecl *TransParam
3800     = cast_or_null<TemplateTemplateParmDecl>(
3801             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3802     if (!TransParam)
3803       return TemplateName();
3804 
3805     if (!getDerived().AlwaysRebuild() &&
3806         TransParam == SubstPack->getParameterPack())
3807       return Name;
3808 
3809     return getDerived().RebuildTemplateName(TransParam,
3810                                             SubstPack->getArgumentPack());
3811   }
3812 
3813   // These should be getting filtered out before they reach the AST.
3814   llvm_unreachable("overloaded function decl survived to here");
3815 }
3816 
3817 template<typename Derived>
3818 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3819                                          const TemplateArgument &Arg,
3820                                          TemplateArgumentLoc &Output) {
3821   SourceLocation Loc = getDerived().getBaseLocation();
3822   switch (Arg.getKind()) {
3823   case TemplateArgument::Null:
3824     llvm_unreachable("null template argument in TreeTransform");
3825     break;
3826 
3827   case TemplateArgument::Type:
3828     Output = TemplateArgumentLoc(Arg,
3829                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3830 
3831     break;
3832 
3833   case TemplateArgument::Template:
3834   case TemplateArgument::TemplateExpansion: {
3835     NestedNameSpecifierLocBuilder Builder;
3836     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3837     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3838       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3839     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3840       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3841 
3842     if (Arg.getKind() == TemplateArgument::Template)
3843       Output = TemplateArgumentLoc(Arg,
3844                                    Builder.getWithLocInContext(SemaRef.Context),
3845                                    Loc);
3846     else
3847       Output = TemplateArgumentLoc(Arg,
3848                                    Builder.getWithLocInContext(SemaRef.Context),
3849                                    Loc, Loc);
3850 
3851     break;
3852   }
3853 
3854   case TemplateArgument::Expression:
3855     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3856     break;
3857 
3858   case TemplateArgument::Declaration:
3859   case TemplateArgument::Integral:
3860   case TemplateArgument::Pack:
3861   case TemplateArgument::NullPtr:
3862     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3863     break;
3864   }
3865 }
3866 
3867 template<typename Derived>
3868 bool TreeTransform<Derived>::TransformTemplateArgument(
3869                                          const TemplateArgumentLoc &Input,
3870                                          TemplateArgumentLoc &Output, bool Uneval) {
3871   EnterExpressionEvaluationContext EEEC(
3872       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated,
3873       /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
3874       Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
3875   const TemplateArgument &Arg = Input.getArgument();
3876   switch (Arg.getKind()) {
3877   case TemplateArgument::Null:
3878   case TemplateArgument::Integral:
3879   case TemplateArgument::Pack:
3880   case TemplateArgument::Declaration:
3881   case TemplateArgument::NullPtr:
3882     llvm_unreachable("Unexpected TemplateArgument");
3883 
3884   case TemplateArgument::Type: {
3885     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3886     if (!DI)
3887       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3888 
3889     DI = getDerived().TransformType(DI);
3890     if (!DI) return true;
3891 
3892     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3893     return false;
3894   }
3895 
3896   case TemplateArgument::Template: {
3897     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3898     if (QualifierLoc) {
3899       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3900       if (!QualifierLoc)
3901         return true;
3902     }
3903 
3904     CXXScopeSpec SS;
3905     SS.Adopt(QualifierLoc);
3906     TemplateName Template
3907       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3908                                            Input.getTemplateNameLoc());
3909     if (Template.isNull())
3910       return true;
3911 
3912     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3913                                  Input.getTemplateNameLoc());
3914     return false;
3915   }
3916 
3917   case TemplateArgument::TemplateExpansion:
3918     llvm_unreachable("Caller should expand pack expansions");
3919 
3920   case TemplateArgument::Expression: {
3921     // Template argument expressions are constant expressions.
3922     EnterExpressionEvaluationContext Unevaluated(
3923         getSema(), Uneval
3924                        ? Sema::ExpressionEvaluationContext::Unevaluated
3925                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
3926 
3927     Expr *InputExpr = Input.getSourceExpression();
3928     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3929 
3930     ExprResult E = getDerived().TransformExpr(InputExpr);
3931     E = SemaRef.ActOnConstantExpression(E);
3932     if (E.isInvalid()) return true;
3933     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3934     return false;
3935   }
3936   }
3937 
3938   // Work around bogus GCC warning
3939   return true;
3940 }
3941 
3942 /// Iterator adaptor that invents template argument location information
3943 /// for each of the template arguments in its underlying iterator.
3944 template<typename Derived, typename InputIterator>
3945 class TemplateArgumentLocInventIterator {
3946   TreeTransform<Derived> &Self;
3947   InputIterator Iter;
3948 
3949 public:
3950   typedef TemplateArgumentLoc value_type;
3951   typedef TemplateArgumentLoc reference;
3952   typedef typename std::iterator_traits<InputIterator>::difference_type
3953     difference_type;
3954   typedef std::input_iterator_tag iterator_category;
3955 
3956   class pointer {
3957     TemplateArgumentLoc Arg;
3958 
3959   public:
3960     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3961 
3962     const TemplateArgumentLoc *operator->() const { return &Arg; }
3963   };
3964 
3965   TemplateArgumentLocInventIterator() { }
3966 
3967   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3968                                              InputIterator Iter)
3969     : Self(Self), Iter(Iter) { }
3970 
3971   TemplateArgumentLocInventIterator &operator++() {
3972     ++Iter;
3973     return *this;
3974   }
3975 
3976   TemplateArgumentLocInventIterator operator++(int) {
3977     TemplateArgumentLocInventIterator Old(*this);
3978     ++(*this);
3979     return Old;
3980   }
3981 
3982   reference operator*() const {
3983     TemplateArgumentLoc Result;
3984     Self.InventTemplateArgumentLoc(*Iter, Result);
3985     return Result;
3986   }
3987 
3988   pointer operator->() const { return pointer(**this); }
3989 
3990   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3991                          const TemplateArgumentLocInventIterator &Y) {
3992     return X.Iter == Y.Iter;
3993   }
3994 
3995   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3996                          const TemplateArgumentLocInventIterator &Y) {
3997     return X.Iter != Y.Iter;
3998   }
3999 };
4000 
4001 template<typename Derived>
4002 template<typename InputIterator>
4003 bool TreeTransform<Derived>::TransformTemplateArguments(
4004     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4005     bool Uneval) {
4006   for (; First != Last; ++First) {
4007     TemplateArgumentLoc Out;
4008     TemplateArgumentLoc In = *First;
4009 
4010     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4011       // Unpack argument packs, which we translate them into separate
4012       // arguments.
4013       // FIXME: We could do much better if we could guarantee that the
4014       // TemplateArgumentLocInfo for the pack expansion would be usable for
4015       // all of the template arguments in the argument pack.
4016       typedef TemplateArgumentLocInventIterator<Derived,
4017                                                 TemplateArgument::pack_iterator>
4018         PackLocIterator;
4019       if (TransformTemplateArguments(PackLocIterator(*this,
4020                                                  In.getArgument().pack_begin()),
4021                                      PackLocIterator(*this,
4022                                                    In.getArgument().pack_end()),
4023                                      Outputs, Uneval))
4024         return true;
4025 
4026       continue;
4027     }
4028 
4029     if (In.getArgument().isPackExpansion()) {
4030       // We have a pack expansion, for which we will be substituting into
4031       // the pattern.
4032       SourceLocation Ellipsis;
4033       Optional<unsigned> OrigNumExpansions;
4034       TemplateArgumentLoc Pattern
4035         = getSema().getTemplateArgumentPackExpansionPattern(
4036               In, Ellipsis, OrigNumExpansions);
4037 
4038       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4039       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4040       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4041 
4042       // Determine whether the set of unexpanded parameter packs can and should
4043       // be expanded.
4044       bool Expand = true;
4045       bool RetainExpansion = false;
4046       Optional<unsigned> NumExpansions = OrigNumExpansions;
4047       if (getDerived().TryExpandParameterPacks(Ellipsis,
4048                                                Pattern.getSourceRange(),
4049                                                Unexpanded,
4050                                                Expand,
4051                                                RetainExpansion,
4052                                                NumExpansions))
4053         return true;
4054 
4055       if (!Expand) {
4056         // The transform has determined that we should perform a simple
4057         // transformation on the pack expansion, producing another pack
4058         // expansion.
4059         TemplateArgumentLoc OutPattern;
4060         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4061         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4062           return true;
4063 
4064         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4065                                                 NumExpansions);
4066         if (Out.getArgument().isNull())
4067           return true;
4068 
4069         Outputs.addArgument(Out);
4070         continue;
4071       }
4072 
4073       // The transform has determined that we should perform an elementwise
4074       // expansion of the pattern. Do so.
4075       for (unsigned I = 0; I != *NumExpansions; ++I) {
4076         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4077 
4078         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4079           return true;
4080 
4081         if (Out.getArgument().containsUnexpandedParameterPack()) {
4082           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4083                                                   OrigNumExpansions);
4084           if (Out.getArgument().isNull())
4085             return true;
4086         }
4087 
4088         Outputs.addArgument(Out);
4089       }
4090 
4091       // If we're supposed to retain a pack expansion, do so by temporarily
4092       // forgetting the partially-substituted parameter pack.
4093       if (RetainExpansion) {
4094         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4095 
4096         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4097           return true;
4098 
4099         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4100                                                 OrigNumExpansions);
4101         if (Out.getArgument().isNull())
4102           return true;
4103 
4104         Outputs.addArgument(Out);
4105       }
4106 
4107       continue;
4108     }
4109 
4110     // The simple case:
4111     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4112       return true;
4113 
4114     Outputs.addArgument(Out);
4115   }
4116 
4117   return false;
4118 
4119 }
4120 
4121 //===----------------------------------------------------------------------===//
4122 // Type transformation
4123 //===----------------------------------------------------------------------===//
4124 
4125 template<typename Derived>
4126 QualType TreeTransform<Derived>::TransformType(QualType T) {
4127   if (getDerived().AlreadyTransformed(T))
4128     return T;
4129 
4130   // Temporary workaround.  All of these transformations should
4131   // eventually turn into transformations on TypeLocs.
4132   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4133                                                 getDerived().getBaseLocation());
4134 
4135   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4136 
4137   if (!NewDI)
4138     return QualType();
4139 
4140   return NewDI->getType();
4141 }
4142 
4143 template<typename Derived>
4144 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4145   // Refine the base location to the type's location.
4146   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4147                        getDerived().getBaseEntity());
4148   if (getDerived().AlreadyTransformed(DI->getType()))
4149     return DI;
4150 
4151   TypeLocBuilder TLB;
4152 
4153   TypeLoc TL = DI->getTypeLoc();
4154   TLB.reserve(TL.getFullDataSize());
4155 
4156   QualType Result = getDerived().TransformType(TLB, TL);
4157   if (Result.isNull())
4158     return nullptr;
4159 
4160   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4161 }
4162 
4163 template<typename Derived>
4164 QualType
4165 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4166   switch (T.getTypeLocClass()) {
4167 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4168 #define TYPELOC(CLASS, PARENT)                                                 \
4169   case TypeLoc::CLASS:                                                         \
4170     return getDerived().Transform##CLASS##Type(TLB,                            \
4171                                                T.castAs<CLASS##TypeLoc>());
4172 #include "clang/AST/TypeLocNodes.def"
4173   }
4174 
4175   llvm_unreachable("unhandled type loc!");
4176 }
4177 
4178 template<typename Derived>
4179 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4180   if (!isa<DependentNameType>(T))
4181     return TransformType(T);
4182 
4183   if (getDerived().AlreadyTransformed(T))
4184     return T;
4185   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4186                                                 getDerived().getBaseLocation());
4187   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4188   return NewDI ? NewDI->getType() : QualType();
4189 }
4190 
4191 template<typename Derived>
4192 TypeSourceInfo *
4193 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4194   if (!isa<DependentNameType>(DI->getType()))
4195     return TransformType(DI);
4196 
4197   // Refine the base location to the type's location.
4198   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4199                        getDerived().getBaseEntity());
4200   if (getDerived().AlreadyTransformed(DI->getType()))
4201     return DI;
4202 
4203   TypeLocBuilder TLB;
4204 
4205   TypeLoc TL = DI->getTypeLoc();
4206   TLB.reserve(TL.getFullDataSize());
4207 
4208   auto QTL = TL.getAs<QualifiedTypeLoc>();
4209   if (QTL)
4210     TL = QTL.getUnqualifiedLoc();
4211 
4212   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4213 
4214   QualType Result = getDerived().TransformDependentNameType(
4215       TLB, DNTL, /*DeducedTSTContext*/true);
4216   if (Result.isNull())
4217     return nullptr;
4218 
4219   if (QTL) {
4220     Result = getDerived().RebuildQualifiedType(
4221         Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers());
4222     TLB.TypeWasModifiedSafely(Result);
4223   }
4224 
4225   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4226 }
4227 
4228 template<typename Derived>
4229 QualType
4230 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4231                                                QualifiedTypeLoc T) {
4232   Qualifiers Quals = T.getType().getLocalQualifiers();
4233 
4234   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4235   if (Result.isNull())
4236     return QualType();
4237 
4238   Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals);
4239 
4240   // RebuildQualifiedType might have updated the type, but not in a way
4241   // that invalidates the TypeLoc. (There's no location information for
4242   // qualifiers.)
4243   TLB.TypeWasModifiedSafely(Result);
4244 
4245   return Result;
4246 }
4247 
4248 template<typename Derived>
4249 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4250                                                       SourceLocation Loc,
4251                                                       Qualifiers Quals) {
4252   // C++ [dcl.fct]p7:
4253   //   [When] adding cv-qualifications on top of the function type [...] the
4254   //   cv-qualifiers are ignored.
4255   // C++ [dcl.ref]p1:
4256   //   when the cv-qualifiers are introduced through the use of a typedef-name
4257   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4258   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4259   // applied to a reference type.
4260   // FIXME: This removes all qualifiers, not just cv-qualifiers!
4261   if (T->isFunctionType() || T->isReferenceType())
4262     return T;
4263 
4264   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4265   // resulting type.
4266   if (Quals.hasObjCLifetime()) {
4267     if (!T->isObjCLifetimeType() && !T->isDependentType())
4268       Quals.removeObjCLifetime();
4269     else if (T.getObjCLifetime()) {
4270       // Objective-C ARC:
4271       //   A lifetime qualifier applied to a substituted template parameter
4272       //   overrides the lifetime qualifier from the template argument.
4273       const AutoType *AutoTy;
4274       if (const SubstTemplateTypeParmType *SubstTypeParam
4275                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4276         QualType Replacement = SubstTypeParam->getReplacementType();
4277         Qualifiers Qs = Replacement.getQualifiers();
4278         Qs.removeObjCLifetime();
4279         Replacement = SemaRef.Context.getQualifiedType(
4280             Replacement.getUnqualifiedType(), Qs);
4281         T = SemaRef.Context.getSubstTemplateTypeParmType(
4282             SubstTypeParam->getReplacedParameter(), Replacement);
4283       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4284         // 'auto' types behave the same way as template parameters.
4285         QualType Deduced = AutoTy->getDeducedType();
4286         Qualifiers Qs = Deduced.getQualifiers();
4287         Qs.removeObjCLifetime();
4288         Deduced =
4289             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4290         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4291                                         AutoTy->isDependentType());
4292       } else {
4293         // Otherwise, complain about the addition of a qualifier to an
4294         // already-qualified type.
4295         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4296         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4297         Quals.removeObjCLifetime();
4298       }
4299     }
4300   }
4301 
4302   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4303 }
4304 
4305 template<typename Derived>
4306 TypeLoc
4307 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4308                                                    QualType ObjectType,
4309                                                    NamedDecl *UnqualLookup,
4310                                                    CXXScopeSpec &SS) {
4311   if (getDerived().AlreadyTransformed(TL.getType()))
4312     return TL;
4313 
4314   TypeSourceInfo *TSI =
4315       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4316   if (TSI)
4317     return TSI->getTypeLoc();
4318   return TypeLoc();
4319 }
4320 
4321 template<typename Derived>
4322 TypeSourceInfo *
4323 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4324                                                    QualType ObjectType,
4325                                                    NamedDecl *UnqualLookup,
4326                                                    CXXScopeSpec &SS) {
4327   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4328     return TSInfo;
4329 
4330   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4331                                    UnqualLookup, SS);
4332 }
4333 
4334 template <typename Derived>
4335 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4336     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4337     CXXScopeSpec &SS) {
4338   QualType T = TL.getType();
4339   assert(!getDerived().AlreadyTransformed(T));
4340 
4341   TypeLocBuilder TLB;
4342   QualType Result;
4343 
4344   if (isa<TemplateSpecializationType>(T)) {
4345     TemplateSpecializationTypeLoc SpecTL =
4346         TL.castAs<TemplateSpecializationTypeLoc>();
4347 
4348     TemplateName Template = getDerived().TransformTemplateName(
4349         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4350         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4351     if (Template.isNull())
4352       return nullptr;
4353 
4354     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4355                                                               Template);
4356   } else if (isa<DependentTemplateSpecializationType>(T)) {
4357     DependentTemplateSpecializationTypeLoc SpecTL =
4358         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4359 
4360     TemplateName Template
4361       = getDerived().RebuildTemplateName(SS,
4362                                          SpecTL.getTemplateKeywordLoc(),
4363                                          *SpecTL.getTypePtr()->getIdentifier(),
4364                                          SpecTL.getTemplateNameLoc(),
4365                                          ObjectType, UnqualLookup,
4366                                          /*AllowInjectedClassName*/true);
4367     if (Template.isNull())
4368       return nullptr;
4369 
4370     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4371                                                                        SpecTL,
4372                                                                        Template,
4373                                                                        SS);
4374   } else {
4375     // Nothing special needs to be done for these.
4376     Result = getDerived().TransformType(TLB, TL);
4377   }
4378 
4379   if (Result.isNull())
4380     return nullptr;
4381 
4382   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4383 }
4384 
4385 template <class TyLoc> static inline
4386 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4387   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4388   NewT.setNameLoc(T.getNameLoc());
4389   return T.getType();
4390 }
4391 
4392 template<typename Derived>
4393 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4394                                                       BuiltinTypeLoc T) {
4395   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4396   NewT.setBuiltinLoc(T.getBuiltinLoc());
4397   if (T.needsExtraLocalData())
4398     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4399   return T.getType();
4400 }
4401 
4402 template<typename Derived>
4403 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4404                                                       ComplexTypeLoc T) {
4405   // FIXME: recurse?
4406   return TransformTypeSpecType(TLB, T);
4407 }
4408 
4409 template <typename Derived>
4410 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4411                                                        AdjustedTypeLoc TL) {
4412   // Adjustments applied during transformation are handled elsewhere.
4413   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4414 }
4415 
4416 template<typename Derived>
4417 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4418                                                       DecayedTypeLoc TL) {
4419   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4420   if (OriginalType.isNull())
4421     return QualType();
4422 
4423   QualType Result = TL.getType();
4424   if (getDerived().AlwaysRebuild() ||
4425       OriginalType != TL.getOriginalLoc().getType())
4426     Result = SemaRef.Context.getDecayedType(OriginalType);
4427   TLB.push<DecayedTypeLoc>(Result);
4428   // Nothing to set for DecayedTypeLoc.
4429   return Result;
4430 }
4431 
4432 template<typename Derived>
4433 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4434                                                       PointerTypeLoc TL) {
4435   QualType PointeeType
4436     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4437   if (PointeeType.isNull())
4438     return QualType();
4439 
4440   QualType Result = TL.getType();
4441   if (PointeeType->getAs<ObjCObjectType>()) {
4442     // A dependent pointer type 'T *' has is being transformed such
4443     // that an Objective-C class type is being replaced for 'T'. The
4444     // resulting pointer type is an ObjCObjectPointerType, not a
4445     // PointerType.
4446     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4447 
4448     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4449     NewT.setStarLoc(TL.getStarLoc());
4450     return Result;
4451   }
4452 
4453   if (getDerived().AlwaysRebuild() ||
4454       PointeeType != TL.getPointeeLoc().getType()) {
4455     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4456     if (Result.isNull())
4457       return QualType();
4458   }
4459 
4460   // Objective-C ARC can add lifetime qualifiers to the type that we're
4461   // pointing to.
4462   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4463 
4464   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4465   NewT.setSigilLoc(TL.getSigilLoc());
4466   return Result;
4467 }
4468 
4469 template<typename Derived>
4470 QualType
4471 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4472                                                   BlockPointerTypeLoc TL) {
4473   QualType PointeeType
4474     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4475   if (PointeeType.isNull())
4476     return QualType();
4477 
4478   QualType Result = TL.getType();
4479   if (getDerived().AlwaysRebuild() ||
4480       PointeeType != TL.getPointeeLoc().getType()) {
4481     Result = getDerived().RebuildBlockPointerType(PointeeType,
4482                                                   TL.getSigilLoc());
4483     if (Result.isNull())
4484       return QualType();
4485   }
4486 
4487   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4488   NewT.setSigilLoc(TL.getSigilLoc());
4489   return Result;
4490 }
4491 
4492 /// Transforms a reference type.  Note that somewhat paradoxically we
4493 /// don't care whether the type itself is an l-value type or an r-value
4494 /// type;  we only care if the type was *written* as an l-value type
4495 /// or an r-value type.
4496 template<typename Derived>
4497 QualType
4498 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4499                                                ReferenceTypeLoc TL) {
4500   const ReferenceType *T = TL.getTypePtr();
4501 
4502   // Note that this works with the pointee-as-written.
4503   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4504   if (PointeeType.isNull())
4505     return QualType();
4506 
4507   QualType Result = TL.getType();
4508   if (getDerived().AlwaysRebuild() ||
4509       PointeeType != T->getPointeeTypeAsWritten()) {
4510     Result = getDerived().RebuildReferenceType(PointeeType,
4511                                                T->isSpelledAsLValue(),
4512                                                TL.getSigilLoc());
4513     if (Result.isNull())
4514       return QualType();
4515   }
4516 
4517   // Objective-C ARC can add lifetime qualifiers to the type that we're
4518   // referring to.
4519   TLB.TypeWasModifiedSafely(
4520                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4521 
4522   // r-value references can be rebuilt as l-value references.
4523   ReferenceTypeLoc NewTL;
4524   if (isa<LValueReferenceType>(Result))
4525     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4526   else
4527     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4528   NewTL.setSigilLoc(TL.getSigilLoc());
4529 
4530   return Result;
4531 }
4532 
4533 template<typename Derived>
4534 QualType
4535 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4536                                                  LValueReferenceTypeLoc TL) {
4537   return TransformReferenceType(TLB, TL);
4538 }
4539 
4540 template<typename Derived>
4541 QualType
4542 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4543                                                  RValueReferenceTypeLoc TL) {
4544   return TransformReferenceType(TLB, TL);
4545 }
4546 
4547 template<typename Derived>
4548 QualType
4549 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4550                                                    MemberPointerTypeLoc TL) {
4551   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4552   if (PointeeType.isNull())
4553     return QualType();
4554 
4555   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4556   TypeSourceInfo *NewClsTInfo = nullptr;
4557   if (OldClsTInfo) {
4558     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4559     if (!NewClsTInfo)
4560       return QualType();
4561   }
4562 
4563   const MemberPointerType *T = TL.getTypePtr();
4564   QualType OldClsType = QualType(T->getClass(), 0);
4565   QualType NewClsType;
4566   if (NewClsTInfo)
4567     NewClsType = NewClsTInfo->getType();
4568   else {
4569     NewClsType = getDerived().TransformType(OldClsType);
4570     if (NewClsType.isNull())
4571       return QualType();
4572   }
4573 
4574   QualType Result = TL.getType();
4575   if (getDerived().AlwaysRebuild() ||
4576       PointeeType != T->getPointeeType() ||
4577       NewClsType != OldClsType) {
4578     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4579                                                    TL.getStarLoc());
4580     if (Result.isNull())
4581       return QualType();
4582   }
4583 
4584   // If we had to adjust the pointee type when building a member pointer, make
4585   // sure to push TypeLoc info for it.
4586   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4587   if (MPT && PointeeType != MPT->getPointeeType()) {
4588     assert(isa<AdjustedType>(MPT->getPointeeType()));
4589     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4590   }
4591 
4592   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4593   NewTL.setSigilLoc(TL.getSigilLoc());
4594   NewTL.setClassTInfo(NewClsTInfo);
4595 
4596   return Result;
4597 }
4598 
4599 template<typename Derived>
4600 QualType
4601 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4602                                                    ConstantArrayTypeLoc TL) {
4603   const ConstantArrayType *T = TL.getTypePtr();
4604   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4605   if (ElementType.isNull())
4606     return QualType();
4607 
4608   QualType Result = TL.getType();
4609   if (getDerived().AlwaysRebuild() ||
4610       ElementType != T->getElementType()) {
4611     Result = getDerived().RebuildConstantArrayType(ElementType,
4612                                                    T->getSizeModifier(),
4613                                                    T->getSize(),
4614                                              T->getIndexTypeCVRQualifiers(),
4615                                                    TL.getBracketsRange());
4616     if (Result.isNull())
4617       return QualType();
4618   }
4619 
4620   // We might have either a ConstantArrayType or a VariableArrayType now:
4621   // a ConstantArrayType is allowed to have an element type which is a
4622   // VariableArrayType if the type is dependent.  Fortunately, all array
4623   // types have the same location layout.
4624   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4625   NewTL.setLBracketLoc(TL.getLBracketLoc());
4626   NewTL.setRBracketLoc(TL.getRBracketLoc());
4627 
4628   Expr *Size = TL.getSizeExpr();
4629   if (Size) {
4630     EnterExpressionEvaluationContext Unevaluated(
4631         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4632     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4633     Size = SemaRef.ActOnConstantExpression(Size).get();
4634   }
4635   NewTL.setSizeExpr(Size);
4636 
4637   return Result;
4638 }
4639 
4640 template<typename Derived>
4641 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4642                                               TypeLocBuilder &TLB,
4643                                               IncompleteArrayTypeLoc TL) {
4644   const IncompleteArrayType *T = TL.getTypePtr();
4645   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4646   if (ElementType.isNull())
4647     return QualType();
4648 
4649   QualType Result = TL.getType();
4650   if (getDerived().AlwaysRebuild() ||
4651       ElementType != T->getElementType()) {
4652     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4653                                                      T->getSizeModifier(),
4654                                            T->getIndexTypeCVRQualifiers(),
4655                                                      TL.getBracketsRange());
4656     if (Result.isNull())
4657       return QualType();
4658   }
4659 
4660   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4661   NewTL.setLBracketLoc(TL.getLBracketLoc());
4662   NewTL.setRBracketLoc(TL.getRBracketLoc());
4663   NewTL.setSizeExpr(nullptr);
4664 
4665   return Result;
4666 }
4667 
4668 template<typename Derived>
4669 QualType
4670 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4671                                                    VariableArrayTypeLoc TL) {
4672   const VariableArrayType *T = TL.getTypePtr();
4673   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4674   if (ElementType.isNull())
4675     return QualType();
4676 
4677   ExprResult SizeResult;
4678   {
4679     EnterExpressionEvaluationContext Context(
4680         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4681     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4682   }
4683   if (SizeResult.isInvalid())
4684     return QualType();
4685   SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get());
4686   if (SizeResult.isInvalid())
4687     return QualType();
4688 
4689   Expr *Size = SizeResult.get();
4690 
4691   QualType Result = TL.getType();
4692   if (getDerived().AlwaysRebuild() ||
4693       ElementType != T->getElementType() ||
4694       Size != T->getSizeExpr()) {
4695     Result = getDerived().RebuildVariableArrayType(ElementType,
4696                                                    T->getSizeModifier(),
4697                                                    Size,
4698                                              T->getIndexTypeCVRQualifiers(),
4699                                                    TL.getBracketsRange());
4700     if (Result.isNull())
4701       return QualType();
4702   }
4703 
4704   // We might have constant size array now, but fortunately it has the same
4705   // location layout.
4706   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4707   NewTL.setLBracketLoc(TL.getLBracketLoc());
4708   NewTL.setRBracketLoc(TL.getRBracketLoc());
4709   NewTL.setSizeExpr(Size);
4710 
4711   return Result;
4712 }
4713 
4714 template<typename Derived>
4715 QualType
4716 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4717                                              DependentSizedArrayTypeLoc TL) {
4718   const DependentSizedArrayType *T = TL.getTypePtr();
4719   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4720   if (ElementType.isNull())
4721     return QualType();
4722 
4723   // Array bounds are constant expressions.
4724   EnterExpressionEvaluationContext Unevaluated(
4725       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4726 
4727   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4728   Expr *origSize = TL.getSizeExpr();
4729   if (!origSize) origSize = T->getSizeExpr();
4730 
4731   ExprResult sizeResult
4732     = getDerived().TransformExpr(origSize);
4733   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4734   if (sizeResult.isInvalid())
4735     return QualType();
4736 
4737   Expr *size = sizeResult.get();
4738 
4739   QualType Result = TL.getType();
4740   if (getDerived().AlwaysRebuild() ||
4741       ElementType != T->getElementType() ||
4742       size != origSize) {
4743     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4744                                                          T->getSizeModifier(),
4745                                                          size,
4746                                                 T->getIndexTypeCVRQualifiers(),
4747                                                         TL.getBracketsRange());
4748     if (Result.isNull())
4749       return QualType();
4750   }
4751 
4752   // We might have any sort of array type now, but fortunately they
4753   // all have the same location layout.
4754   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4755   NewTL.setLBracketLoc(TL.getLBracketLoc());
4756   NewTL.setRBracketLoc(TL.getRBracketLoc());
4757   NewTL.setSizeExpr(size);
4758 
4759   return Result;
4760 }
4761 
4762 template <typename Derived>
4763 QualType TreeTransform<Derived>::TransformDependentVectorType(
4764     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
4765   const DependentVectorType *T = TL.getTypePtr();
4766   QualType ElementType = getDerived().TransformType(T->getElementType());
4767   if (ElementType.isNull())
4768     return QualType();
4769 
4770   EnterExpressionEvaluationContext Unevaluated(
4771       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4772 
4773   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4774   Size = SemaRef.ActOnConstantExpression(Size);
4775   if (Size.isInvalid())
4776     return QualType();
4777 
4778   QualType Result = TL.getType();
4779   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
4780       Size.get() != T->getSizeExpr()) {
4781     Result = getDerived().RebuildDependentVectorType(
4782         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
4783     if (Result.isNull())
4784       return QualType();
4785   }
4786 
4787   // Result might be dependent or not.
4788   if (isa<DependentVectorType>(Result)) {
4789     DependentVectorTypeLoc NewTL =
4790         TLB.push<DependentVectorTypeLoc>(Result);
4791     NewTL.setNameLoc(TL.getNameLoc());
4792   } else {
4793     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4794     NewTL.setNameLoc(TL.getNameLoc());
4795   }
4796 
4797   return Result;
4798 }
4799 
4800 template<typename Derived>
4801 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4802                                       TypeLocBuilder &TLB,
4803                                       DependentSizedExtVectorTypeLoc TL) {
4804   const DependentSizedExtVectorType *T = TL.getTypePtr();
4805 
4806   // FIXME: ext vector locs should be nested
4807   QualType ElementType = getDerived().TransformType(T->getElementType());
4808   if (ElementType.isNull())
4809     return QualType();
4810 
4811   // Vector sizes are constant expressions.
4812   EnterExpressionEvaluationContext Unevaluated(
4813       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4814 
4815   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4816   Size = SemaRef.ActOnConstantExpression(Size);
4817   if (Size.isInvalid())
4818     return QualType();
4819 
4820   QualType Result = TL.getType();
4821   if (getDerived().AlwaysRebuild() ||
4822       ElementType != T->getElementType() ||
4823       Size.get() != T->getSizeExpr()) {
4824     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4825                                                              Size.get(),
4826                                                          T->getAttributeLoc());
4827     if (Result.isNull())
4828       return QualType();
4829   }
4830 
4831   // Result might be dependent or not.
4832   if (isa<DependentSizedExtVectorType>(Result)) {
4833     DependentSizedExtVectorTypeLoc NewTL
4834       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4835     NewTL.setNameLoc(TL.getNameLoc());
4836   } else {
4837     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4838     NewTL.setNameLoc(TL.getNameLoc());
4839   }
4840 
4841   return Result;
4842 }
4843 
4844 template <typename Derived>
4845 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
4846     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
4847   const DependentAddressSpaceType *T = TL.getTypePtr();
4848 
4849   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
4850 
4851   if (pointeeType.isNull())
4852     return QualType();
4853 
4854   // Address spaces are constant expressions.
4855   EnterExpressionEvaluationContext Unevaluated(
4856       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4857 
4858   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
4859   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
4860   if (AddrSpace.isInvalid())
4861     return QualType();
4862 
4863   QualType Result = TL.getType();
4864   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
4865       AddrSpace.get() != T->getAddrSpaceExpr()) {
4866     Result = getDerived().RebuildDependentAddressSpaceType(
4867         pointeeType, AddrSpace.get(), T->getAttributeLoc());
4868     if (Result.isNull())
4869       return QualType();
4870   }
4871 
4872   // Result might be dependent or not.
4873   if (isa<DependentAddressSpaceType>(Result)) {
4874     DependentAddressSpaceTypeLoc NewTL =
4875         TLB.push<DependentAddressSpaceTypeLoc>(Result);
4876 
4877     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
4878     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
4879     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
4880 
4881   } else {
4882     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
4883         Result, getDerived().getBaseLocation());
4884     TransformType(TLB, DI->getTypeLoc());
4885   }
4886 
4887   return Result;
4888 }
4889 
4890 template <typename Derived>
4891 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4892                                                      VectorTypeLoc TL) {
4893   const VectorType *T = TL.getTypePtr();
4894   QualType ElementType = getDerived().TransformType(T->getElementType());
4895   if (ElementType.isNull())
4896     return QualType();
4897 
4898   QualType Result = TL.getType();
4899   if (getDerived().AlwaysRebuild() ||
4900       ElementType != T->getElementType()) {
4901     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4902                                             T->getVectorKind());
4903     if (Result.isNull())
4904       return QualType();
4905   }
4906 
4907   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4908   NewTL.setNameLoc(TL.getNameLoc());
4909 
4910   return Result;
4911 }
4912 
4913 template<typename Derived>
4914 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4915                                                         ExtVectorTypeLoc TL) {
4916   const VectorType *T = TL.getTypePtr();
4917   QualType ElementType = getDerived().TransformType(T->getElementType());
4918   if (ElementType.isNull())
4919     return QualType();
4920 
4921   QualType Result = TL.getType();
4922   if (getDerived().AlwaysRebuild() ||
4923       ElementType != T->getElementType()) {
4924     Result = getDerived().RebuildExtVectorType(ElementType,
4925                                                T->getNumElements(),
4926                                                /*FIXME*/ SourceLocation());
4927     if (Result.isNull())
4928       return QualType();
4929   }
4930 
4931   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4932   NewTL.setNameLoc(TL.getNameLoc());
4933 
4934   return Result;
4935 }
4936 
4937 template <typename Derived>
4938 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4939     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4940     bool ExpectParameterPack) {
4941   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4942   TypeSourceInfo *NewDI = nullptr;
4943 
4944   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4945     // If we're substituting into a pack expansion type and we know the
4946     // length we want to expand to, just substitute for the pattern.
4947     TypeLoc OldTL = OldDI->getTypeLoc();
4948     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4949 
4950     TypeLocBuilder TLB;
4951     TypeLoc NewTL = OldDI->getTypeLoc();
4952     TLB.reserve(NewTL.getFullDataSize());
4953 
4954     QualType Result = getDerived().TransformType(TLB,
4955                                                OldExpansionTL.getPatternLoc());
4956     if (Result.isNull())
4957       return nullptr;
4958 
4959     Result = RebuildPackExpansionType(Result,
4960                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4961                                       OldExpansionTL.getEllipsisLoc(),
4962                                       NumExpansions);
4963     if (Result.isNull())
4964       return nullptr;
4965 
4966     PackExpansionTypeLoc NewExpansionTL
4967       = TLB.push<PackExpansionTypeLoc>(Result);
4968     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4969     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4970   } else
4971     NewDI = getDerived().TransformType(OldDI);
4972   if (!NewDI)
4973     return nullptr;
4974 
4975   if (NewDI == OldDI && indexAdjustment == 0)
4976     return OldParm;
4977 
4978   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4979                                              OldParm->getDeclContext(),
4980                                              OldParm->getInnerLocStart(),
4981                                              OldParm->getLocation(),
4982                                              OldParm->getIdentifier(),
4983                                              NewDI->getType(),
4984                                              NewDI,
4985                                              OldParm->getStorageClass(),
4986                                              /* DefArg */ nullptr);
4987   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4988                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4989   return newParm;
4990 }
4991 
4992 template <typename Derived>
4993 bool TreeTransform<Derived>::TransformFunctionTypeParams(
4994     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4995     const QualType *ParamTypes,
4996     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4997     SmallVectorImpl<QualType> &OutParamTypes,
4998     SmallVectorImpl<ParmVarDecl *> *PVars,
4999     Sema::ExtParameterInfoBuilder &PInfos) {
5000   int indexAdjustment = 0;
5001 
5002   unsigned NumParams = Params.size();
5003   for (unsigned i = 0; i != NumParams; ++i) {
5004     if (ParmVarDecl *OldParm = Params[i]) {
5005       assert(OldParm->getFunctionScopeIndex() == i);
5006 
5007       Optional<unsigned> NumExpansions;
5008       ParmVarDecl *NewParm = nullptr;
5009       if (OldParm->isParameterPack()) {
5010         // We have a function parameter pack that may need to be expanded.
5011         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5012 
5013         // Find the parameter packs that could be expanded.
5014         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5015         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5016         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5017         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5018         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
5019 
5020         // Determine whether we should expand the parameter packs.
5021         bool ShouldExpand = false;
5022         bool RetainExpansion = false;
5023         Optional<unsigned> OrigNumExpansions =
5024             ExpansionTL.getTypePtr()->getNumExpansions();
5025         NumExpansions = OrigNumExpansions;
5026         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5027                                                  Pattern.getSourceRange(),
5028                                                  Unexpanded,
5029                                                  ShouldExpand,
5030                                                  RetainExpansion,
5031                                                  NumExpansions)) {
5032           return true;
5033         }
5034 
5035         if (ShouldExpand) {
5036           // Expand the function parameter pack into multiple, separate
5037           // parameters.
5038           getDerived().ExpandingFunctionParameterPack(OldParm);
5039           for (unsigned I = 0; I != *NumExpansions; ++I) {
5040             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5041             ParmVarDecl *NewParm
5042               = getDerived().TransformFunctionTypeParam(OldParm,
5043                                                         indexAdjustment++,
5044                                                         OrigNumExpansions,
5045                                                 /*ExpectParameterPack=*/false);
5046             if (!NewParm)
5047               return true;
5048 
5049             if (ParamInfos)
5050               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5051             OutParamTypes.push_back(NewParm->getType());
5052             if (PVars)
5053               PVars->push_back(NewParm);
5054           }
5055 
5056           // If we're supposed to retain a pack expansion, do so by temporarily
5057           // forgetting the partially-substituted parameter pack.
5058           if (RetainExpansion) {
5059             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5060             ParmVarDecl *NewParm
5061               = getDerived().TransformFunctionTypeParam(OldParm,
5062                                                         indexAdjustment++,
5063                                                         OrigNumExpansions,
5064                                                 /*ExpectParameterPack=*/false);
5065             if (!NewParm)
5066               return true;
5067 
5068             if (ParamInfos)
5069               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5070             OutParamTypes.push_back(NewParm->getType());
5071             if (PVars)
5072               PVars->push_back(NewParm);
5073           }
5074 
5075           // The next parameter should have the same adjustment as the
5076           // last thing we pushed, but we post-incremented indexAdjustment
5077           // on every push.  Also, if we push nothing, the adjustment should
5078           // go down by one.
5079           indexAdjustment--;
5080 
5081           // We're done with the pack expansion.
5082           continue;
5083         }
5084 
5085         // We'll substitute the parameter now without expanding the pack
5086         // expansion.
5087         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5088         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5089                                                           indexAdjustment,
5090                                                           NumExpansions,
5091                                                   /*ExpectParameterPack=*/true);
5092       } else {
5093         NewParm = getDerived().TransformFunctionTypeParam(
5094             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5095       }
5096 
5097       if (!NewParm)
5098         return true;
5099 
5100       if (ParamInfos)
5101         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5102       OutParamTypes.push_back(NewParm->getType());
5103       if (PVars)
5104         PVars->push_back(NewParm);
5105       continue;
5106     }
5107 
5108     // Deal with the possibility that we don't have a parameter
5109     // declaration for this parameter.
5110     QualType OldType = ParamTypes[i];
5111     bool IsPackExpansion = false;
5112     Optional<unsigned> NumExpansions;
5113     QualType NewType;
5114     if (const PackExpansionType *Expansion
5115                                        = dyn_cast<PackExpansionType>(OldType)) {
5116       // We have a function parameter pack that may need to be expanded.
5117       QualType Pattern = Expansion->getPattern();
5118       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5119       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5120 
5121       // Determine whether we should expand the parameter packs.
5122       bool ShouldExpand = false;
5123       bool RetainExpansion = false;
5124       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5125                                                Unexpanded,
5126                                                ShouldExpand,
5127                                                RetainExpansion,
5128                                                NumExpansions)) {
5129         return true;
5130       }
5131 
5132       if (ShouldExpand) {
5133         // Expand the function parameter pack into multiple, separate
5134         // parameters.
5135         for (unsigned I = 0; I != *NumExpansions; ++I) {
5136           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5137           QualType NewType = getDerived().TransformType(Pattern);
5138           if (NewType.isNull())
5139             return true;
5140 
5141           if (NewType->containsUnexpandedParameterPack()) {
5142             NewType =
5143                 getSema().getASTContext().getPackExpansionType(NewType, None);
5144 
5145             if (NewType.isNull())
5146               return true;
5147           }
5148 
5149           if (ParamInfos)
5150             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5151           OutParamTypes.push_back(NewType);
5152           if (PVars)
5153             PVars->push_back(nullptr);
5154         }
5155 
5156         // We're done with the pack expansion.
5157         continue;
5158       }
5159 
5160       // If we're supposed to retain a pack expansion, do so by temporarily
5161       // forgetting the partially-substituted parameter pack.
5162       if (RetainExpansion) {
5163         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5164         QualType NewType = getDerived().TransformType(Pattern);
5165         if (NewType.isNull())
5166           return true;
5167 
5168         if (ParamInfos)
5169           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5170         OutParamTypes.push_back(NewType);
5171         if (PVars)
5172           PVars->push_back(nullptr);
5173       }
5174 
5175       // We'll substitute the parameter now without expanding the pack
5176       // expansion.
5177       OldType = Expansion->getPattern();
5178       IsPackExpansion = true;
5179       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5180       NewType = getDerived().TransformType(OldType);
5181     } else {
5182       NewType = getDerived().TransformType(OldType);
5183     }
5184 
5185     if (NewType.isNull())
5186       return true;
5187 
5188     if (IsPackExpansion)
5189       NewType = getSema().Context.getPackExpansionType(NewType,
5190                                                        NumExpansions);
5191 
5192     if (ParamInfos)
5193       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5194     OutParamTypes.push_back(NewType);
5195     if (PVars)
5196       PVars->push_back(nullptr);
5197   }
5198 
5199 #ifndef NDEBUG
5200   if (PVars) {
5201     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5202       if (ParmVarDecl *parm = (*PVars)[i])
5203         assert(parm->getFunctionScopeIndex() == i);
5204   }
5205 #endif
5206 
5207   return false;
5208 }
5209 
5210 template<typename Derived>
5211 QualType
5212 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5213                                                    FunctionProtoTypeLoc TL) {
5214   SmallVector<QualType, 4> ExceptionStorage;
5215   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5216   return getDerived().TransformFunctionProtoType(
5217       TLB, TL, nullptr, 0,
5218       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5219         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5220                                             ExceptionStorage, Changed);
5221       });
5222 }
5223 
5224 template<typename Derived> template<typename Fn>
5225 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5226     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5227     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
5228 
5229   // Transform the parameters and return type.
5230   //
5231   // We are required to instantiate the params and return type in source order.
5232   // When the function has a trailing return type, we instantiate the
5233   // parameters before the return type,  since the return type can then refer
5234   // to the parameters themselves (via decltype, sizeof, etc.).
5235   //
5236   SmallVector<QualType, 4> ParamTypes;
5237   SmallVector<ParmVarDecl*, 4> ParamDecls;
5238   Sema::ExtParameterInfoBuilder ExtParamInfos;
5239   const FunctionProtoType *T = TL.getTypePtr();
5240 
5241   QualType ResultType;
5242 
5243   if (T->hasTrailingReturn()) {
5244     if (getDerived().TransformFunctionTypeParams(
5245             TL.getBeginLoc(), TL.getParams(),
5246             TL.getTypePtr()->param_type_begin(),
5247             T->getExtParameterInfosOrNull(),
5248             ParamTypes, &ParamDecls, ExtParamInfos))
5249       return QualType();
5250 
5251     {
5252       // C++11 [expr.prim.general]p3:
5253       //   If a declaration declares a member function or member function
5254       //   template of a class X, the expression this is a prvalue of type
5255       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5256       //   and the end of the function-definition, member-declarator, or
5257       //   declarator.
5258       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5259 
5260       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5261       if (ResultType.isNull())
5262         return QualType();
5263     }
5264   }
5265   else {
5266     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5267     if (ResultType.isNull())
5268       return QualType();
5269 
5270     if (getDerived().TransformFunctionTypeParams(
5271             TL.getBeginLoc(), TL.getParams(),
5272             TL.getTypePtr()->param_type_begin(),
5273             T->getExtParameterInfosOrNull(),
5274             ParamTypes, &ParamDecls, ExtParamInfos))
5275       return QualType();
5276   }
5277 
5278   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5279 
5280   bool EPIChanged = false;
5281   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5282     return QualType();
5283 
5284   // Handle extended parameter information.
5285   if (auto NewExtParamInfos =
5286         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5287     if (!EPI.ExtParameterInfos ||
5288         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5289           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5290       EPIChanged = true;
5291     }
5292     EPI.ExtParameterInfos = NewExtParamInfos;
5293   } else if (EPI.ExtParameterInfos) {
5294     EPIChanged = true;
5295     EPI.ExtParameterInfos = nullptr;
5296   }
5297 
5298   QualType Result = TL.getType();
5299   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5300       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5301     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5302     if (Result.isNull())
5303       return QualType();
5304   }
5305 
5306   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5307   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5308   NewTL.setLParenLoc(TL.getLParenLoc());
5309   NewTL.setRParenLoc(TL.getRParenLoc());
5310   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5311   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5312   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5313     NewTL.setParam(i, ParamDecls[i]);
5314 
5315   return Result;
5316 }
5317 
5318 template<typename Derived>
5319 bool TreeTransform<Derived>::TransformExceptionSpec(
5320     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5321     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5322   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5323 
5324   // Instantiate a dynamic noexcept expression, if any.
5325   if (isComputedNoexcept(ESI.Type)) {
5326     EnterExpressionEvaluationContext Unevaluated(
5327         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5328     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5329     if (NoexceptExpr.isInvalid())
5330       return true;
5331 
5332     ExceptionSpecificationType EST = ESI.Type;
5333     NoexceptExpr =
5334         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5335     if (NoexceptExpr.isInvalid())
5336       return true;
5337 
5338     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5339       Changed = true;
5340     ESI.NoexceptExpr = NoexceptExpr.get();
5341     ESI.Type = EST;
5342   }
5343 
5344   if (ESI.Type != EST_Dynamic)
5345     return false;
5346 
5347   // Instantiate a dynamic exception specification's type.
5348   for (QualType T : ESI.Exceptions) {
5349     if (const PackExpansionType *PackExpansion =
5350             T->getAs<PackExpansionType>()) {
5351       Changed = true;
5352 
5353       // We have a pack expansion. Instantiate it.
5354       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5355       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5356                                               Unexpanded);
5357       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5358 
5359       // Determine whether the set of unexpanded parameter packs can and
5360       // should
5361       // be expanded.
5362       bool Expand = false;
5363       bool RetainExpansion = false;
5364       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5365       // FIXME: Track the location of the ellipsis (and track source location
5366       // information for the types in the exception specification in general).
5367       if (getDerived().TryExpandParameterPacks(
5368               Loc, SourceRange(), Unexpanded, Expand,
5369               RetainExpansion, NumExpansions))
5370         return true;
5371 
5372       if (!Expand) {
5373         // We can't expand this pack expansion into separate arguments yet;
5374         // just substitute into the pattern and create a new pack expansion
5375         // type.
5376         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5377         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5378         if (U.isNull())
5379           return true;
5380 
5381         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5382         Exceptions.push_back(U);
5383         continue;
5384       }
5385 
5386       // Substitute into the pack expansion pattern for each slice of the
5387       // pack.
5388       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5389         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5390 
5391         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5392         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5393           return true;
5394 
5395         Exceptions.push_back(U);
5396       }
5397     } else {
5398       QualType U = getDerived().TransformType(T);
5399       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5400         return true;
5401       if (T != U)
5402         Changed = true;
5403 
5404       Exceptions.push_back(U);
5405     }
5406   }
5407 
5408   ESI.Exceptions = Exceptions;
5409   if (ESI.Exceptions.empty())
5410     ESI.Type = EST_DynamicNone;
5411   return false;
5412 }
5413 
5414 template<typename Derived>
5415 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5416                                                  TypeLocBuilder &TLB,
5417                                                  FunctionNoProtoTypeLoc TL) {
5418   const FunctionNoProtoType *T = TL.getTypePtr();
5419   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5420   if (ResultType.isNull())
5421     return QualType();
5422 
5423   QualType Result = TL.getType();
5424   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5425     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5426 
5427   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5428   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5429   NewTL.setLParenLoc(TL.getLParenLoc());
5430   NewTL.setRParenLoc(TL.getRParenLoc());
5431   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5432 
5433   return Result;
5434 }
5435 
5436 template<typename Derived> QualType
5437 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5438                                                  UnresolvedUsingTypeLoc TL) {
5439   const UnresolvedUsingType *T = TL.getTypePtr();
5440   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5441   if (!D)
5442     return QualType();
5443 
5444   QualType Result = TL.getType();
5445   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5446     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5447     if (Result.isNull())
5448       return QualType();
5449   }
5450 
5451   // We might get an arbitrary type spec type back.  We should at
5452   // least always get a type spec type, though.
5453   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5454   NewTL.setNameLoc(TL.getNameLoc());
5455 
5456   return Result;
5457 }
5458 
5459 template<typename Derived>
5460 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5461                                                       TypedefTypeLoc TL) {
5462   const TypedefType *T = TL.getTypePtr();
5463   TypedefNameDecl *Typedef
5464     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5465                                                                T->getDecl()));
5466   if (!Typedef)
5467     return QualType();
5468 
5469   QualType Result = TL.getType();
5470   if (getDerived().AlwaysRebuild() ||
5471       Typedef != T->getDecl()) {
5472     Result = getDerived().RebuildTypedefType(Typedef);
5473     if (Result.isNull())
5474       return QualType();
5475   }
5476 
5477   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5478   NewTL.setNameLoc(TL.getNameLoc());
5479 
5480   return Result;
5481 }
5482 
5483 template<typename Derived>
5484 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5485                                                       TypeOfExprTypeLoc TL) {
5486   // typeof expressions are not potentially evaluated contexts
5487   EnterExpressionEvaluationContext Unevaluated(
5488       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5489       Sema::ReuseLambdaContextDecl);
5490 
5491   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5492   if (E.isInvalid())
5493     return QualType();
5494 
5495   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5496   if (E.isInvalid())
5497     return QualType();
5498 
5499   QualType Result = TL.getType();
5500   if (getDerived().AlwaysRebuild() ||
5501       E.get() != TL.getUnderlyingExpr()) {
5502     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5503     if (Result.isNull())
5504       return QualType();
5505   }
5506   else E.get();
5507 
5508   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5509   NewTL.setTypeofLoc(TL.getTypeofLoc());
5510   NewTL.setLParenLoc(TL.getLParenLoc());
5511   NewTL.setRParenLoc(TL.getRParenLoc());
5512 
5513   return Result;
5514 }
5515 
5516 template<typename Derived>
5517 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5518                                                      TypeOfTypeLoc TL) {
5519   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5520   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5521   if (!New_Under_TI)
5522     return QualType();
5523 
5524   QualType Result = TL.getType();
5525   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5526     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5527     if (Result.isNull())
5528       return QualType();
5529   }
5530 
5531   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5532   NewTL.setTypeofLoc(TL.getTypeofLoc());
5533   NewTL.setLParenLoc(TL.getLParenLoc());
5534   NewTL.setRParenLoc(TL.getRParenLoc());
5535   NewTL.setUnderlyingTInfo(New_Under_TI);
5536 
5537   return Result;
5538 }
5539 
5540 template<typename Derived>
5541 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5542                                                        DecltypeTypeLoc TL) {
5543   const DecltypeType *T = TL.getTypePtr();
5544 
5545   // decltype expressions are not potentially evaluated contexts
5546   EnterExpressionEvaluationContext Unevaluated(
5547       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5548       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5549 
5550   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5551   if (E.isInvalid())
5552     return QualType();
5553 
5554   E = getSema().ActOnDecltypeExpression(E.get());
5555   if (E.isInvalid())
5556     return QualType();
5557 
5558   QualType Result = TL.getType();
5559   if (getDerived().AlwaysRebuild() ||
5560       E.get() != T->getUnderlyingExpr()) {
5561     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5562     if (Result.isNull())
5563       return QualType();
5564   }
5565   else E.get();
5566 
5567   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5568   NewTL.setNameLoc(TL.getNameLoc());
5569 
5570   return Result;
5571 }
5572 
5573 template<typename Derived>
5574 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5575                                                             TypeLocBuilder &TLB,
5576                                                      UnaryTransformTypeLoc TL) {
5577   QualType Result = TL.getType();
5578   if (Result->isDependentType()) {
5579     const UnaryTransformType *T = TL.getTypePtr();
5580     QualType NewBase =
5581       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5582     Result = getDerived().RebuildUnaryTransformType(NewBase,
5583                                                     T->getUTTKind(),
5584                                                     TL.getKWLoc());
5585     if (Result.isNull())
5586       return QualType();
5587   }
5588 
5589   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5590   NewTL.setKWLoc(TL.getKWLoc());
5591   NewTL.setParensRange(TL.getParensRange());
5592   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5593   return Result;
5594 }
5595 
5596 template<typename Derived>
5597 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5598                                                    AutoTypeLoc TL) {
5599   const AutoType *T = TL.getTypePtr();
5600   QualType OldDeduced = T->getDeducedType();
5601   QualType NewDeduced;
5602   if (!OldDeduced.isNull()) {
5603     NewDeduced = getDerived().TransformType(OldDeduced);
5604     if (NewDeduced.isNull())
5605       return QualType();
5606   }
5607 
5608   QualType Result = TL.getType();
5609   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5610       T->isDependentType()) {
5611     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5612     if (Result.isNull())
5613       return QualType();
5614   }
5615 
5616   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5617   NewTL.setNameLoc(TL.getNameLoc());
5618 
5619   return Result;
5620 }
5621 
5622 template<typename Derived>
5623 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5624     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5625   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5626 
5627   CXXScopeSpec SS;
5628   TemplateName TemplateName = getDerived().TransformTemplateName(
5629       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5630   if (TemplateName.isNull())
5631     return QualType();
5632 
5633   QualType OldDeduced = T->getDeducedType();
5634   QualType NewDeduced;
5635   if (!OldDeduced.isNull()) {
5636     NewDeduced = getDerived().TransformType(OldDeduced);
5637     if (NewDeduced.isNull())
5638       return QualType();
5639   }
5640 
5641   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5642       TemplateName, NewDeduced);
5643   if (Result.isNull())
5644     return QualType();
5645 
5646   DeducedTemplateSpecializationTypeLoc NewTL =
5647       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5648   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5649 
5650   return Result;
5651 }
5652 
5653 template<typename Derived>
5654 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5655                                                      RecordTypeLoc TL) {
5656   const RecordType *T = TL.getTypePtr();
5657   RecordDecl *Record
5658     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5659                                                           T->getDecl()));
5660   if (!Record)
5661     return QualType();
5662 
5663   QualType Result = TL.getType();
5664   if (getDerived().AlwaysRebuild() ||
5665       Record != T->getDecl()) {
5666     Result = getDerived().RebuildRecordType(Record);
5667     if (Result.isNull())
5668       return QualType();
5669   }
5670 
5671   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5672   NewTL.setNameLoc(TL.getNameLoc());
5673 
5674   return Result;
5675 }
5676 
5677 template<typename Derived>
5678 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5679                                                    EnumTypeLoc TL) {
5680   const EnumType *T = TL.getTypePtr();
5681   EnumDecl *Enum
5682     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5683                                                         T->getDecl()));
5684   if (!Enum)
5685     return QualType();
5686 
5687   QualType Result = TL.getType();
5688   if (getDerived().AlwaysRebuild() ||
5689       Enum != T->getDecl()) {
5690     Result = getDerived().RebuildEnumType(Enum);
5691     if (Result.isNull())
5692       return QualType();
5693   }
5694 
5695   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5696   NewTL.setNameLoc(TL.getNameLoc());
5697 
5698   return Result;
5699 }
5700 
5701 template<typename Derived>
5702 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5703                                          TypeLocBuilder &TLB,
5704                                          InjectedClassNameTypeLoc TL) {
5705   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5706                                        TL.getTypePtr()->getDecl());
5707   if (!D) return QualType();
5708 
5709   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5710   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5711   return T;
5712 }
5713 
5714 template<typename Derived>
5715 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5716                                                 TypeLocBuilder &TLB,
5717                                                 TemplateTypeParmTypeLoc TL) {
5718   return TransformTypeSpecType(TLB, TL);
5719 }
5720 
5721 template<typename Derived>
5722 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5723                                          TypeLocBuilder &TLB,
5724                                          SubstTemplateTypeParmTypeLoc TL) {
5725   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5726 
5727   // Substitute into the replacement type, which itself might involve something
5728   // that needs to be transformed. This only tends to occur with default
5729   // template arguments of template template parameters.
5730   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5731   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5732   if (Replacement.isNull())
5733     return QualType();
5734 
5735   // Always canonicalize the replacement type.
5736   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5737   QualType Result
5738     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5739                                                    Replacement);
5740 
5741   // Propagate type-source information.
5742   SubstTemplateTypeParmTypeLoc NewTL
5743     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5744   NewTL.setNameLoc(TL.getNameLoc());
5745   return Result;
5746 
5747 }
5748 
5749 template<typename Derived>
5750 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5751                                           TypeLocBuilder &TLB,
5752                                           SubstTemplateTypeParmPackTypeLoc TL) {
5753   return TransformTypeSpecType(TLB, TL);
5754 }
5755 
5756 template<typename Derived>
5757 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5758                                                         TypeLocBuilder &TLB,
5759                                            TemplateSpecializationTypeLoc TL) {
5760   const TemplateSpecializationType *T = TL.getTypePtr();
5761 
5762   // The nested-name-specifier never matters in a TemplateSpecializationType,
5763   // because we can't have a dependent nested-name-specifier anyway.
5764   CXXScopeSpec SS;
5765   TemplateName Template
5766     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5767                                          TL.getTemplateNameLoc());
5768   if (Template.isNull())
5769     return QualType();
5770 
5771   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5772 }
5773 
5774 template<typename Derived>
5775 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5776                                                      AtomicTypeLoc TL) {
5777   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5778   if (ValueType.isNull())
5779     return QualType();
5780 
5781   QualType Result = TL.getType();
5782   if (getDerived().AlwaysRebuild() ||
5783       ValueType != TL.getValueLoc().getType()) {
5784     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5785     if (Result.isNull())
5786       return QualType();
5787   }
5788 
5789   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5790   NewTL.setKWLoc(TL.getKWLoc());
5791   NewTL.setLParenLoc(TL.getLParenLoc());
5792   NewTL.setRParenLoc(TL.getRParenLoc());
5793 
5794   return Result;
5795 }
5796 
5797 template <typename Derived>
5798 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5799                                                    PipeTypeLoc TL) {
5800   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5801   if (ValueType.isNull())
5802     return QualType();
5803 
5804   QualType Result = TL.getType();
5805   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5806     const PipeType *PT = Result->getAs<PipeType>();
5807     bool isReadPipe = PT->isReadOnly();
5808     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5809     if (Result.isNull())
5810       return QualType();
5811   }
5812 
5813   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5814   NewTL.setKWLoc(TL.getKWLoc());
5815 
5816   return Result;
5817 }
5818 
5819   /// Simple iterator that traverses the template arguments in a
5820   /// container that provides a \c getArgLoc() member function.
5821   ///
5822   /// This iterator is intended to be used with the iterator form of
5823   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5824   template<typename ArgLocContainer>
5825   class TemplateArgumentLocContainerIterator {
5826     ArgLocContainer *Container;
5827     unsigned Index;
5828 
5829   public:
5830     typedef TemplateArgumentLoc value_type;
5831     typedef TemplateArgumentLoc reference;
5832     typedef int difference_type;
5833     typedef std::input_iterator_tag iterator_category;
5834 
5835     class pointer {
5836       TemplateArgumentLoc Arg;
5837 
5838     public:
5839       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5840 
5841       const TemplateArgumentLoc *operator->() const {
5842         return &Arg;
5843       }
5844     };
5845 
5846 
5847     TemplateArgumentLocContainerIterator() {}
5848 
5849     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5850                                  unsigned Index)
5851       : Container(&Container), Index(Index) { }
5852 
5853     TemplateArgumentLocContainerIterator &operator++() {
5854       ++Index;
5855       return *this;
5856     }
5857 
5858     TemplateArgumentLocContainerIterator operator++(int) {
5859       TemplateArgumentLocContainerIterator Old(*this);
5860       ++(*this);
5861       return Old;
5862     }
5863 
5864     TemplateArgumentLoc operator*() const {
5865       return Container->getArgLoc(Index);
5866     }
5867 
5868     pointer operator->() const {
5869       return pointer(Container->getArgLoc(Index));
5870     }
5871 
5872     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5873                            const TemplateArgumentLocContainerIterator &Y) {
5874       return X.Container == Y.Container && X.Index == Y.Index;
5875     }
5876 
5877     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5878                            const TemplateArgumentLocContainerIterator &Y) {
5879       return !(X == Y);
5880     }
5881   };
5882 
5883 
5884 template <typename Derived>
5885 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5886                                                         TypeLocBuilder &TLB,
5887                                            TemplateSpecializationTypeLoc TL,
5888                                                       TemplateName Template) {
5889   TemplateArgumentListInfo NewTemplateArgs;
5890   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5891   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5892   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5893     ArgIterator;
5894   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5895                                               ArgIterator(TL, TL.getNumArgs()),
5896                                               NewTemplateArgs))
5897     return QualType();
5898 
5899   // FIXME: maybe don't rebuild if all the template arguments are the same.
5900 
5901   QualType Result =
5902     getDerived().RebuildTemplateSpecializationType(Template,
5903                                                    TL.getTemplateNameLoc(),
5904                                                    NewTemplateArgs);
5905 
5906   if (!Result.isNull()) {
5907     // Specializations of template template parameters are represented as
5908     // TemplateSpecializationTypes, and substitution of type alias templates
5909     // within a dependent context can transform them into
5910     // DependentTemplateSpecializationTypes.
5911     if (isa<DependentTemplateSpecializationType>(Result)) {
5912       DependentTemplateSpecializationTypeLoc NewTL
5913         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5914       NewTL.setElaboratedKeywordLoc(SourceLocation());
5915       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5916       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5917       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5918       NewTL.setLAngleLoc(TL.getLAngleLoc());
5919       NewTL.setRAngleLoc(TL.getRAngleLoc());
5920       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5921         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5922       return Result;
5923     }
5924 
5925     TemplateSpecializationTypeLoc NewTL
5926       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5927     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5928     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5929     NewTL.setLAngleLoc(TL.getLAngleLoc());
5930     NewTL.setRAngleLoc(TL.getRAngleLoc());
5931     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5932       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5933   }
5934 
5935   return Result;
5936 }
5937 
5938 template <typename Derived>
5939 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5940                                      TypeLocBuilder &TLB,
5941                                      DependentTemplateSpecializationTypeLoc TL,
5942                                      TemplateName Template,
5943                                      CXXScopeSpec &SS) {
5944   TemplateArgumentListInfo NewTemplateArgs;
5945   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5946   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5947   typedef TemplateArgumentLocContainerIterator<
5948             DependentTemplateSpecializationTypeLoc> ArgIterator;
5949   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5950                                               ArgIterator(TL, TL.getNumArgs()),
5951                                               NewTemplateArgs))
5952     return QualType();
5953 
5954   // FIXME: maybe don't rebuild if all the template arguments are the same.
5955 
5956   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5957     QualType Result
5958       = getSema().Context.getDependentTemplateSpecializationType(
5959                                                 TL.getTypePtr()->getKeyword(),
5960                                                          DTN->getQualifier(),
5961                                                          DTN->getIdentifier(),
5962                                                                NewTemplateArgs);
5963 
5964     DependentTemplateSpecializationTypeLoc NewTL
5965       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5966     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5967     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5968     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5969     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5970     NewTL.setLAngleLoc(TL.getLAngleLoc());
5971     NewTL.setRAngleLoc(TL.getRAngleLoc());
5972     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5973       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5974     return Result;
5975   }
5976 
5977   QualType Result
5978     = getDerived().RebuildTemplateSpecializationType(Template,
5979                                                      TL.getTemplateNameLoc(),
5980                                                      NewTemplateArgs);
5981 
5982   if (!Result.isNull()) {
5983     /// FIXME: Wrap this in an elaborated-type-specifier?
5984     TemplateSpecializationTypeLoc NewTL
5985       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5986     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5987     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5988     NewTL.setLAngleLoc(TL.getLAngleLoc());
5989     NewTL.setRAngleLoc(TL.getRAngleLoc());
5990     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5991       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5992   }
5993 
5994   return Result;
5995 }
5996 
5997 template<typename Derived>
5998 QualType
5999 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6000                                                 ElaboratedTypeLoc TL) {
6001   const ElaboratedType *T = TL.getTypePtr();
6002 
6003   NestedNameSpecifierLoc QualifierLoc;
6004   // NOTE: the qualifier in an ElaboratedType is optional.
6005   if (TL.getQualifierLoc()) {
6006     QualifierLoc
6007       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6008     if (!QualifierLoc)
6009       return QualType();
6010   }
6011 
6012   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6013   if (NamedT.isNull())
6014     return QualType();
6015 
6016   // C++0x [dcl.type.elab]p2:
6017   //   If the identifier resolves to a typedef-name or the simple-template-id
6018   //   resolves to an alias template specialization, the
6019   //   elaborated-type-specifier is ill-formed.
6020   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6021     if (const TemplateSpecializationType *TST =
6022           NamedT->getAs<TemplateSpecializationType>()) {
6023       TemplateName Template = TST->getTemplateName();
6024       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6025               Template.getAsTemplateDecl())) {
6026         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6027                      diag::err_tag_reference_non_tag)
6028             << TAT << Sema::NTK_TypeAliasTemplate
6029             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6030         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6031       }
6032     }
6033   }
6034 
6035   QualType Result = TL.getType();
6036   if (getDerived().AlwaysRebuild() ||
6037       QualifierLoc != TL.getQualifierLoc() ||
6038       NamedT != T->getNamedType()) {
6039     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6040                                                 T->getKeyword(),
6041                                                 QualifierLoc, NamedT);
6042     if (Result.isNull())
6043       return QualType();
6044   }
6045 
6046   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6047   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6048   NewTL.setQualifierLoc(QualifierLoc);
6049   return Result;
6050 }
6051 
6052 template<typename Derived>
6053 QualType TreeTransform<Derived>::TransformAttributedType(
6054                                                 TypeLocBuilder &TLB,
6055                                                 AttributedTypeLoc TL) {
6056   const AttributedType *oldType = TL.getTypePtr();
6057   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6058   if (modifiedType.isNull())
6059     return QualType();
6060 
6061   QualType result = TL.getType();
6062 
6063   // FIXME: dependent operand expressions?
6064   if (getDerived().AlwaysRebuild() ||
6065       modifiedType != oldType->getModifiedType()) {
6066     // TODO: this is really lame; we should really be rebuilding the
6067     // equivalent type from first principles.
6068     QualType equivalentType
6069       = getDerived().TransformType(oldType->getEquivalentType());
6070     if (equivalentType.isNull())
6071       return QualType();
6072 
6073     // Check whether we can add nullability; it is only represented as
6074     // type sugar, and therefore cannot be diagnosed in any other way.
6075     if (auto nullability = oldType->getImmediateNullability()) {
6076       if (!modifiedType->canHaveNullability()) {
6077         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
6078           << DiagNullabilityKind(*nullability, false) << modifiedType;
6079         return QualType();
6080       }
6081     }
6082 
6083     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
6084                                                modifiedType,
6085                                                equivalentType);
6086   }
6087 
6088   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6089   newTL.setAttrNameLoc(TL.getAttrNameLoc());
6090   if (TL.hasAttrOperand())
6091     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
6092   if (TL.hasAttrExprOperand())
6093     newTL.setAttrExprOperand(TL.getAttrExprOperand());
6094   else if (TL.hasAttrEnumOperand())
6095     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
6096 
6097   return result;
6098 }
6099 
6100 template<typename Derived>
6101 QualType
6102 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6103                                            ParenTypeLoc TL) {
6104   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6105   if (Inner.isNull())
6106     return QualType();
6107 
6108   QualType Result = TL.getType();
6109   if (getDerived().AlwaysRebuild() ||
6110       Inner != TL.getInnerLoc().getType()) {
6111     Result = getDerived().RebuildParenType(Inner);
6112     if (Result.isNull())
6113       return QualType();
6114   }
6115 
6116   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6117   NewTL.setLParenLoc(TL.getLParenLoc());
6118   NewTL.setRParenLoc(TL.getRParenLoc());
6119   return Result;
6120 }
6121 
6122 template<typename Derived>
6123 QualType TreeTransform<Derived>::TransformDependentNameType(
6124     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6125   return TransformDependentNameType(TLB, TL, false);
6126 }
6127 
6128 template<typename Derived>
6129 QualType TreeTransform<Derived>::TransformDependentNameType(
6130     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6131   const DependentNameType *T = TL.getTypePtr();
6132 
6133   NestedNameSpecifierLoc QualifierLoc
6134     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6135   if (!QualifierLoc)
6136     return QualType();
6137 
6138   QualType Result
6139     = getDerived().RebuildDependentNameType(T->getKeyword(),
6140                                             TL.getElaboratedKeywordLoc(),
6141                                             QualifierLoc,
6142                                             T->getIdentifier(),
6143                                             TL.getNameLoc(),
6144                                             DeducedTSTContext);
6145   if (Result.isNull())
6146     return QualType();
6147 
6148   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6149     QualType NamedT = ElabT->getNamedType();
6150     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6151 
6152     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6153     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6154     NewTL.setQualifierLoc(QualifierLoc);
6155   } else {
6156     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6157     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6158     NewTL.setQualifierLoc(QualifierLoc);
6159     NewTL.setNameLoc(TL.getNameLoc());
6160   }
6161   return Result;
6162 }
6163 
6164 template<typename Derived>
6165 QualType TreeTransform<Derived>::
6166           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6167                                  DependentTemplateSpecializationTypeLoc TL) {
6168   NestedNameSpecifierLoc QualifierLoc;
6169   if (TL.getQualifierLoc()) {
6170     QualifierLoc
6171       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6172     if (!QualifierLoc)
6173       return QualType();
6174   }
6175 
6176   return getDerived()
6177            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6178 }
6179 
6180 template<typename Derived>
6181 QualType TreeTransform<Derived>::
6182 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6183                                    DependentTemplateSpecializationTypeLoc TL,
6184                                        NestedNameSpecifierLoc QualifierLoc) {
6185   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6186 
6187   TemplateArgumentListInfo NewTemplateArgs;
6188   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6189   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6190 
6191   typedef TemplateArgumentLocContainerIterator<
6192   DependentTemplateSpecializationTypeLoc> ArgIterator;
6193   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6194                                               ArgIterator(TL, TL.getNumArgs()),
6195                                               NewTemplateArgs))
6196     return QualType();
6197 
6198   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6199       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6200       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6201       /*AllowInjectedClassName*/ false);
6202   if (Result.isNull())
6203     return QualType();
6204 
6205   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6206     QualType NamedT = ElabT->getNamedType();
6207 
6208     // Copy information relevant to the template specialization.
6209     TemplateSpecializationTypeLoc NamedTL
6210       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6211     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6212     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6213     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6214     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6215     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6216       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6217 
6218     // Copy information relevant to the elaborated type.
6219     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6220     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6221     NewTL.setQualifierLoc(QualifierLoc);
6222   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6223     DependentTemplateSpecializationTypeLoc SpecTL
6224       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6225     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6226     SpecTL.setQualifierLoc(QualifierLoc);
6227     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6228     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6229     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6230     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6231     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6232       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6233   } else {
6234     TemplateSpecializationTypeLoc SpecTL
6235       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6236     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6237     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6238     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6239     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6240     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6241       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6242   }
6243   return Result;
6244 }
6245 
6246 template<typename Derived>
6247 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6248                                                       PackExpansionTypeLoc TL) {
6249   QualType Pattern
6250     = getDerived().TransformType(TLB, TL.getPatternLoc());
6251   if (Pattern.isNull())
6252     return QualType();
6253 
6254   QualType Result = TL.getType();
6255   if (getDerived().AlwaysRebuild() ||
6256       Pattern != TL.getPatternLoc().getType()) {
6257     Result = getDerived().RebuildPackExpansionType(Pattern,
6258                                            TL.getPatternLoc().getSourceRange(),
6259                                                    TL.getEllipsisLoc(),
6260                                            TL.getTypePtr()->getNumExpansions());
6261     if (Result.isNull())
6262       return QualType();
6263   }
6264 
6265   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6266   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6267   return Result;
6268 }
6269 
6270 template<typename Derived>
6271 QualType
6272 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6273                                                    ObjCInterfaceTypeLoc TL) {
6274   // ObjCInterfaceType is never dependent.
6275   TLB.pushFullCopy(TL);
6276   return TL.getType();
6277 }
6278 
6279 template<typename Derived>
6280 QualType
6281 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6282                                                    ObjCTypeParamTypeLoc TL) {
6283   const ObjCTypeParamType *T = TL.getTypePtr();
6284   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6285       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6286   if (!OTP)
6287     return QualType();
6288 
6289   QualType Result = TL.getType();
6290   if (getDerived().AlwaysRebuild() ||
6291       OTP != T->getDecl()) {
6292     Result = getDerived().RebuildObjCTypeParamType(OTP,
6293                  TL.getProtocolLAngleLoc(),
6294                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6295                                     TL.getNumProtocols()),
6296                  TL.getProtocolLocs(),
6297                  TL.getProtocolRAngleLoc());
6298     if (Result.isNull())
6299       return QualType();
6300   }
6301 
6302   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6303   if (TL.getNumProtocols()) {
6304     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6305     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6306       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6307     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6308   }
6309   return Result;
6310 }
6311 
6312 template<typename Derived>
6313 QualType
6314 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6315                                                 ObjCObjectTypeLoc TL) {
6316   // Transform base type.
6317   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6318   if (BaseType.isNull())
6319     return QualType();
6320 
6321   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6322 
6323   // Transform type arguments.
6324   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6325   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6326     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6327     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6328     QualType TypeArg = TypeArgInfo->getType();
6329     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6330       AnyChanged = true;
6331 
6332       // We have a pack expansion. Instantiate it.
6333       const auto *PackExpansion = PackExpansionLoc.getType()
6334                                     ->castAs<PackExpansionType>();
6335       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6336       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6337                                               Unexpanded);
6338       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6339 
6340       // Determine whether the set of unexpanded parameter packs can
6341       // and should be expanded.
6342       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6343       bool Expand = false;
6344       bool RetainExpansion = false;
6345       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6346       if (getDerived().TryExpandParameterPacks(
6347             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6348             Unexpanded, Expand, RetainExpansion, NumExpansions))
6349         return QualType();
6350 
6351       if (!Expand) {
6352         // We can't expand this pack expansion into separate arguments yet;
6353         // just substitute into the pattern and create a new pack expansion
6354         // type.
6355         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6356 
6357         TypeLocBuilder TypeArgBuilder;
6358         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6359         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6360                                                              PatternLoc);
6361         if (NewPatternType.isNull())
6362           return QualType();
6363 
6364         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6365                                       NewPatternType, NumExpansions);
6366         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6367         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6368         NewTypeArgInfos.push_back(
6369           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6370         continue;
6371       }
6372 
6373       // Substitute into the pack expansion pattern for each slice of the
6374       // pack.
6375       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6376         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6377 
6378         TypeLocBuilder TypeArgBuilder;
6379         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6380 
6381         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6382                                                          PatternLoc);
6383         if (NewTypeArg.isNull())
6384           return QualType();
6385 
6386         NewTypeArgInfos.push_back(
6387           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6388       }
6389 
6390       continue;
6391     }
6392 
6393     TypeLocBuilder TypeArgBuilder;
6394     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6395     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6396     if (NewTypeArg.isNull())
6397       return QualType();
6398 
6399     // If nothing changed, just keep the old TypeSourceInfo.
6400     if (NewTypeArg == TypeArg) {
6401       NewTypeArgInfos.push_back(TypeArgInfo);
6402       continue;
6403     }
6404 
6405     NewTypeArgInfos.push_back(
6406       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6407     AnyChanged = true;
6408   }
6409 
6410   QualType Result = TL.getType();
6411   if (getDerived().AlwaysRebuild() || AnyChanged) {
6412     // Rebuild the type.
6413     Result = getDerived().RebuildObjCObjectType(
6414         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6415         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6416         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6417         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6418 
6419     if (Result.isNull())
6420       return QualType();
6421   }
6422 
6423   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6424   NewT.setHasBaseTypeAsWritten(true);
6425   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6426   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6427     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6428   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6429   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6430   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6431     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6432   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6433   return Result;
6434 }
6435 
6436 template<typename Derived>
6437 QualType
6438 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6439                                                ObjCObjectPointerTypeLoc TL) {
6440   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6441   if (PointeeType.isNull())
6442     return QualType();
6443 
6444   QualType Result = TL.getType();
6445   if (getDerived().AlwaysRebuild() ||
6446       PointeeType != TL.getPointeeLoc().getType()) {
6447     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6448                                                        TL.getStarLoc());
6449     if (Result.isNull())
6450       return QualType();
6451   }
6452 
6453   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6454   NewT.setStarLoc(TL.getStarLoc());
6455   return Result;
6456 }
6457 
6458 //===----------------------------------------------------------------------===//
6459 // Statement transformation
6460 //===----------------------------------------------------------------------===//
6461 template<typename Derived>
6462 StmtResult
6463 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6464   return S;
6465 }
6466 
6467 template<typename Derived>
6468 StmtResult
6469 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6470   return getDerived().TransformCompoundStmt(S, false);
6471 }
6472 
6473 template<typename Derived>
6474 StmtResult
6475 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6476                                               bool IsStmtExpr) {
6477   Sema::CompoundScopeRAII CompoundScope(getSema());
6478 
6479   bool SubStmtInvalid = false;
6480   bool SubStmtChanged = false;
6481   SmallVector<Stmt*, 8> Statements;
6482   for (auto *B : S->body()) {
6483     StmtResult Result = getDerived().TransformStmt(B);
6484     if (Result.isInvalid()) {
6485       // Immediately fail if this was a DeclStmt, since it's very
6486       // likely that this will cause problems for future statements.
6487       if (isa<DeclStmt>(B))
6488         return StmtError();
6489 
6490       // Otherwise, just keep processing substatements and fail later.
6491       SubStmtInvalid = true;
6492       continue;
6493     }
6494 
6495     SubStmtChanged = SubStmtChanged || Result.get() != B;
6496     Statements.push_back(Result.getAs<Stmt>());
6497   }
6498 
6499   if (SubStmtInvalid)
6500     return StmtError();
6501 
6502   if (!getDerived().AlwaysRebuild() &&
6503       !SubStmtChanged)
6504     return S;
6505 
6506   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6507                                           Statements,
6508                                           S->getRBracLoc(),
6509                                           IsStmtExpr);
6510 }
6511 
6512 template<typename Derived>
6513 StmtResult
6514 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6515   ExprResult LHS, RHS;
6516   {
6517     EnterExpressionEvaluationContext Unevaluated(
6518         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6519 
6520     // Transform the left-hand case value.
6521     LHS = getDerived().TransformExpr(S->getLHS());
6522     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6523     if (LHS.isInvalid())
6524       return StmtError();
6525 
6526     // Transform the right-hand case value (for the GNU case-range extension).
6527     RHS = getDerived().TransformExpr(S->getRHS());
6528     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6529     if (RHS.isInvalid())
6530       return StmtError();
6531   }
6532 
6533   // Build the case statement.
6534   // Case statements are always rebuilt so that they will attached to their
6535   // transformed switch statement.
6536   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6537                                                        LHS.get(),
6538                                                        S->getEllipsisLoc(),
6539                                                        RHS.get(),
6540                                                        S->getColonLoc());
6541   if (Case.isInvalid())
6542     return StmtError();
6543 
6544   // Transform the statement following the case
6545   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6546   if (SubStmt.isInvalid())
6547     return StmtError();
6548 
6549   // Attach the body to the case statement
6550   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6551 }
6552 
6553 template<typename Derived>
6554 StmtResult
6555 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6556   // Transform the statement following the default case
6557   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6558   if (SubStmt.isInvalid())
6559     return StmtError();
6560 
6561   // Default statements are always rebuilt
6562   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6563                                          SubStmt.get());
6564 }
6565 
6566 template<typename Derived>
6567 StmtResult
6568 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6569   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6570   if (SubStmt.isInvalid())
6571     return StmtError();
6572 
6573   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6574                                         S->getDecl());
6575   if (!LD)
6576     return StmtError();
6577 
6578 
6579   // FIXME: Pass the real colon location in.
6580   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6581                                        cast<LabelDecl>(LD), SourceLocation(),
6582                                        SubStmt.get());
6583 }
6584 
6585 template <typename Derived>
6586 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6587   if (!R)
6588     return R;
6589 
6590   switch (R->getKind()) {
6591 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6592 #define ATTR(X)
6593 #define PRAGMA_SPELLING_ATTR(X)                                                \
6594   case attr::X:                                                                \
6595     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6596 #include "clang/Basic/AttrList.inc"
6597   default:
6598     return R;
6599   }
6600 }
6601 
6602 template <typename Derived>
6603 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6604   bool AttrsChanged = false;
6605   SmallVector<const Attr *, 1> Attrs;
6606 
6607   // Visit attributes and keep track if any are transformed.
6608   for (const auto *I : S->getAttrs()) {
6609     const Attr *R = getDerived().TransformAttr(I);
6610     AttrsChanged |= (I != R);
6611     Attrs.push_back(R);
6612   }
6613 
6614   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6615   if (SubStmt.isInvalid())
6616     return StmtError();
6617 
6618   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6619     return S;
6620 
6621   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6622                                             SubStmt.get());
6623 }
6624 
6625 template<typename Derived>
6626 StmtResult
6627 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6628   // Transform the initialization statement
6629   StmtResult Init = getDerived().TransformStmt(S->getInit());
6630   if (Init.isInvalid())
6631     return StmtError();
6632 
6633   // Transform the condition
6634   Sema::ConditionResult Cond = getDerived().TransformCondition(
6635       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6636       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6637                        : Sema::ConditionKind::Boolean);
6638   if (Cond.isInvalid())
6639     return StmtError();
6640 
6641   // If this is a constexpr if, determine which arm we should instantiate.
6642   llvm::Optional<bool> ConstexprConditionValue;
6643   if (S->isConstexpr())
6644     ConstexprConditionValue = Cond.getKnownValue();
6645 
6646   // Transform the "then" branch.
6647   StmtResult Then;
6648   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6649     Then = getDerived().TransformStmt(S->getThen());
6650     if (Then.isInvalid())
6651       return StmtError();
6652   } else {
6653     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6654   }
6655 
6656   // Transform the "else" branch.
6657   StmtResult Else;
6658   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6659     Else = getDerived().TransformStmt(S->getElse());
6660     if (Else.isInvalid())
6661       return StmtError();
6662   }
6663 
6664   if (!getDerived().AlwaysRebuild() &&
6665       Init.get() == S->getInit() &&
6666       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6667       Then.get() == S->getThen() &&
6668       Else.get() == S->getElse())
6669     return S;
6670 
6671   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6672                                     Init.get(), Then.get(), S->getElseLoc(),
6673                                     Else.get());
6674 }
6675 
6676 template<typename Derived>
6677 StmtResult
6678 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6679   // Transform the initialization statement
6680   StmtResult Init = getDerived().TransformStmt(S->getInit());
6681   if (Init.isInvalid())
6682     return StmtError();
6683 
6684   // Transform the condition.
6685   Sema::ConditionResult Cond = getDerived().TransformCondition(
6686       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6687       Sema::ConditionKind::Switch);
6688   if (Cond.isInvalid())
6689     return StmtError();
6690 
6691   // Rebuild the switch statement.
6692   StmtResult Switch
6693     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
6694   if (Switch.isInvalid())
6695     return StmtError();
6696 
6697   // Transform the body of the switch statement.
6698   StmtResult Body = getDerived().TransformStmt(S->getBody());
6699   if (Body.isInvalid())
6700     return StmtError();
6701 
6702   // Complete the switch statement.
6703   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6704                                             Body.get());
6705 }
6706 
6707 template<typename Derived>
6708 StmtResult
6709 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6710   // Transform the condition
6711   Sema::ConditionResult Cond = getDerived().TransformCondition(
6712       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6713       Sema::ConditionKind::Boolean);
6714   if (Cond.isInvalid())
6715     return StmtError();
6716 
6717   // Transform the body
6718   StmtResult Body = getDerived().TransformStmt(S->getBody());
6719   if (Body.isInvalid())
6720     return StmtError();
6721 
6722   if (!getDerived().AlwaysRebuild() &&
6723       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6724       Body.get() == S->getBody())
6725     return Owned(S);
6726 
6727   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6728 }
6729 
6730 template<typename Derived>
6731 StmtResult
6732 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6733   // Transform the body
6734   StmtResult Body = getDerived().TransformStmt(S->getBody());
6735   if (Body.isInvalid())
6736     return StmtError();
6737 
6738   // Transform the condition
6739   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6740   if (Cond.isInvalid())
6741     return StmtError();
6742 
6743   if (!getDerived().AlwaysRebuild() &&
6744       Cond.get() == S->getCond() &&
6745       Body.get() == S->getBody())
6746     return S;
6747 
6748   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6749                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6750                                     S->getRParenLoc());
6751 }
6752 
6753 template<typename Derived>
6754 StmtResult
6755 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6756   // Transform the initialization statement
6757   StmtResult Init = getDerived().TransformStmt(S->getInit());
6758   if (Init.isInvalid())
6759     return StmtError();
6760 
6761   // In OpenMP loop region loop control variable must be captured and be
6762   // private. Perform analysis of first part (if any).
6763   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6764     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6765 
6766   // Transform the condition
6767   Sema::ConditionResult Cond = getDerived().TransformCondition(
6768       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6769       Sema::ConditionKind::Boolean);
6770   if (Cond.isInvalid())
6771     return StmtError();
6772 
6773   // Transform the increment
6774   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6775   if (Inc.isInvalid())
6776     return StmtError();
6777 
6778   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6779   if (S->getInc() && !FullInc.get())
6780     return StmtError();
6781 
6782   // Transform the body
6783   StmtResult Body = getDerived().TransformStmt(S->getBody());
6784   if (Body.isInvalid())
6785     return StmtError();
6786 
6787   if (!getDerived().AlwaysRebuild() &&
6788       Init.get() == S->getInit() &&
6789       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6790       Inc.get() == S->getInc() &&
6791       Body.get() == S->getBody())
6792     return S;
6793 
6794   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6795                                      Init.get(), Cond, FullInc,
6796                                      S->getRParenLoc(), Body.get());
6797 }
6798 
6799 template<typename Derived>
6800 StmtResult
6801 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6802   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6803                                         S->getLabel());
6804   if (!LD)
6805     return StmtError();
6806 
6807   // Goto statements must always be rebuilt, to resolve the label.
6808   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6809                                       cast<LabelDecl>(LD));
6810 }
6811 
6812 template<typename Derived>
6813 StmtResult
6814 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6815   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6816   if (Target.isInvalid())
6817     return StmtError();
6818   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6819 
6820   if (!getDerived().AlwaysRebuild() &&
6821       Target.get() == S->getTarget())
6822     return S;
6823 
6824   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6825                                               Target.get());
6826 }
6827 
6828 template<typename Derived>
6829 StmtResult
6830 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6831   return S;
6832 }
6833 
6834 template<typename Derived>
6835 StmtResult
6836 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6837   return S;
6838 }
6839 
6840 template<typename Derived>
6841 StmtResult
6842 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6843   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6844                                                         /*NotCopyInit*/false);
6845   if (Result.isInvalid())
6846     return StmtError();
6847 
6848   // FIXME: We always rebuild the return statement because there is no way
6849   // to tell whether the return type of the function has changed.
6850   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6851 }
6852 
6853 template<typename Derived>
6854 StmtResult
6855 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6856   bool DeclChanged = false;
6857   SmallVector<Decl *, 4> Decls;
6858   for (auto *D : S->decls()) {
6859     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6860     if (!Transformed)
6861       return StmtError();
6862 
6863     if (Transformed != D)
6864       DeclChanged = true;
6865 
6866     Decls.push_back(Transformed);
6867   }
6868 
6869   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6870     return S;
6871 
6872   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
6873 }
6874 
6875 template<typename Derived>
6876 StmtResult
6877 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6878 
6879   SmallVector<Expr*, 8> Constraints;
6880   SmallVector<Expr*, 8> Exprs;
6881   SmallVector<IdentifierInfo *, 4> Names;
6882 
6883   ExprResult AsmString;
6884   SmallVector<Expr*, 8> Clobbers;
6885 
6886   bool ExprsChanged = false;
6887 
6888   // Go through the outputs.
6889   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6890     Names.push_back(S->getOutputIdentifier(I));
6891 
6892     // No need to transform the constraint literal.
6893     Constraints.push_back(S->getOutputConstraintLiteral(I));
6894 
6895     // Transform the output expr.
6896     Expr *OutputExpr = S->getOutputExpr(I);
6897     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6898     if (Result.isInvalid())
6899       return StmtError();
6900 
6901     ExprsChanged |= Result.get() != OutputExpr;
6902 
6903     Exprs.push_back(Result.get());
6904   }
6905 
6906   // Go through the inputs.
6907   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6908     Names.push_back(S->getInputIdentifier(I));
6909 
6910     // No need to transform the constraint literal.
6911     Constraints.push_back(S->getInputConstraintLiteral(I));
6912 
6913     // Transform the input expr.
6914     Expr *InputExpr = S->getInputExpr(I);
6915     ExprResult Result = getDerived().TransformExpr(InputExpr);
6916     if (Result.isInvalid())
6917       return StmtError();
6918 
6919     ExprsChanged |= Result.get() != InputExpr;
6920 
6921     Exprs.push_back(Result.get());
6922   }
6923 
6924   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6925     return S;
6926 
6927   // Go through the clobbers.
6928   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6929     Clobbers.push_back(S->getClobberStringLiteral(I));
6930 
6931   // No need to transform the asm string literal.
6932   AsmString = S->getAsmString();
6933   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6934                                         S->isVolatile(), S->getNumOutputs(),
6935                                         S->getNumInputs(), Names.data(),
6936                                         Constraints, Exprs, AsmString.get(),
6937                                         Clobbers, S->getRParenLoc());
6938 }
6939 
6940 template<typename Derived>
6941 StmtResult
6942 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6943   ArrayRef<Token> AsmToks =
6944     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6945 
6946   bool HadError = false, HadChange = false;
6947 
6948   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6949   SmallVector<Expr*, 8> TransformedExprs;
6950   TransformedExprs.reserve(SrcExprs.size());
6951   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6952     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6953     if (!Result.isUsable()) {
6954       HadError = true;
6955     } else {
6956       HadChange |= (Result.get() != SrcExprs[i]);
6957       TransformedExprs.push_back(Result.get());
6958     }
6959   }
6960 
6961   if (HadError) return StmtError();
6962   if (!HadChange && !getDerived().AlwaysRebuild())
6963     return Owned(S);
6964 
6965   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6966                                        AsmToks, S->getAsmString(),
6967                                        S->getNumOutputs(), S->getNumInputs(),
6968                                        S->getAllConstraints(), S->getClobbers(),
6969                                        TransformedExprs, S->getEndLoc());
6970 }
6971 
6972 // C++ Coroutines TS
6973 
6974 template<typename Derived>
6975 StmtResult
6976 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6977   auto *ScopeInfo = SemaRef.getCurFunction();
6978   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
6979   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
6980          ScopeInfo->NeedsCoroutineSuspends &&
6981          ScopeInfo->CoroutineSuspends.first == nullptr &&
6982          ScopeInfo->CoroutineSuspends.second == nullptr &&
6983          "expected clean scope info");
6984 
6985   // Set that we have (possibly-invalid) suspend points before we do anything
6986   // that may fail.
6987   ScopeInfo->setNeedsCoroutineSuspends(false);
6988 
6989   // The new CoroutinePromise object needs to be built and put into the current
6990   // FunctionScopeInfo before any transformations or rebuilding occurs.
6991   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
6992     return StmtError();
6993   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
6994   if (!Promise)
6995     return StmtError();
6996   getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise);
6997   ScopeInfo->CoroutinePromise = Promise;
6998 
6999   // Transform the implicit coroutine statements we built during the initial
7000   // parse.
7001   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7002   if (InitSuspend.isInvalid())
7003     return StmtError();
7004   StmtResult FinalSuspend =
7005       getDerived().TransformStmt(S->getFinalSuspendStmt());
7006   if (FinalSuspend.isInvalid())
7007     return StmtError();
7008   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7009   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7010 
7011   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7012   if (BodyRes.isInvalid())
7013     return StmtError();
7014 
7015   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7016   if (Builder.isInvalid())
7017     return StmtError();
7018 
7019   Expr *ReturnObject = S->getReturnValueInit();
7020   assert(ReturnObject && "the return object is expected to be valid");
7021   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7022                                                      /*NoCopyInit*/ false);
7023   if (Res.isInvalid())
7024     return StmtError();
7025   Builder.ReturnValue = Res.get();
7026 
7027   if (S->hasDependentPromiseType()) {
7028     assert(!Promise->getType()->isDependentType() &&
7029            "the promise type must no longer be dependent");
7030     assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7031            !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7032            "these nodes should not have been built yet");
7033     if (!Builder.buildDependentStatements())
7034       return StmtError();
7035   } else {
7036     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7037       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7038       if (Res.isInvalid())
7039         return StmtError();
7040       Builder.OnFallthrough = Res.get();
7041     }
7042 
7043     if (auto *OnException = S->getExceptionHandler()) {
7044       StmtResult Res = getDerived().TransformStmt(OnException);
7045       if (Res.isInvalid())
7046         return StmtError();
7047       Builder.OnException = Res.get();
7048     }
7049 
7050     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7051       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7052       if (Res.isInvalid())
7053         return StmtError();
7054       Builder.ReturnStmtOnAllocFailure = Res.get();
7055     }
7056 
7057     // Transform any additional statements we may have already built
7058     assert(S->getAllocate() && S->getDeallocate() &&
7059            "allocation and deallocation calls must already be built");
7060     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7061     if (AllocRes.isInvalid())
7062       return StmtError();
7063     Builder.Allocate = AllocRes.get();
7064 
7065     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7066     if (DeallocRes.isInvalid())
7067       return StmtError();
7068     Builder.Deallocate = DeallocRes.get();
7069 
7070     assert(S->getResultDecl() && "ResultDecl must already be built");
7071     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7072     if (ResultDecl.isInvalid())
7073       return StmtError();
7074     Builder.ResultDecl = ResultDecl.get();
7075 
7076     if (auto *ReturnStmt = S->getReturnStmt()) {
7077       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7078       if (Res.isInvalid())
7079         return StmtError();
7080       Builder.ReturnStmt = Res.get();
7081     }
7082   }
7083 
7084   return getDerived().RebuildCoroutineBodyStmt(Builder);
7085 }
7086 
7087 template<typename Derived>
7088 StmtResult
7089 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7090   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7091                                                         /*NotCopyInit*/false);
7092   if (Result.isInvalid())
7093     return StmtError();
7094 
7095   // Always rebuild; we don't know if this needs to be injected into a new
7096   // context or if the promise type has changed.
7097   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7098                                           S->isImplicit());
7099 }
7100 
7101 template<typename Derived>
7102 ExprResult
7103 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7104   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7105                                                         /*NotCopyInit*/false);
7106   if (Result.isInvalid())
7107     return ExprError();
7108 
7109   // Always rebuild; we don't know if this needs to be injected into a new
7110   // context or if the promise type has changed.
7111   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7112                                          E->isImplicit());
7113 }
7114 
7115 template <typename Derived>
7116 ExprResult
7117 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7118   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7119                                                         /*NotCopyInit*/ false);
7120   if (OperandResult.isInvalid())
7121     return ExprError();
7122 
7123   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7124           E->getOperatorCoawaitLookup());
7125 
7126   if (LookupResult.isInvalid())
7127     return ExprError();
7128 
7129   // Always rebuild; we don't know if this needs to be injected into a new
7130   // context or if the promise type has changed.
7131   return getDerived().RebuildDependentCoawaitExpr(
7132       E->getKeywordLoc(), OperandResult.get(),
7133       cast<UnresolvedLookupExpr>(LookupResult.get()));
7134 }
7135 
7136 template<typename Derived>
7137 ExprResult
7138 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7139   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7140                                                         /*NotCopyInit*/false);
7141   if (Result.isInvalid())
7142     return ExprError();
7143 
7144   // Always rebuild; we don't know if this needs to be injected into a new
7145   // context or if the promise type has changed.
7146   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7147 }
7148 
7149 // Objective-C Statements.
7150 
7151 template<typename Derived>
7152 StmtResult
7153 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7154   // Transform the body of the @try.
7155   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7156   if (TryBody.isInvalid())
7157     return StmtError();
7158 
7159   // Transform the @catch statements (if present).
7160   bool AnyCatchChanged = false;
7161   SmallVector<Stmt*, 8> CatchStmts;
7162   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7163     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7164     if (Catch.isInvalid())
7165       return StmtError();
7166     if (Catch.get() != S->getCatchStmt(I))
7167       AnyCatchChanged = true;
7168     CatchStmts.push_back(Catch.get());
7169   }
7170 
7171   // Transform the @finally statement (if present).
7172   StmtResult Finally;
7173   if (S->getFinallyStmt()) {
7174     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7175     if (Finally.isInvalid())
7176       return StmtError();
7177   }
7178 
7179   // If nothing changed, just retain this statement.
7180   if (!getDerived().AlwaysRebuild() &&
7181       TryBody.get() == S->getTryBody() &&
7182       !AnyCatchChanged &&
7183       Finally.get() == S->getFinallyStmt())
7184     return S;
7185 
7186   // Build a new statement.
7187   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7188                                            CatchStmts, Finally.get());
7189 }
7190 
7191 template<typename Derived>
7192 StmtResult
7193 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7194   // Transform the @catch parameter, if there is one.
7195   VarDecl *Var = nullptr;
7196   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7197     TypeSourceInfo *TSInfo = nullptr;
7198     if (FromVar->getTypeSourceInfo()) {
7199       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7200       if (!TSInfo)
7201         return StmtError();
7202     }
7203 
7204     QualType T;
7205     if (TSInfo)
7206       T = TSInfo->getType();
7207     else {
7208       T = getDerived().TransformType(FromVar->getType());
7209       if (T.isNull())
7210         return StmtError();
7211     }
7212 
7213     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7214     if (!Var)
7215       return StmtError();
7216   }
7217 
7218   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7219   if (Body.isInvalid())
7220     return StmtError();
7221 
7222   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7223                                              S->getRParenLoc(),
7224                                              Var, Body.get());
7225 }
7226 
7227 template<typename Derived>
7228 StmtResult
7229 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7230   // Transform the body.
7231   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7232   if (Body.isInvalid())
7233     return StmtError();
7234 
7235   // If nothing changed, just retain this statement.
7236   if (!getDerived().AlwaysRebuild() &&
7237       Body.get() == S->getFinallyBody())
7238     return S;
7239 
7240   // Build a new statement.
7241   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7242                                                Body.get());
7243 }
7244 
7245 template<typename Derived>
7246 StmtResult
7247 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7248   ExprResult Operand;
7249   if (S->getThrowExpr()) {
7250     Operand = getDerived().TransformExpr(S->getThrowExpr());
7251     if (Operand.isInvalid())
7252       return StmtError();
7253   }
7254 
7255   if (!getDerived().AlwaysRebuild() &&
7256       Operand.get() == S->getThrowExpr())
7257     return S;
7258 
7259   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7260 }
7261 
7262 template<typename Derived>
7263 StmtResult
7264 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7265                                                   ObjCAtSynchronizedStmt *S) {
7266   // Transform the object we are locking.
7267   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7268   if (Object.isInvalid())
7269     return StmtError();
7270   Object =
7271     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7272                                                   Object.get());
7273   if (Object.isInvalid())
7274     return StmtError();
7275 
7276   // Transform the body.
7277   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7278   if (Body.isInvalid())
7279     return StmtError();
7280 
7281   // If nothing change, just retain the current statement.
7282   if (!getDerived().AlwaysRebuild() &&
7283       Object.get() == S->getSynchExpr() &&
7284       Body.get() == S->getSynchBody())
7285     return S;
7286 
7287   // Build a new statement.
7288   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7289                                                     Object.get(), Body.get());
7290 }
7291 
7292 template<typename Derived>
7293 StmtResult
7294 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7295                                               ObjCAutoreleasePoolStmt *S) {
7296   // Transform the body.
7297   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7298   if (Body.isInvalid())
7299     return StmtError();
7300 
7301   // If nothing changed, just retain this statement.
7302   if (!getDerived().AlwaysRebuild() &&
7303       Body.get() == S->getSubStmt())
7304     return S;
7305 
7306   // Build a new statement.
7307   return getDerived().RebuildObjCAutoreleasePoolStmt(
7308                         S->getAtLoc(), Body.get());
7309 }
7310 
7311 template<typename Derived>
7312 StmtResult
7313 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7314                                                   ObjCForCollectionStmt *S) {
7315   // Transform the element statement.
7316   StmtResult Element = getDerived().TransformStmt(S->getElement());
7317   if (Element.isInvalid())
7318     return StmtError();
7319 
7320   // Transform the collection expression.
7321   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7322   if (Collection.isInvalid())
7323     return StmtError();
7324 
7325   // Transform the body.
7326   StmtResult Body = getDerived().TransformStmt(S->getBody());
7327   if (Body.isInvalid())
7328     return StmtError();
7329 
7330   // If nothing changed, just retain this statement.
7331   if (!getDerived().AlwaysRebuild() &&
7332       Element.get() == S->getElement() &&
7333       Collection.get() == S->getCollection() &&
7334       Body.get() == S->getBody())
7335     return S;
7336 
7337   // Build a new statement.
7338   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7339                                                    Element.get(),
7340                                                    Collection.get(),
7341                                                    S->getRParenLoc(),
7342                                                    Body.get());
7343 }
7344 
7345 template <typename Derived>
7346 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7347   // Transform the exception declaration, if any.
7348   VarDecl *Var = nullptr;
7349   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7350     TypeSourceInfo *T =
7351         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7352     if (!T)
7353       return StmtError();
7354 
7355     Var = getDerived().RebuildExceptionDecl(
7356         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7357         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7358     if (!Var || Var->isInvalidDecl())
7359       return StmtError();
7360   }
7361 
7362   // Transform the actual exception handler.
7363   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7364   if (Handler.isInvalid())
7365     return StmtError();
7366 
7367   if (!getDerived().AlwaysRebuild() && !Var &&
7368       Handler.get() == S->getHandlerBlock())
7369     return S;
7370 
7371   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7372 }
7373 
7374 template <typename Derived>
7375 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7376   // Transform the try block itself.
7377   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7378   if (TryBlock.isInvalid())
7379     return StmtError();
7380 
7381   // Transform the handlers.
7382   bool HandlerChanged = false;
7383   SmallVector<Stmt *, 8> Handlers;
7384   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7385     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7386     if (Handler.isInvalid())
7387       return StmtError();
7388 
7389     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7390     Handlers.push_back(Handler.getAs<Stmt>());
7391   }
7392 
7393   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7394       !HandlerChanged)
7395     return S;
7396 
7397   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7398                                         Handlers);
7399 }
7400 
7401 template<typename Derived>
7402 StmtResult
7403 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7404   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7405   if (Range.isInvalid())
7406     return StmtError();
7407 
7408   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7409   if (Begin.isInvalid())
7410     return StmtError();
7411   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7412   if (End.isInvalid())
7413     return StmtError();
7414 
7415   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7416   if (Cond.isInvalid())
7417     return StmtError();
7418   if (Cond.get())
7419     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7420   if (Cond.isInvalid())
7421     return StmtError();
7422   if (Cond.get())
7423     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7424 
7425   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7426   if (Inc.isInvalid())
7427     return StmtError();
7428   if (Inc.get())
7429     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7430 
7431   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7432   if (LoopVar.isInvalid())
7433     return StmtError();
7434 
7435   StmtResult NewStmt = S;
7436   if (getDerived().AlwaysRebuild() ||
7437       Range.get() != S->getRangeStmt() ||
7438       Begin.get() != S->getBeginStmt() ||
7439       End.get() != S->getEndStmt() ||
7440       Cond.get() != S->getCond() ||
7441       Inc.get() != S->getInc() ||
7442       LoopVar.get() != S->getLoopVarStmt()) {
7443     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7444                                                   S->getCoawaitLoc(),
7445                                                   S->getColonLoc(), Range.get(),
7446                                                   Begin.get(), End.get(),
7447                                                   Cond.get(),
7448                                                   Inc.get(), LoopVar.get(),
7449                                                   S->getRParenLoc());
7450     if (NewStmt.isInvalid())
7451       return StmtError();
7452   }
7453 
7454   StmtResult Body = getDerived().TransformStmt(S->getBody());
7455   if (Body.isInvalid())
7456     return StmtError();
7457 
7458   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7459   // it now so we have a new statement to attach the body to.
7460   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7461     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7462                                                   S->getCoawaitLoc(),
7463                                                   S->getColonLoc(), Range.get(),
7464                                                   Begin.get(), End.get(),
7465                                                   Cond.get(),
7466                                                   Inc.get(), LoopVar.get(),
7467                                                   S->getRParenLoc());
7468     if (NewStmt.isInvalid())
7469       return StmtError();
7470   }
7471 
7472   if (NewStmt.get() == S)
7473     return S;
7474 
7475   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7476 }
7477 
7478 template<typename Derived>
7479 StmtResult
7480 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7481                                                     MSDependentExistsStmt *S) {
7482   // Transform the nested-name-specifier, if any.
7483   NestedNameSpecifierLoc QualifierLoc;
7484   if (S->getQualifierLoc()) {
7485     QualifierLoc
7486       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7487     if (!QualifierLoc)
7488       return StmtError();
7489   }
7490 
7491   // Transform the declaration name.
7492   DeclarationNameInfo NameInfo = S->getNameInfo();
7493   if (NameInfo.getName()) {
7494     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7495     if (!NameInfo.getName())
7496       return StmtError();
7497   }
7498 
7499   // Check whether anything changed.
7500   if (!getDerived().AlwaysRebuild() &&
7501       QualifierLoc == S->getQualifierLoc() &&
7502       NameInfo.getName() == S->getNameInfo().getName())
7503     return S;
7504 
7505   // Determine whether this name exists, if we can.
7506   CXXScopeSpec SS;
7507   SS.Adopt(QualifierLoc);
7508   bool Dependent = false;
7509   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7510   case Sema::IER_Exists:
7511     if (S->isIfExists())
7512       break;
7513 
7514     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7515 
7516   case Sema::IER_DoesNotExist:
7517     if (S->isIfNotExists())
7518       break;
7519 
7520     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7521 
7522   case Sema::IER_Dependent:
7523     Dependent = true;
7524     break;
7525 
7526   case Sema::IER_Error:
7527     return StmtError();
7528   }
7529 
7530   // We need to continue with the instantiation, so do so now.
7531   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7532   if (SubStmt.isInvalid())
7533     return StmtError();
7534 
7535   // If we have resolved the name, just transform to the substatement.
7536   if (!Dependent)
7537     return SubStmt;
7538 
7539   // The name is still dependent, so build a dependent expression again.
7540   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7541                                                    S->isIfExists(),
7542                                                    QualifierLoc,
7543                                                    NameInfo,
7544                                                    SubStmt.get());
7545 }
7546 
7547 template<typename Derived>
7548 ExprResult
7549 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7550   NestedNameSpecifierLoc QualifierLoc;
7551   if (E->getQualifierLoc()) {
7552     QualifierLoc
7553     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7554     if (!QualifierLoc)
7555       return ExprError();
7556   }
7557 
7558   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7559     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7560   if (!PD)
7561     return ExprError();
7562 
7563   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7564   if (Base.isInvalid())
7565     return ExprError();
7566 
7567   return new (SemaRef.getASTContext())
7568       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7569                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7570                         QualifierLoc, E->getMemberLoc());
7571 }
7572 
7573 template <typename Derived>
7574 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7575     MSPropertySubscriptExpr *E) {
7576   auto BaseRes = getDerived().TransformExpr(E->getBase());
7577   if (BaseRes.isInvalid())
7578     return ExprError();
7579   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7580   if (IdxRes.isInvalid())
7581     return ExprError();
7582 
7583   if (!getDerived().AlwaysRebuild() &&
7584       BaseRes.get() == E->getBase() &&
7585       IdxRes.get() == E->getIdx())
7586     return E;
7587 
7588   return getDerived().RebuildArraySubscriptExpr(
7589       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7590 }
7591 
7592 template <typename Derived>
7593 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7594   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7595   if (TryBlock.isInvalid())
7596     return StmtError();
7597 
7598   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7599   if (Handler.isInvalid())
7600     return StmtError();
7601 
7602   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7603       Handler.get() == S->getHandler())
7604     return S;
7605 
7606   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7607                                         TryBlock.get(), Handler.get());
7608 }
7609 
7610 template <typename Derived>
7611 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7612   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7613   if (Block.isInvalid())
7614     return StmtError();
7615 
7616   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7617 }
7618 
7619 template <typename Derived>
7620 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7621   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7622   if (FilterExpr.isInvalid())
7623     return StmtError();
7624 
7625   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7626   if (Block.isInvalid())
7627     return StmtError();
7628 
7629   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7630                                            Block.get());
7631 }
7632 
7633 template <typename Derived>
7634 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7635   if (isa<SEHFinallyStmt>(Handler))
7636     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7637   else
7638     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7639 }
7640 
7641 template<typename Derived>
7642 StmtResult
7643 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7644   return S;
7645 }
7646 
7647 //===----------------------------------------------------------------------===//
7648 // OpenMP directive transformation
7649 //===----------------------------------------------------------------------===//
7650 template <typename Derived>
7651 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7652     OMPExecutableDirective *D) {
7653 
7654   // Transform the clauses
7655   llvm::SmallVector<OMPClause *, 16> TClauses;
7656   ArrayRef<OMPClause *> Clauses = D->clauses();
7657   TClauses.reserve(Clauses.size());
7658   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7659        I != E; ++I) {
7660     if (*I) {
7661       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7662       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7663       getDerived().getSema().EndOpenMPClause();
7664       if (Clause)
7665         TClauses.push_back(Clause);
7666     } else {
7667       TClauses.push_back(nullptr);
7668     }
7669   }
7670   StmtResult AssociatedStmt;
7671   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7672     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7673                                                   /*CurScope=*/nullptr);
7674     StmtResult Body;
7675     {
7676       Sema::CompoundScopeRAII CompoundScope(getSema());
7677       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
7678       Body = getDerived().TransformStmt(CS);
7679     }
7680     AssociatedStmt =
7681         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7682     if (AssociatedStmt.isInvalid()) {
7683       return StmtError();
7684     }
7685   }
7686   if (TClauses.size() != Clauses.size()) {
7687     return StmtError();
7688   }
7689 
7690   // Transform directive name for 'omp critical' directive.
7691   DeclarationNameInfo DirName;
7692   if (D->getDirectiveKind() == OMPD_critical) {
7693     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7694     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7695   }
7696   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7697   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7698     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7699   } else if (D->getDirectiveKind() == OMPD_cancel) {
7700     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7701   }
7702 
7703   return getDerived().RebuildOMPExecutableDirective(
7704       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7705       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
7706 }
7707 
7708 template <typename Derived>
7709 StmtResult
7710 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7711   DeclarationNameInfo DirName;
7712   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7713                                              D->getBeginLoc());
7714   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7715   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7716   return Res;
7717 }
7718 
7719 template <typename Derived>
7720 StmtResult
7721 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7722   DeclarationNameInfo DirName;
7723   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7724                                              D->getBeginLoc());
7725   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7726   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7727   return Res;
7728 }
7729 
7730 template <typename Derived>
7731 StmtResult
7732 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7733   DeclarationNameInfo DirName;
7734   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7735                                              D->getBeginLoc());
7736   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7737   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7738   return Res;
7739 }
7740 
7741 template <typename Derived>
7742 StmtResult
7743 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7744   DeclarationNameInfo DirName;
7745   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7746                                              D->getBeginLoc());
7747   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7748   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7749   return Res;
7750 }
7751 
7752 template <typename Derived>
7753 StmtResult
7754 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7755   DeclarationNameInfo DirName;
7756   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7757                                              D->getBeginLoc());
7758   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7759   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7760   return Res;
7761 }
7762 
7763 template <typename Derived>
7764 StmtResult
7765 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7766   DeclarationNameInfo DirName;
7767   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7768                                              D->getBeginLoc());
7769   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7770   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7771   return Res;
7772 }
7773 
7774 template <typename Derived>
7775 StmtResult
7776 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7777   DeclarationNameInfo DirName;
7778   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7779                                              D->getBeginLoc());
7780   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7781   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7782   return Res;
7783 }
7784 
7785 template <typename Derived>
7786 StmtResult
7787 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7788   DeclarationNameInfo DirName;
7789   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7790                                              D->getBeginLoc());
7791   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7792   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7793   return Res;
7794 }
7795 
7796 template <typename Derived>
7797 StmtResult
7798 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7799   getDerived().getSema().StartOpenMPDSABlock(
7800       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
7801   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7802   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7803   return Res;
7804 }
7805 
7806 template <typename Derived>
7807 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7808     OMPParallelForDirective *D) {
7809   DeclarationNameInfo DirName;
7810   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7811                                              nullptr, D->getBeginLoc());
7812   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7813   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7814   return Res;
7815 }
7816 
7817 template <typename Derived>
7818 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7819     OMPParallelForSimdDirective *D) {
7820   DeclarationNameInfo DirName;
7821   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7822                                              nullptr, D->getBeginLoc());
7823   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7824   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7825   return Res;
7826 }
7827 
7828 template <typename Derived>
7829 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7830     OMPParallelSectionsDirective *D) {
7831   DeclarationNameInfo DirName;
7832   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7833                                              nullptr, D->getBeginLoc());
7834   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7835   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7836   return Res;
7837 }
7838 
7839 template <typename Derived>
7840 StmtResult
7841 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7842   DeclarationNameInfo DirName;
7843   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7844                                              D->getBeginLoc());
7845   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7846   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7847   return Res;
7848 }
7849 
7850 template <typename Derived>
7851 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7852     OMPTaskyieldDirective *D) {
7853   DeclarationNameInfo DirName;
7854   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7855                                              D->getBeginLoc());
7856   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7857   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7858   return Res;
7859 }
7860 
7861 template <typename Derived>
7862 StmtResult
7863 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7864   DeclarationNameInfo DirName;
7865   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7866                                              D->getBeginLoc());
7867   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7868   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7869   return Res;
7870 }
7871 
7872 template <typename Derived>
7873 StmtResult
7874 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7875   DeclarationNameInfo DirName;
7876   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7877                                              D->getBeginLoc());
7878   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7879   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7880   return Res;
7881 }
7882 
7883 template <typename Derived>
7884 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7885     OMPTaskgroupDirective *D) {
7886   DeclarationNameInfo DirName;
7887   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7888                                              D->getBeginLoc());
7889   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7890   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7891   return Res;
7892 }
7893 
7894 template <typename Derived>
7895 StmtResult
7896 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7897   DeclarationNameInfo DirName;
7898   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7899                                              D->getBeginLoc());
7900   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7901   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7902   return Res;
7903 }
7904 
7905 template <typename Derived>
7906 StmtResult
7907 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7908   DeclarationNameInfo DirName;
7909   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7910                                              D->getBeginLoc());
7911   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7912   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7913   return Res;
7914 }
7915 
7916 template <typename Derived>
7917 StmtResult
7918 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7919   DeclarationNameInfo DirName;
7920   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7921                                              D->getBeginLoc());
7922   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7923   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7924   return Res;
7925 }
7926 
7927 template <typename Derived>
7928 StmtResult
7929 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7930   DeclarationNameInfo DirName;
7931   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7932                                              D->getBeginLoc());
7933   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7934   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7935   return Res;
7936 }
7937 
7938 template <typename Derived>
7939 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7940     OMPTargetDataDirective *D) {
7941   DeclarationNameInfo DirName;
7942   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7943                                              D->getBeginLoc());
7944   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7945   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7946   return Res;
7947 }
7948 
7949 template <typename Derived>
7950 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7951     OMPTargetEnterDataDirective *D) {
7952   DeclarationNameInfo DirName;
7953   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7954                                              nullptr, D->getBeginLoc());
7955   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7956   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7957   return Res;
7958 }
7959 
7960 template <typename Derived>
7961 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7962     OMPTargetExitDataDirective *D) {
7963   DeclarationNameInfo DirName;
7964   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7965                                              nullptr, D->getBeginLoc());
7966   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7967   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7968   return Res;
7969 }
7970 
7971 template <typename Derived>
7972 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7973     OMPTargetParallelDirective *D) {
7974   DeclarationNameInfo DirName;
7975   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7976                                              nullptr, D->getBeginLoc());
7977   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7978   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7979   return Res;
7980 }
7981 
7982 template <typename Derived>
7983 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7984     OMPTargetParallelForDirective *D) {
7985   DeclarationNameInfo DirName;
7986   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7987                                              nullptr, D->getBeginLoc());
7988   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7989   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7990   return Res;
7991 }
7992 
7993 template <typename Derived>
7994 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7995     OMPTargetUpdateDirective *D) {
7996   DeclarationNameInfo DirName;
7997   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7998                                              nullptr, D->getBeginLoc());
7999   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8000   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8001   return Res;
8002 }
8003 
8004 template <typename Derived>
8005 StmtResult
8006 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8007   DeclarationNameInfo DirName;
8008   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8009                                              D->getBeginLoc());
8010   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8011   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8012   return Res;
8013 }
8014 
8015 template <typename Derived>
8016 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8017     OMPCancellationPointDirective *D) {
8018   DeclarationNameInfo DirName;
8019   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8020                                              nullptr, D->getBeginLoc());
8021   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8022   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8023   return Res;
8024 }
8025 
8026 template <typename Derived>
8027 StmtResult
8028 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8029   DeclarationNameInfo DirName;
8030   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8031                                              D->getBeginLoc());
8032   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8033   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8034   return Res;
8035 }
8036 
8037 template <typename Derived>
8038 StmtResult
8039 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8040   DeclarationNameInfo DirName;
8041   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8042                                              D->getBeginLoc());
8043   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8044   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8045   return Res;
8046 }
8047 
8048 template <typename Derived>
8049 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8050     OMPTaskLoopSimdDirective *D) {
8051   DeclarationNameInfo DirName;
8052   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8053                                              nullptr, D->getBeginLoc());
8054   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8055   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8056   return Res;
8057 }
8058 
8059 template <typename Derived>
8060 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8061     OMPDistributeDirective *D) {
8062   DeclarationNameInfo DirName;
8063   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8064                                              D->getBeginLoc());
8065   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8066   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8067   return Res;
8068 }
8069 
8070 template <typename Derived>
8071 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8072     OMPDistributeParallelForDirective *D) {
8073   DeclarationNameInfo DirName;
8074   getDerived().getSema().StartOpenMPDSABlock(
8075       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8076   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8077   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8078   return Res;
8079 }
8080 
8081 template <typename Derived>
8082 StmtResult
8083 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8084     OMPDistributeParallelForSimdDirective *D) {
8085   DeclarationNameInfo DirName;
8086   getDerived().getSema().StartOpenMPDSABlock(
8087       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8088   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8089   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8090   return Res;
8091 }
8092 
8093 template <typename Derived>
8094 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8095     OMPDistributeSimdDirective *D) {
8096   DeclarationNameInfo DirName;
8097   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8098                                              nullptr, D->getBeginLoc());
8099   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8100   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8101   return Res;
8102 }
8103 
8104 template <typename Derived>
8105 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8106     OMPTargetParallelForSimdDirective *D) {
8107   DeclarationNameInfo DirName;
8108   getDerived().getSema().StartOpenMPDSABlock(
8109       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8110   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8111   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8112   return Res;
8113 }
8114 
8115 template <typename Derived>
8116 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8117     OMPTargetSimdDirective *D) {
8118   DeclarationNameInfo DirName;
8119   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8120                                              D->getBeginLoc());
8121   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8122   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8123   return Res;
8124 }
8125 
8126 template <typename Derived>
8127 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8128     OMPTeamsDistributeDirective *D) {
8129   DeclarationNameInfo DirName;
8130   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8131                                              nullptr, D->getBeginLoc());
8132   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8133   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8134   return Res;
8135 }
8136 
8137 template <typename Derived>
8138 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8139     OMPTeamsDistributeSimdDirective *D) {
8140   DeclarationNameInfo DirName;
8141   getDerived().getSema().StartOpenMPDSABlock(
8142       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8143   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8144   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8145   return Res;
8146 }
8147 
8148 template <typename Derived>
8149 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8150     OMPTeamsDistributeParallelForSimdDirective *D) {
8151   DeclarationNameInfo DirName;
8152   getDerived().getSema().StartOpenMPDSABlock(
8153       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8154       D->getBeginLoc());
8155   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8156   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8157   return Res;
8158 }
8159 
8160 template <typename Derived>
8161 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8162     OMPTeamsDistributeParallelForDirective *D) {
8163   DeclarationNameInfo DirName;
8164   getDerived().getSema().StartOpenMPDSABlock(
8165       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8166   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8167   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8168   return Res;
8169 }
8170 
8171 template <typename Derived>
8172 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8173     OMPTargetTeamsDirective *D) {
8174   DeclarationNameInfo DirName;
8175   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8176                                              nullptr, D->getBeginLoc());
8177   auto Res = getDerived().TransformOMPExecutableDirective(D);
8178   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8179   return Res;
8180 }
8181 
8182 template <typename Derived>
8183 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8184     OMPTargetTeamsDistributeDirective *D) {
8185   DeclarationNameInfo DirName;
8186   getDerived().getSema().StartOpenMPDSABlock(
8187       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8188   auto Res = getDerived().TransformOMPExecutableDirective(D);
8189   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8190   return Res;
8191 }
8192 
8193 template <typename Derived>
8194 StmtResult
8195 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8196     OMPTargetTeamsDistributeParallelForDirective *D) {
8197   DeclarationNameInfo DirName;
8198   getDerived().getSema().StartOpenMPDSABlock(
8199       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8200       D->getBeginLoc());
8201   auto Res = getDerived().TransformOMPExecutableDirective(D);
8202   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8203   return Res;
8204 }
8205 
8206 template <typename Derived>
8207 StmtResult TreeTransform<Derived>::
8208     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8209         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8210   DeclarationNameInfo DirName;
8211   getDerived().getSema().StartOpenMPDSABlock(
8212       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8213       D->getBeginLoc());
8214   auto Res = getDerived().TransformOMPExecutableDirective(D);
8215   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8216   return Res;
8217 }
8218 
8219 template <typename Derived>
8220 StmtResult
8221 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8222     OMPTargetTeamsDistributeSimdDirective *D) {
8223   DeclarationNameInfo DirName;
8224   getDerived().getSema().StartOpenMPDSABlock(
8225       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8226   auto Res = getDerived().TransformOMPExecutableDirective(D);
8227   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8228   return Res;
8229 }
8230 
8231 
8232 //===----------------------------------------------------------------------===//
8233 // OpenMP clause transformation
8234 //===----------------------------------------------------------------------===//
8235 template <typename Derived>
8236 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8237   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8238   if (Cond.isInvalid())
8239     return nullptr;
8240   return getDerived().RebuildOMPIfClause(
8241       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8242       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8243 }
8244 
8245 template <typename Derived>
8246 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8247   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8248   if (Cond.isInvalid())
8249     return nullptr;
8250   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8251                                             C->getLParenLoc(), C->getEndLoc());
8252 }
8253 
8254 template <typename Derived>
8255 OMPClause *
8256 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8257   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8258   if (NumThreads.isInvalid())
8259     return nullptr;
8260   return getDerived().RebuildOMPNumThreadsClause(
8261       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8262 }
8263 
8264 template <typename Derived>
8265 OMPClause *
8266 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8267   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8268   if (E.isInvalid())
8269     return nullptr;
8270   return getDerived().RebuildOMPSafelenClause(
8271       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8272 }
8273 
8274 template <typename Derived>
8275 OMPClause *
8276 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8277   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8278   if (E.isInvalid())
8279     return nullptr;
8280   return getDerived().RebuildOMPSimdlenClause(
8281       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8282 }
8283 
8284 template <typename Derived>
8285 OMPClause *
8286 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8287   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8288   if (E.isInvalid())
8289     return nullptr;
8290   return getDerived().RebuildOMPCollapseClause(
8291       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8292 }
8293 
8294 template <typename Derived>
8295 OMPClause *
8296 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8297   return getDerived().RebuildOMPDefaultClause(
8298       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8299       C->getLParenLoc(), C->getEndLoc());
8300 }
8301 
8302 template <typename Derived>
8303 OMPClause *
8304 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8305   return getDerived().RebuildOMPProcBindClause(
8306       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8307       C->getLParenLoc(), C->getEndLoc());
8308 }
8309 
8310 template <typename Derived>
8311 OMPClause *
8312 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8313   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8314   if (E.isInvalid())
8315     return nullptr;
8316   return getDerived().RebuildOMPScheduleClause(
8317       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8318       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8319       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8320       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8321 }
8322 
8323 template <typename Derived>
8324 OMPClause *
8325 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8326   ExprResult E;
8327   if (auto *Num = C->getNumForLoops()) {
8328     E = getDerived().TransformExpr(Num);
8329     if (E.isInvalid())
8330       return nullptr;
8331   }
8332   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8333                                               C->getLParenLoc(), E.get());
8334 }
8335 
8336 template <typename Derived>
8337 OMPClause *
8338 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8339   // No need to rebuild this clause, no template-dependent parameters.
8340   return C;
8341 }
8342 
8343 template <typename Derived>
8344 OMPClause *
8345 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8346   // No need to rebuild this clause, no template-dependent parameters.
8347   return C;
8348 }
8349 
8350 template <typename Derived>
8351 OMPClause *
8352 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8353   // No need to rebuild this clause, no template-dependent parameters.
8354   return C;
8355 }
8356 
8357 template <typename Derived>
8358 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8359   // No need to rebuild this clause, no template-dependent parameters.
8360   return C;
8361 }
8362 
8363 template <typename Derived>
8364 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8365   // No need to rebuild this clause, no template-dependent parameters.
8366   return C;
8367 }
8368 
8369 template <typename Derived>
8370 OMPClause *
8371 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8372   // No need to rebuild this clause, no template-dependent parameters.
8373   return C;
8374 }
8375 
8376 template <typename Derived>
8377 OMPClause *
8378 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8379   // No need to rebuild this clause, no template-dependent parameters.
8380   return C;
8381 }
8382 
8383 template <typename Derived>
8384 OMPClause *
8385 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8386   // No need to rebuild this clause, no template-dependent parameters.
8387   return C;
8388 }
8389 
8390 template <typename Derived>
8391 OMPClause *
8392 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8393   // No need to rebuild this clause, no template-dependent parameters.
8394   return C;
8395 }
8396 
8397 template <typename Derived>
8398 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8399   // No need to rebuild this clause, no template-dependent parameters.
8400   return C;
8401 }
8402 
8403 template <typename Derived>
8404 OMPClause *
8405 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8406   // No need to rebuild this clause, no template-dependent parameters.
8407   return C;
8408 }
8409 
8410 template <typename Derived>
8411 OMPClause *
8412 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8413   llvm::SmallVector<Expr *, 16> Vars;
8414   Vars.reserve(C->varlist_size());
8415   for (auto *VE : C->varlists()) {
8416     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8417     if (EVar.isInvalid())
8418       return nullptr;
8419     Vars.push_back(EVar.get());
8420   }
8421   return getDerived().RebuildOMPPrivateClause(
8422       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8423 }
8424 
8425 template <typename Derived>
8426 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8427     OMPFirstprivateClause *C) {
8428   llvm::SmallVector<Expr *, 16> Vars;
8429   Vars.reserve(C->varlist_size());
8430   for (auto *VE : C->varlists()) {
8431     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8432     if (EVar.isInvalid())
8433       return nullptr;
8434     Vars.push_back(EVar.get());
8435   }
8436   return getDerived().RebuildOMPFirstprivateClause(
8437       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8438 }
8439 
8440 template <typename Derived>
8441 OMPClause *
8442 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8443   llvm::SmallVector<Expr *, 16> Vars;
8444   Vars.reserve(C->varlist_size());
8445   for (auto *VE : C->varlists()) {
8446     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8447     if (EVar.isInvalid())
8448       return nullptr;
8449     Vars.push_back(EVar.get());
8450   }
8451   return getDerived().RebuildOMPLastprivateClause(
8452       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8453 }
8454 
8455 template <typename Derived>
8456 OMPClause *
8457 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8458   llvm::SmallVector<Expr *, 16> Vars;
8459   Vars.reserve(C->varlist_size());
8460   for (auto *VE : C->varlists()) {
8461     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8462     if (EVar.isInvalid())
8463       return nullptr;
8464     Vars.push_back(EVar.get());
8465   }
8466   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8467                                              C->getLParenLoc(), C->getEndLoc());
8468 }
8469 
8470 template <typename Derived>
8471 OMPClause *
8472 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8473   llvm::SmallVector<Expr *, 16> Vars;
8474   Vars.reserve(C->varlist_size());
8475   for (auto *VE : C->varlists()) {
8476     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8477     if (EVar.isInvalid())
8478       return nullptr;
8479     Vars.push_back(EVar.get());
8480   }
8481   CXXScopeSpec ReductionIdScopeSpec;
8482   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8483 
8484   DeclarationNameInfo NameInfo = C->getNameInfo();
8485   if (NameInfo.getName()) {
8486     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8487     if (!NameInfo.getName())
8488       return nullptr;
8489   }
8490   // Build a list of all UDR decls with the same names ranged by the Scopes.
8491   // The Scope boundary is a duplication of the previous decl.
8492   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8493   for (auto *E : C->reduction_ops()) {
8494     // Transform all the decls.
8495     if (E) {
8496       auto *ULE = cast<UnresolvedLookupExpr>(E);
8497       UnresolvedSet<8> Decls;
8498       for (auto *D : ULE->decls()) {
8499         NamedDecl *InstD =
8500             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8501         Decls.addDecl(InstD, InstD->getAccess());
8502       }
8503       UnresolvedReductions.push_back(
8504        UnresolvedLookupExpr::Create(
8505           SemaRef.Context, /*NamingClass=*/nullptr,
8506           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8507           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8508           Decls.begin(), Decls.end()));
8509     } else
8510       UnresolvedReductions.push_back(nullptr);
8511   }
8512   return getDerived().RebuildOMPReductionClause(
8513       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8514       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8515 }
8516 
8517 template <typename Derived>
8518 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8519     OMPTaskReductionClause *C) {
8520   llvm::SmallVector<Expr *, 16> Vars;
8521   Vars.reserve(C->varlist_size());
8522   for (auto *VE : C->varlists()) {
8523     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8524     if (EVar.isInvalid())
8525       return nullptr;
8526     Vars.push_back(EVar.get());
8527   }
8528   CXXScopeSpec ReductionIdScopeSpec;
8529   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8530 
8531   DeclarationNameInfo NameInfo = C->getNameInfo();
8532   if (NameInfo.getName()) {
8533     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8534     if (!NameInfo.getName())
8535       return nullptr;
8536   }
8537   // Build a list of all UDR decls with the same names ranged by the Scopes.
8538   // The Scope boundary is a duplication of the previous decl.
8539   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8540   for (auto *E : C->reduction_ops()) {
8541     // Transform all the decls.
8542     if (E) {
8543       auto *ULE = cast<UnresolvedLookupExpr>(E);
8544       UnresolvedSet<8> Decls;
8545       for (auto *D : ULE->decls()) {
8546         NamedDecl *InstD =
8547             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8548         Decls.addDecl(InstD, InstD->getAccess());
8549       }
8550       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8551           SemaRef.Context, /*NamingClass=*/nullptr,
8552           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8553           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8554     } else
8555       UnresolvedReductions.push_back(nullptr);
8556   }
8557   return getDerived().RebuildOMPTaskReductionClause(
8558       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8559       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8560 }
8561 
8562 template <typename Derived>
8563 OMPClause *
8564 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
8565   llvm::SmallVector<Expr *, 16> Vars;
8566   Vars.reserve(C->varlist_size());
8567   for (auto *VE : C->varlists()) {
8568     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8569     if (EVar.isInvalid())
8570       return nullptr;
8571     Vars.push_back(EVar.get());
8572   }
8573   CXXScopeSpec ReductionIdScopeSpec;
8574   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8575 
8576   DeclarationNameInfo NameInfo = C->getNameInfo();
8577   if (NameInfo.getName()) {
8578     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8579     if (!NameInfo.getName())
8580       return nullptr;
8581   }
8582   // Build a list of all UDR decls with the same names ranged by the Scopes.
8583   // The Scope boundary is a duplication of the previous decl.
8584   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8585   for (auto *E : C->reduction_ops()) {
8586     // Transform all the decls.
8587     if (E) {
8588       auto *ULE = cast<UnresolvedLookupExpr>(E);
8589       UnresolvedSet<8> Decls;
8590       for (auto *D : ULE->decls()) {
8591         NamedDecl *InstD =
8592             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8593         Decls.addDecl(InstD, InstD->getAccess());
8594       }
8595       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8596           SemaRef.Context, /*NamingClass=*/nullptr,
8597           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8598           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8599     } else
8600       UnresolvedReductions.push_back(nullptr);
8601   }
8602   return getDerived().RebuildOMPInReductionClause(
8603       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8604       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8605 }
8606 
8607 template <typename Derived>
8608 OMPClause *
8609 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8610   llvm::SmallVector<Expr *, 16> Vars;
8611   Vars.reserve(C->varlist_size());
8612   for (auto *VE : C->varlists()) {
8613     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8614     if (EVar.isInvalid())
8615       return nullptr;
8616     Vars.push_back(EVar.get());
8617   }
8618   ExprResult Step = getDerived().TransformExpr(C->getStep());
8619   if (Step.isInvalid())
8620     return nullptr;
8621   return getDerived().RebuildOMPLinearClause(
8622       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
8623       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
8624 }
8625 
8626 template <typename Derived>
8627 OMPClause *
8628 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8629   llvm::SmallVector<Expr *, 16> Vars;
8630   Vars.reserve(C->varlist_size());
8631   for (auto *VE : C->varlists()) {
8632     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8633     if (EVar.isInvalid())
8634       return nullptr;
8635     Vars.push_back(EVar.get());
8636   }
8637   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8638   if (Alignment.isInvalid())
8639     return nullptr;
8640   return getDerived().RebuildOMPAlignedClause(
8641       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
8642       C->getColonLoc(), C->getEndLoc());
8643 }
8644 
8645 template <typename Derived>
8646 OMPClause *
8647 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8648   llvm::SmallVector<Expr *, 16> Vars;
8649   Vars.reserve(C->varlist_size());
8650   for (auto *VE : C->varlists()) {
8651     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8652     if (EVar.isInvalid())
8653       return nullptr;
8654     Vars.push_back(EVar.get());
8655   }
8656   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
8657                                              C->getLParenLoc(), C->getEndLoc());
8658 }
8659 
8660 template <typename Derived>
8661 OMPClause *
8662 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8663   llvm::SmallVector<Expr *, 16> Vars;
8664   Vars.reserve(C->varlist_size());
8665   for (auto *VE : C->varlists()) {
8666     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8667     if (EVar.isInvalid())
8668       return nullptr;
8669     Vars.push_back(EVar.get());
8670   }
8671   return getDerived().RebuildOMPCopyprivateClause(
8672       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8673 }
8674 
8675 template <typename Derived>
8676 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8677   llvm::SmallVector<Expr *, 16> Vars;
8678   Vars.reserve(C->varlist_size());
8679   for (auto *VE : C->varlists()) {
8680     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8681     if (EVar.isInvalid())
8682       return nullptr;
8683     Vars.push_back(EVar.get());
8684   }
8685   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
8686                                             C->getLParenLoc(), C->getEndLoc());
8687 }
8688 
8689 template <typename Derived>
8690 OMPClause *
8691 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8692   llvm::SmallVector<Expr *, 16> Vars;
8693   Vars.reserve(C->varlist_size());
8694   for (auto *VE : C->varlists()) {
8695     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8696     if (EVar.isInvalid())
8697       return nullptr;
8698     Vars.push_back(EVar.get());
8699   }
8700   return getDerived().RebuildOMPDependClause(
8701       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8702       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8703 }
8704 
8705 template <typename Derived>
8706 OMPClause *
8707 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8708   ExprResult E = getDerived().TransformExpr(C->getDevice());
8709   if (E.isInvalid())
8710     return nullptr;
8711   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
8712                                              C->getLParenLoc(), C->getEndLoc());
8713 }
8714 
8715 template <typename Derived>
8716 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8717   llvm::SmallVector<Expr *, 16> Vars;
8718   Vars.reserve(C->varlist_size());
8719   for (auto *VE : C->varlists()) {
8720     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8721     if (EVar.isInvalid())
8722       return nullptr;
8723     Vars.push_back(EVar.get());
8724   }
8725   return getDerived().RebuildOMPMapClause(
8726       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8727       C->getMapLoc(), C->getColonLoc(), Vars, C->getBeginLoc(),
8728       C->getLParenLoc(), C->getEndLoc());
8729 }
8730 
8731 template <typename Derived>
8732 OMPClause *
8733 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8734   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8735   if (E.isInvalid())
8736     return nullptr;
8737   return getDerived().RebuildOMPNumTeamsClause(
8738       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8739 }
8740 
8741 template <typename Derived>
8742 OMPClause *
8743 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8744   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8745   if (E.isInvalid())
8746     return nullptr;
8747   return getDerived().RebuildOMPThreadLimitClause(
8748       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8749 }
8750 
8751 template <typename Derived>
8752 OMPClause *
8753 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8754   ExprResult E = getDerived().TransformExpr(C->getPriority());
8755   if (E.isInvalid())
8756     return nullptr;
8757   return getDerived().RebuildOMPPriorityClause(
8758       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8759 }
8760 
8761 template <typename Derived>
8762 OMPClause *
8763 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8764   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8765   if (E.isInvalid())
8766     return nullptr;
8767   return getDerived().RebuildOMPGrainsizeClause(
8768       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8769 }
8770 
8771 template <typename Derived>
8772 OMPClause *
8773 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8774   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8775   if (E.isInvalid())
8776     return nullptr;
8777   return getDerived().RebuildOMPNumTasksClause(
8778       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8779 }
8780 
8781 template <typename Derived>
8782 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8783   ExprResult E = getDerived().TransformExpr(C->getHint());
8784   if (E.isInvalid())
8785     return nullptr;
8786   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
8787                                            C->getLParenLoc(), C->getEndLoc());
8788 }
8789 
8790 template <typename Derived>
8791 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8792     OMPDistScheduleClause *C) {
8793   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8794   if (E.isInvalid())
8795     return nullptr;
8796   return getDerived().RebuildOMPDistScheduleClause(
8797       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8798       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8799 }
8800 
8801 template <typename Derived>
8802 OMPClause *
8803 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8804   return C;
8805 }
8806 
8807 template <typename Derived>
8808 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8809   llvm::SmallVector<Expr *, 16> Vars;
8810   Vars.reserve(C->varlist_size());
8811   for (auto *VE : C->varlists()) {
8812     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8813     if (EVar.isInvalid())
8814       return 0;
8815     Vars.push_back(EVar.get());
8816   }
8817   return getDerived().RebuildOMPToClause(Vars, C->getBeginLoc(),
8818                                          C->getLParenLoc(), C->getEndLoc());
8819 }
8820 
8821 template <typename Derived>
8822 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8823   llvm::SmallVector<Expr *, 16> Vars;
8824   Vars.reserve(C->varlist_size());
8825   for (auto *VE : C->varlists()) {
8826     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8827     if (EVar.isInvalid())
8828       return 0;
8829     Vars.push_back(EVar.get());
8830   }
8831   return getDerived().RebuildOMPFromClause(Vars, C->getBeginLoc(),
8832                                            C->getLParenLoc(), C->getEndLoc());
8833 }
8834 
8835 template <typename Derived>
8836 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8837     OMPUseDevicePtrClause *C) {
8838   llvm::SmallVector<Expr *, 16> Vars;
8839   Vars.reserve(C->varlist_size());
8840   for (auto *VE : C->varlists()) {
8841     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8842     if (EVar.isInvalid())
8843       return nullptr;
8844     Vars.push_back(EVar.get());
8845   }
8846   return getDerived().RebuildOMPUseDevicePtrClause(
8847       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8848 }
8849 
8850 template <typename Derived>
8851 OMPClause *
8852 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8853   llvm::SmallVector<Expr *, 16> Vars;
8854   Vars.reserve(C->varlist_size());
8855   for (auto *VE : C->varlists()) {
8856     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8857     if (EVar.isInvalid())
8858       return nullptr;
8859     Vars.push_back(EVar.get());
8860   }
8861   return getDerived().RebuildOMPIsDevicePtrClause(
8862       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8863 }
8864 
8865 //===----------------------------------------------------------------------===//
8866 // Expression transformation
8867 //===----------------------------------------------------------------------===//
8868 template<typename Derived>
8869 ExprResult
8870 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8871   if (!E->isTypeDependent())
8872     return E;
8873 
8874   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8875                                             E->getIdentType());
8876 }
8877 
8878 template<typename Derived>
8879 ExprResult
8880 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8881   NestedNameSpecifierLoc QualifierLoc;
8882   if (E->getQualifierLoc()) {
8883     QualifierLoc
8884       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8885     if (!QualifierLoc)
8886       return ExprError();
8887   }
8888 
8889   ValueDecl *ND
8890     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8891                                                          E->getDecl()));
8892   if (!ND)
8893     return ExprError();
8894 
8895   DeclarationNameInfo NameInfo = E->getNameInfo();
8896   if (NameInfo.getName()) {
8897     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8898     if (!NameInfo.getName())
8899       return ExprError();
8900   }
8901 
8902   if (!getDerived().AlwaysRebuild() &&
8903       QualifierLoc == E->getQualifierLoc() &&
8904       ND == E->getDecl() &&
8905       NameInfo.getName() == E->getDecl()->getDeclName() &&
8906       !E->hasExplicitTemplateArgs()) {
8907 
8908     // Mark it referenced in the new context regardless.
8909     // FIXME: this is a bit instantiation-specific.
8910     SemaRef.MarkDeclRefReferenced(E);
8911 
8912     return E;
8913   }
8914 
8915   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8916   if (E->hasExplicitTemplateArgs()) {
8917     TemplateArgs = &TransArgs;
8918     TransArgs.setLAngleLoc(E->getLAngleLoc());
8919     TransArgs.setRAngleLoc(E->getRAngleLoc());
8920     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8921                                                 E->getNumTemplateArgs(),
8922                                                 TransArgs))
8923       return ExprError();
8924   }
8925 
8926   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8927                                          TemplateArgs);
8928 }
8929 
8930 template<typename Derived>
8931 ExprResult
8932 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8933   return E;
8934 }
8935 
8936 template <typename Derived>
8937 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
8938     FixedPointLiteral *E) {
8939   return E;
8940 }
8941 
8942 template<typename Derived>
8943 ExprResult
8944 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8945   return E;
8946 }
8947 
8948 template<typename Derived>
8949 ExprResult
8950 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8951   return E;
8952 }
8953 
8954 template<typename Derived>
8955 ExprResult
8956 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8957   return E;
8958 }
8959 
8960 template<typename Derived>
8961 ExprResult
8962 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8963   return E;
8964 }
8965 
8966 template<typename Derived>
8967 ExprResult
8968 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8969   if (FunctionDecl *FD = E->getDirectCallee())
8970     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
8971   return SemaRef.MaybeBindToTemporary(E);
8972 }
8973 
8974 template<typename Derived>
8975 ExprResult
8976 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8977   ExprResult ControllingExpr =
8978     getDerived().TransformExpr(E->getControllingExpr());
8979   if (ControllingExpr.isInvalid())
8980     return ExprError();
8981 
8982   SmallVector<Expr *, 4> AssocExprs;
8983   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8984   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8985     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8986     if (TS) {
8987       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8988       if (!AssocType)
8989         return ExprError();
8990       AssocTypes.push_back(AssocType);
8991     } else {
8992       AssocTypes.push_back(nullptr);
8993     }
8994 
8995     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8996     if (AssocExpr.isInvalid())
8997       return ExprError();
8998     AssocExprs.push_back(AssocExpr.get());
8999   }
9000 
9001   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9002                                                   E->getDefaultLoc(),
9003                                                   E->getRParenLoc(),
9004                                                   ControllingExpr.get(),
9005                                                   AssocTypes,
9006                                                   AssocExprs);
9007 }
9008 
9009 template<typename Derived>
9010 ExprResult
9011 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9012   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9013   if (SubExpr.isInvalid())
9014     return ExprError();
9015 
9016   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9017     return E;
9018 
9019   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9020                                        E->getRParen());
9021 }
9022 
9023 /// The operand of a unary address-of operator has special rules: it's
9024 /// allowed to refer to a non-static member of a class even if there's no 'this'
9025 /// object available.
9026 template<typename Derived>
9027 ExprResult
9028 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9029   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9030     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9031   else
9032     return getDerived().TransformExpr(E);
9033 }
9034 
9035 template<typename Derived>
9036 ExprResult
9037 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9038   ExprResult SubExpr;
9039   if (E->getOpcode() == UO_AddrOf)
9040     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9041   else
9042     SubExpr = TransformExpr(E->getSubExpr());
9043   if (SubExpr.isInvalid())
9044     return ExprError();
9045 
9046   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9047     return E;
9048 
9049   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9050                                            E->getOpcode(),
9051                                            SubExpr.get());
9052 }
9053 
9054 template<typename Derived>
9055 ExprResult
9056 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9057   // Transform the type.
9058   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9059   if (!Type)
9060     return ExprError();
9061 
9062   // Transform all of the components into components similar to what the
9063   // parser uses.
9064   // FIXME: It would be slightly more efficient in the non-dependent case to
9065   // just map FieldDecls, rather than requiring the rebuilder to look for
9066   // the fields again. However, __builtin_offsetof is rare enough in
9067   // template code that we don't care.
9068   bool ExprChanged = false;
9069   typedef Sema::OffsetOfComponent Component;
9070   SmallVector<Component, 4> Components;
9071   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9072     const OffsetOfNode &ON = E->getComponent(I);
9073     Component Comp;
9074     Comp.isBrackets = true;
9075     Comp.LocStart = ON.getSourceRange().getBegin();
9076     Comp.LocEnd = ON.getSourceRange().getEnd();
9077     switch (ON.getKind()) {
9078     case OffsetOfNode::Array: {
9079       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9080       ExprResult Index = getDerived().TransformExpr(FromIndex);
9081       if (Index.isInvalid())
9082         return ExprError();
9083 
9084       ExprChanged = ExprChanged || Index.get() != FromIndex;
9085       Comp.isBrackets = true;
9086       Comp.U.E = Index.get();
9087       break;
9088     }
9089 
9090     case OffsetOfNode::Field:
9091     case OffsetOfNode::Identifier:
9092       Comp.isBrackets = false;
9093       Comp.U.IdentInfo = ON.getFieldName();
9094       if (!Comp.U.IdentInfo)
9095         continue;
9096 
9097       break;
9098 
9099     case OffsetOfNode::Base:
9100       // Will be recomputed during the rebuild.
9101       continue;
9102     }
9103 
9104     Components.push_back(Comp);
9105   }
9106 
9107   // If nothing changed, retain the existing expression.
9108   if (!getDerived().AlwaysRebuild() &&
9109       Type == E->getTypeSourceInfo() &&
9110       !ExprChanged)
9111     return E;
9112 
9113   // Build a new offsetof expression.
9114   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9115                                           Components, E->getRParenLoc());
9116 }
9117 
9118 template<typename Derived>
9119 ExprResult
9120 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9121   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9122          "opaque value expression requires transformation");
9123   return E;
9124 }
9125 
9126 template<typename Derived>
9127 ExprResult
9128 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9129   return E;
9130 }
9131 
9132 template<typename Derived>
9133 ExprResult
9134 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9135   // Rebuild the syntactic form.  The original syntactic form has
9136   // opaque-value expressions in it, so strip those away and rebuild
9137   // the result.  This is a really awful way of doing this, but the
9138   // better solution (rebuilding the semantic expressions and
9139   // rebinding OVEs as necessary) doesn't work; we'd need
9140   // TreeTransform to not strip away implicit conversions.
9141   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9142   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9143   if (result.isInvalid()) return ExprError();
9144 
9145   // If that gives us a pseudo-object result back, the pseudo-object
9146   // expression must have been an lvalue-to-rvalue conversion which we
9147   // should reapply.
9148   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9149     result = SemaRef.checkPseudoObjectRValue(result.get());
9150 
9151   return result;
9152 }
9153 
9154 template<typename Derived>
9155 ExprResult
9156 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9157                                                 UnaryExprOrTypeTraitExpr *E) {
9158   if (E->isArgumentType()) {
9159     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9160 
9161     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9162     if (!NewT)
9163       return ExprError();
9164 
9165     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9166       return E;
9167 
9168     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9169                                                     E->getKind(),
9170                                                     E->getSourceRange());
9171   }
9172 
9173   // C++0x [expr.sizeof]p1:
9174   //   The operand is either an expression, which is an unevaluated operand
9175   //   [...]
9176   EnterExpressionEvaluationContext Unevaluated(
9177       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9178       Sema::ReuseLambdaContextDecl);
9179 
9180   // Try to recover if we have something like sizeof(T::X) where X is a type.
9181   // Notably, there must be *exactly* one set of parens if X is a type.
9182   TypeSourceInfo *RecoveryTSI = nullptr;
9183   ExprResult SubExpr;
9184   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9185   if (auto *DRE =
9186           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9187     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9188         PE, DRE, false, &RecoveryTSI);
9189   else
9190     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9191 
9192   if (RecoveryTSI) {
9193     return getDerived().RebuildUnaryExprOrTypeTrait(
9194         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9195   } else if (SubExpr.isInvalid())
9196     return ExprError();
9197 
9198   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9199     return E;
9200 
9201   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9202                                                   E->getOperatorLoc(),
9203                                                   E->getKind(),
9204                                                   E->getSourceRange());
9205 }
9206 
9207 template<typename Derived>
9208 ExprResult
9209 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9210   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9211   if (LHS.isInvalid())
9212     return ExprError();
9213 
9214   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9215   if (RHS.isInvalid())
9216     return ExprError();
9217 
9218 
9219   if (!getDerived().AlwaysRebuild() &&
9220       LHS.get() == E->getLHS() &&
9221       RHS.get() == E->getRHS())
9222     return E;
9223 
9224   return getDerived().RebuildArraySubscriptExpr(
9225       LHS.get(),
9226       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9227 }
9228 
9229 template <typename Derived>
9230 ExprResult
9231 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9232   ExprResult Base = getDerived().TransformExpr(E->getBase());
9233   if (Base.isInvalid())
9234     return ExprError();
9235 
9236   ExprResult LowerBound;
9237   if (E->getLowerBound()) {
9238     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9239     if (LowerBound.isInvalid())
9240       return ExprError();
9241   }
9242 
9243   ExprResult Length;
9244   if (E->getLength()) {
9245     Length = getDerived().TransformExpr(E->getLength());
9246     if (Length.isInvalid())
9247       return ExprError();
9248   }
9249 
9250   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9251       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9252     return E;
9253 
9254   return getDerived().RebuildOMPArraySectionExpr(
9255       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9256       Length.get(), E->getRBracketLoc());
9257 }
9258 
9259 template<typename Derived>
9260 ExprResult
9261 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9262   // Transform the callee.
9263   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9264   if (Callee.isInvalid())
9265     return ExprError();
9266 
9267   // Transform arguments.
9268   bool ArgChanged = false;
9269   SmallVector<Expr*, 8> Args;
9270   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9271                                   &ArgChanged))
9272     return ExprError();
9273 
9274   if (!getDerived().AlwaysRebuild() &&
9275       Callee.get() == E->getCallee() &&
9276       !ArgChanged)
9277     return SemaRef.MaybeBindToTemporary(E);
9278 
9279   // FIXME: Wrong source location information for the '('.
9280   SourceLocation FakeLParenLoc
9281     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9282   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9283                                       Args,
9284                                       E->getRParenLoc());
9285 }
9286 
9287 template<typename Derived>
9288 ExprResult
9289 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9290   ExprResult Base = getDerived().TransformExpr(E->getBase());
9291   if (Base.isInvalid())
9292     return ExprError();
9293 
9294   NestedNameSpecifierLoc QualifierLoc;
9295   if (E->hasQualifier()) {
9296     QualifierLoc
9297       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9298 
9299     if (!QualifierLoc)
9300       return ExprError();
9301   }
9302   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9303 
9304   ValueDecl *Member
9305     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9306                                                          E->getMemberDecl()));
9307   if (!Member)
9308     return ExprError();
9309 
9310   NamedDecl *FoundDecl = E->getFoundDecl();
9311   if (FoundDecl == E->getMemberDecl()) {
9312     FoundDecl = Member;
9313   } else {
9314     FoundDecl = cast_or_null<NamedDecl>(
9315                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9316     if (!FoundDecl)
9317       return ExprError();
9318   }
9319 
9320   if (!getDerived().AlwaysRebuild() &&
9321       Base.get() == E->getBase() &&
9322       QualifierLoc == E->getQualifierLoc() &&
9323       Member == E->getMemberDecl() &&
9324       FoundDecl == E->getFoundDecl() &&
9325       !E->hasExplicitTemplateArgs()) {
9326 
9327     // Mark it referenced in the new context regardless.
9328     // FIXME: this is a bit instantiation-specific.
9329     SemaRef.MarkMemberReferenced(E);
9330 
9331     return E;
9332   }
9333 
9334   TemplateArgumentListInfo TransArgs;
9335   if (E->hasExplicitTemplateArgs()) {
9336     TransArgs.setLAngleLoc(E->getLAngleLoc());
9337     TransArgs.setRAngleLoc(E->getRAngleLoc());
9338     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9339                                                 E->getNumTemplateArgs(),
9340                                                 TransArgs))
9341       return ExprError();
9342   }
9343 
9344   // FIXME: Bogus source location for the operator
9345   SourceLocation FakeOperatorLoc =
9346       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9347 
9348   // FIXME: to do this check properly, we will need to preserve the
9349   // first-qualifier-in-scope here, just in case we had a dependent
9350   // base (and therefore couldn't do the check) and a
9351   // nested-name-qualifier (and therefore could do the lookup).
9352   NamedDecl *FirstQualifierInScope = nullptr;
9353   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9354   if (MemberNameInfo.getName()) {
9355     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9356     if (!MemberNameInfo.getName())
9357       return ExprError();
9358   }
9359 
9360   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9361                                         E->isArrow(),
9362                                         QualifierLoc,
9363                                         TemplateKWLoc,
9364                                         MemberNameInfo,
9365                                         Member,
9366                                         FoundDecl,
9367                                         (E->hasExplicitTemplateArgs()
9368                                            ? &TransArgs : nullptr),
9369                                         FirstQualifierInScope);
9370 }
9371 
9372 template<typename Derived>
9373 ExprResult
9374 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9375   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9376   if (LHS.isInvalid())
9377     return ExprError();
9378 
9379   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9380   if (RHS.isInvalid())
9381     return ExprError();
9382 
9383   if (!getDerived().AlwaysRebuild() &&
9384       LHS.get() == E->getLHS() &&
9385       RHS.get() == E->getRHS())
9386     return E;
9387 
9388   Sema::FPContractStateRAII FPContractState(getSema());
9389   getSema().FPFeatures = E->getFPFeatures();
9390 
9391   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9392                                             LHS.get(), RHS.get());
9393 }
9394 
9395 template<typename Derived>
9396 ExprResult
9397 TreeTransform<Derived>::TransformCompoundAssignOperator(
9398                                                       CompoundAssignOperator *E) {
9399   return getDerived().TransformBinaryOperator(E);
9400 }
9401 
9402 template<typename Derived>
9403 ExprResult TreeTransform<Derived>::
9404 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9405   // Just rebuild the common and RHS expressions and see whether we
9406   // get any changes.
9407 
9408   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9409   if (commonExpr.isInvalid())
9410     return ExprError();
9411 
9412   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9413   if (rhs.isInvalid())
9414     return ExprError();
9415 
9416   if (!getDerived().AlwaysRebuild() &&
9417       commonExpr.get() == e->getCommon() &&
9418       rhs.get() == e->getFalseExpr())
9419     return e;
9420 
9421   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9422                                                  e->getQuestionLoc(),
9423                                                  nullptr,
9424                                                  e->getColonLoc(),
9425                                                  rhs.get());
9426 }
9427 
9428 template<typename Derived>
9429 ExprResult
9430 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9431   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9432   if (Cond.isInvalid())
9433     return ExprError();
9434 
9435   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9436   if (LHS.isInvalid())
9437     return ExprError();
9438 
9439   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9440   if (RHS.isInvalid())
9441     return ExprError();
9442 
9443   if (!getDerived().AlwaysRebuild() &&
9444       Cond.get() == E->getCond() &&
9445       LHS.get() == E->getLHS() &&
9446       RHS.get() == E->getRHS())
9447     return E;
9448 
9449   return getDerived().RebuildConditionalOperator(Cond.get(),
9450                                                  E->getQuestionLoc(),
9451                                                  LHS.get(),
9452                                                  E->getColonLoc(),
9453                                                  RHS.get());
9454 }
9455 
9456 template<typename Derived>
9457 ExprResult
9458 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9459   // Implicit casts are eliminated during transformation, since they
9460   // will be recomputed by semantic analysis after transformation.
9461   return getDerived().TransformExpr(E->getSubExprAsWritten());
9462 }
9463 
9464 template<typename Derived>
9465 ExprResult
9466 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9467   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9468   if (!Type)
9469     return ExprError();
9470 
9471   ExprResult SubExpr
9472     = getDerived().TransformExpr(E->getSubExprAsWritten());
9473   if (SubExpr.isInvalid())
9474     return ExprError();
9475 
9476   if (!getDerived().AlwaysRebuild() &&
9477       Type == E->getTypeInfoAsWritten() &&
9478       SubExpr.get() == E->getSubExpr())
9479     return E;
9480 
9481   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9482                                             Type,
9483                                             E->getRParenLoc(),
9484                                             SubExpr.get());
9485 }
9486 
9487 template<typename Derived>
9488 ExprResult
9489 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9490   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9491   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9492   if (!NewT)
9493     return ExprError();
9494 
9495   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9496   if (Init.isInvalid())
9497     return ExprError();
9498 
9499   if (!getDerived().AlwaysRebuild() &&
9500       OldT == NewT &&
9501       Init.get() == E->getInitializer())
9502     return SemaRef.MaybeBindToTemporary(E);
9503 
9504   // Note: the expression type doesn't necessarily match the
9505   // type-as-written, but that's okay, because it should always be
9506   // derivable from the initializer.
9507 
9508   return getDerived().RebuildCompoundLiteralExpr(
9509       E->getLParenLoc(), NewT,
9510       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
9511 }
9512 
9513 template<typename Derived>
9514 ExprResult
9515 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9516   ExprResult Base = getDerived().TransformExpr(E->getBase());
9517   if (Base.isInvalid())
9518     return ExprError();
9519 
9520   if (!getDerived().AlwaysRebuild() &&
9521       Base.get() == E->getBase())
9522     return E;
9523 
9524   // FIXME: Bad source location
9525   SourceLocation FakeOperatorLoc =
9526       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
9527   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9528                                                   E->getAccessorLoc(),
9529                                                   E->getAccessor());
9530 }
9531 
9532 template<typename Derived>
9533 ExprResult
9534 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9535   if (InitListExpr *Syntactic = E->getSyntacticForm())
9536     E = Syntactic;
9537 
9538   bool InitChanged = false;
9539 
9540   SmallVector<Expr*, 4> Inits;
9541   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9542                                   Inits, &InitChanged))
9543     return ExprError();
9544 
9545   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9546     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9547     // in some cases. We can't reuse it in general, because the syntactic and
9548     // semantic forms are linked, and we can't know that semantic form will
9549     // match even if the syntactic form does.
9550   }
9551 
9552   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9553                                       E->getRBraceLoc());
9554 }
9555 
9556 template<typename Derived>
9557 ExprResult
9558 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9559   Designation Desig;
9560 
9561   // transform the initializer value
9562   ExprResult Init = getDerived().TransformExpr(E->getInit());
9563   if (Init.isInvalid())
9564     return ExprError();
9565 
9566   // transform the designators.
9567   SmallVector<Expr*, 4> ArrayExprs;
9568   bool ExprChanged = false;
9569   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9570     if (D.isFieldDesignator()) {
9571       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9572                                                D.getDotLoc(),
9573                                                D.getFieldLoc()));
9574       if (D.getField()) {
9575         FieldDecl *Field = cast_or_null<FieldDecl>(
9576             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9577         if (Field != D.getField())
9578           // Rebuild the expression when the transformed FieldDecl is
9579           // different to the already assigned FieldDecl.
9580           ExprChanged = true;
9581       } else {
9582         // Ensure that the designator expression is rebuilt when there isn't
9583         // a resolved FieldDecl in the designator as we don't want to assign
9584         // a FieldDecl to a pattern designator that will be instantiated again.
9585         ExprChanged = true;
9586       }
9587       continue;
9588     }
9589 
9590     if (D.isArrayDesignator()) {
9591       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9592       if (Index.isInvalid())
9593         return ExprError();
9594 
9595       Desig.AddDesignator(
9596           Designator::getArray(Index.get(), D.getLBracketLoc()));
9597 
9598       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9599       ArrayExprs.push_back(Index.get());
9600       continue;
9601     }
9602 
9603     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9604     ExprResult Start
9605       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9606     if (Start.isInvalid())
9607       return ExprError();
9608 
9609     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9610     if (End.isInvalid())
9611       return ExprError();
9612 
9613     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9614                                                   End.get(),
9615                                                   D.getLBracketLoc(),
9616                                                   D.getEllipsisLoc()));
9617 
9618     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9619                   End.get() != E->getArrayRangeEnd(D);
9620 
9621     ArrayExprs.push_back(Start.get());
9622     ArrayExprs.push_back(End.get());
9623   }
9624 
9625   if (!getDerived().AlwaysRebuild() &&
9626       Init.get() == E->getInit() &&
9627       !ExprChanged)
9628     return E;
9629 
9630   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9631                                                 E->getEqualOrColonLoc(),
9632                                                 E->usesGNUSyntax(), Init.get());
9633 }
9634 
9635 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9636 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9637 template<typename Derived>
9638 ExprResult
9639 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9640     DesignatedInitUpdateExpr *E) {
9641   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9642                    "initializer");
9643   return ExprError();
9644 }
9645 
9646 template<typename Derived>
9647 ExprResult
9648 TreeTransform<Derived>::TransformNoInitExpr(
9649     NoInitExpr *E) {
9650   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9651   return ExprError();
9652 }
9653 
9654 template<typename Derived>
9655 ExprResult
9656 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9657   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9658   return ExprError();
9659 }
9660 
9661 template<typename Derived>
9662 ExprResult
9663 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9664   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9665   return ExprError();
9666 }
9667 
9668 template<typename Derived>
9669 ExprResult
9670 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9671                                                      ImplicitValueInitExpr *E) {
9672   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
9673 
9674   // FIXME: Will we ever have proper type location here? Will we actually
9675   // need to transform the type?
9676   QualType T = getDerived().TransformType(E->getType());
9677   if (T.isNull())
9678     return ExprError();
9679 
9680   if (!getDerived().AlwaysRebuild() &&
9681       T == E->getType())
9682     return E;
9683 
9684   return getDerived().RebuildImplicitValueInitExpr(T);
9685 }
9686 
9687 template<typename Derived>
9688 ExprResult
9689 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9690   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9691   if (!TInfo)
9692     return ExprError();
9693 
9694   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9695   if (SubExpr.isInvalid())
9696     return ExprError();
9697 
9698   if (!getDerived().AlwaysRebuild() &&
9699       TInfo == E->getWrittenTypeInfo() &&
9700       SubExpr.get() == E->getSubExpr())
9701     return E;
9702 
9703   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9704                                        TInfo, E->getRParenLoc());
9705 }
9706 
9707 template<typename Derived>
9708 ExprResult
9709 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9710   bool ArgumentChanged = false;
9711   SmallVector<Expr*, 4> Inits;
9712   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9713                      &ArgumentChanged))
9714     return ExprError();
9715 
9716   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9717                                            Inits,
9718                                            E->getRParenLoc());
9719 }
9720 
9721 /// Transform an address-of-label expression.
9722 ///
9723 /// By default, the transformation of an address-of-label expression always
9724 /// rebuilds the expression, so that the label identifier can be resolved to
9725 /// the corresponding label statement by semantic analysis.
9726 template<typename Derived>
9727 ExprResult
9728 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9729   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9730                                         E->getLabel());
9731   if (!LD)
9732     return ExprError();
9733 
9734   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9735                                            cast<LabelDecl>(LD));
9736 }
9737 
9738 template<typename Derived>
9739 ExprResult
9740 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9741   SemaRef.ActOnStartStmtExpr();
9742   StmtResult SubStmt
9743     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9744   if (SubStmt.isInvalid()) {
9745     SemaRef.ActOnStmtExprError();
9746     return ExprError();
9747   }
9748 
9749   if (!getDerived().AlwaysRebuild() &&
9750       SubStmt.get() == E->getSubStmt()) {
9751     // Calling this an 'error' is unintuitive, but it does the right thing.
9752     SemaRef.ActOnStmtExprError();
9753     return SemaRef.MaybeBindToTemporary(E);
9754   }
9755 
9756   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9757                                       SubStmt.get(),
9758                                       E->getRParenLoc());
9759 }
9760 
9761 template<typename Derived>
9762 ExprResult
9763 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9764   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9765   if (Cond.isInvalid())
9766     return ExprError();
9767 
9768   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9769   if (LHS.isInvalid())
9770     return ExprError();
9771 
9772   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9773   if (RHS.isInvalid())
9774     return ExprError();
9775 
9776   if (!getDerived().AlwaysRebuild() &&
9777       Cond.get() == E->getCond() &&
9778       LHS.get() == E->getLHS() &&
9779       RHS.get() == E->getRHS())
9780     return E;
9781 
9782   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9783                                         Cond.get(), LHS.get(), RHS.get(),
9784                                         E->getRParenLoc());
9785 }
9786 
9787 template<typename Derived>
9788 ExprResult
9789 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9790   return E;
9791 }
9792 
9793 template<typename Derived>
9794 ExprResult
9795 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9796   switch (E->getOperator()) {
9797   case OO_New:
9798   case OO_Delete:
9799   case OO_Array_New:
9800   case OO_Array_Delete:
9801     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9802 
9803   case OO_Call: {
9804     // This is a call to an object's operator().
9805     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9806 
9807     // Transform the object itself.
9808     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9809     if (Object.isInvalid())
9810       return ExprError();
9811 
9812     // FIXME: Poor location information
9813     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9814         static_cast<Expr *>(Object.get())->getEndLoc());
9815 
9816     // Transform the call arguments.
9817     SmallVector<Expr*, 8> Args;
9818     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9819                                     Args))
9820       return ExprError();
9821 
9822     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
9823                                         E->getEndLoc());
9824   }
9825 
9826 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9827   case OO_##Name:
9828 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9829 #include "clang/Basic/OperatorKinds.def"
9830   case OO_Subscript:
9831     // Handled below.
9832     break;
9833 
9834   case OO_Conditional:
9835     llvm_unreachable("conditional operator is not actually overloadable");
9836 
9837   case OO_None:
9838   case NUM_OVERLOADED_OPERATORS:
9839     llvm_unreachable("not an overloaded operator?");
9840   }
9841 
9842   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9843   if (Callee.isInvalid())
9844     return ExprError();
9845 
9846   ExprResult First;
9847   if (E->getOperator() == OO_Amp)
9848     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9849   else
9850     First = getDerived().TransformExpr(E->getArg(0));
9851   if (First.isInvalid())
9852     return ExprError();
9853 
9854   ExprResult Second;
9855   if (E->getNumArgs() == 2) {
9856     Second = getDerived().TransformExpr(E->getArg(1));
9857     if (Second.isInvalid())
9858       return ExprError();
9859   }
9860 
9861   if (!getDerived().AlwaysRebuild() &&
9862       Callee.get() == E->getCallee() &&
9863       First.get() == E->getArg(0) &&
9864       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9865     return SemaRef.MaybeBindToTemporary(E);
9866 
9867   Sema::FPContractStateRAII FPContractState(getSema());
9868   getSema().FPFeatures = E->getFPFeatures();
9869 
9870   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9871                                                  E->getOperatorLoc(),
9872                                                  Callee.get(),
9873                                                  First.get(),
9874                                                  Second.get());
9875 }
9876 
9877 template<typename Derived>
9878 ExprResult
9879 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9880   return getDerived().TransformCallExpr(E);
9881 }
9882 
9883 template<typename Derived>
9884 ExprResult
9885 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9886   // Transform the callee.
9887   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9888   if (Callee.isInvalid())
9889     return ExprError();
9890 
9891   // Transform exec config.
9892   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9893   if (EC.isInvalid())
9894     return ExprError();
9895 
9896   // Transform arguments.
9897   bool ArgChanged = false;
9898   SmallVector<Expr*, 8> Args;
9899   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9900                                   &ArgChanged))
9901     return ExprError();
9902 
9903   if (!getDerived().AlwaysRebuild() &&
9904       Callee.get() == E->getCallee() &&
9905       !ArgChanged)
9906     return SemaRef.MaybeBindToTemporary(E);
9907 
9908   // FIXME: Wrong source location information for the '('.
9909   SourceLocation FakeLParenLoc
9910     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9911   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9912                                       Args,
9913                                       E->getRParenLoc(), EC.get());
9914 }
9915 
9916 template<typename Derived>
9917 ExprResult
9918 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9919   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9920   if (!Type)
9921     return ExprError();
9922 
9923   ExprResult SubExpr
9924     = getDerived().TransformExpr(E->getSubExprAsWritten());
9925   if (SubExpr.isInvalid())
9926     return ExprError();
9927 
9928   if (!getDerived().AlwaysRebuild() &&
9929       Type == E->getTypeInfoAsWritten() &&
9930       SubExpr.get() == E->getSubExpr())
9931     return E;
9932   return getDerived().RebuildCXXNamedCastExpr(
9933       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9934       Type, E->getAngleBrackets().getEnd(),
9935       // FIXME. this should be '(' location
9936       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9937 }
9938 
9939 template<typename Derived>
9940 ExprResult
9941 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9942   return getDerived().TransformCXXNamedCastExpr(E);
9943 }
9944 
9945 template<typename Derived>
9946 ExprResult
9947 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9948   return getDerived().TransformCXXNamedCastExpr(E);
9949 }
9950 
9951 template<typename Derived>
9952 ExprResult
9953 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9954                                                       CXXReinterpretCastExpr *E) {
9955   return getDerived().TransformCXXNamedCastExpr(E);
9956 }
9957 
9958 template<typename Derived>
9959 ExprResult
9960 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9961   return getDerived().TransformCXXNamedCastExpr(E);
9962 }
9963 
9964 template<typename Derived>
9965 ExprResult
9966 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9967                                                      CXXFunctionalCastExpr *E) {
9968   TypeSourceInfo *Type =
9969       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
9970   if (!Type)
9971     return ExprError();
9972 
9973   ExprResult SubExpr
9974     = getDerived().TransformExpr(E->getSubExprAsWritten());
9975   if (SubExpr.isInvalid())
9976     return ExprError();
9977 
9978   if (!getDerived().AlwaysRebuild() &&
9979       Type == E->getTypeInfoAsWritten() &&
9980       SubExpr.get() == E->getSubExpr())
9981     return E;
9982 
9983   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9984                                                    E->getLParenLoc(),
9985                                                    SubExpr.get(),
9986                                                    E->getRParenLoc(),
9987                                                    E->isListInitialization());
9988 }
9989 
9990 template<typename Derived>
9991 ExprResult
9992 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9993   if (E->isTypeOperand()) {
9994     TypeSourceInfo *TInfo
9995       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9996     if (!TInfo)
9997       return ExprError();
9998 
9999     if (!getDerived().AlwaysRebuild() &&
10000         TInfo == E->getTypeOperandSourceInfo())
10001       return E;
10002 
10003     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10004                                              TInfo, E->getEndLoc());
10005   }
10006 
10007   // We don't know whether the subexpression is potentially evaluated until
10008   // after we perform semantic analysis.  We speculatively assume it is
10009   // unevaluated; it will get fixed later if the subexpression is in fact
10010   // potentially evaluated.
10011   EnterExpressionEvaluationContext Unevaluated(
10012       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10013       Sema::ReuseLambdaContextDecl);
10014 
10015   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10016   if (SubExpr.isInvalid())
10017     return ExprError();
10018 
10019   if (!getDerived().AlwaysRebuild() &&
10020       SubExpr.get() == E->getExprOperand())
10021     return E;
10022 
10023   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10024                                            SubExpr.get(), E->getEndLoc());
10025 }
10026 
10027 template<typename Derived>
10028 ExprResult
10029 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10030   if (E->isTypeOperand()) {
10031     TypeSourceInfo *TInfo
10032       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10033     if (!TInfo)
10034       return ExprError();
10035 
10036     if (!getDerived().AlwaysRebuild() &&
10037         TInfo == E->getTypeOperandSourceInfo())
10038       return E;
10039 
10040     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10041                                              TInfo, E->getEndLoc());
10042   }
10043 
10044   EnterExpressionEvaluationContext Unevaluated(
10045       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10046 
10047   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10048   if (SubExpr.isInvalid())
10049     return ExprError();
10050 
10051   if (!getDerived().AlwaysRebuild() &&
10052       SubExpr.get() == E->getExprOperand())
10053     return E;
10054 
10055   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10056                                            SubExpr.get(), E->getEndLoc());
10057 }
10058 
10059 template<typename Derived>
10060 ExprResult
10061 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10062   return E;
10063 }
10064 
10065 template<typename Derived>
10066 ExprResult
10067 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10068                                                      CXXNullPtrLiteralExpr *E) {
10069   return E;
10070 }
10071 
10072 template<typename Derived>
10073 ExprResult
10074 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10075   QualType T = getSema().getCurrentThisType();
10076 
10077   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10078     // Make sure that we capture 'this'.
10079     getSema().CheckCXXThisCapture(E->getBeginLoc());
10080     return E;
10081   }
10082 
10083   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10084 }
10085 
10086 template<typename Derived>
10087 ExprResult
10088 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10089   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10090   if (SubExpr.isInvalid())
10091     return ExprError();
10092 
10093   if (!getDerived().AlwaysRebuild() &&
10094       SubExpr.get() == E->getSubExpr())
10095     return E;
10096 
10097   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10098                                           E->isThrownVariableInScope());
10099 }
10100 
10101 template<typename Derived>
10102 ExprResult
10103 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10104   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10105       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10106   if (!Param)
10107     return ExprError();
10108 
10109   if (!getDerived().AlwaysRebuild() &&
10110       Param == E->getParam())
10111     return E;
10112 
10113   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10114 }
10115 
10116 template<typename Derived>
10117 ExprResult
10118 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10119   FieldDecl *Field = cast_or_null<FieldDecl>(
10120       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10121   if (!Field)
10122     return ExprError();
10123 
10124   if (!getDerived().AlwaysRebuild() && Field == E->getField())
10125     return E;
10126 
10127   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10128 }
10129 
10130 template<typename Derived>
10131 ExprResult
10132 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10133                                                     CXXScalarValueInitExpr *E) {
10134   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10135   if (!T)
10136     return ExprError();
10137 
10138   if (!getDerived().AlwaysRebuild() &&
10139       T == E->getTypeSourceInfo())
10140     return E;
10141 
10142   return getDerived().RebuildCXXScalarValueInitExpr(T,
10143                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10144                                                     E->getRParenLoc());
10145 }
10146 
10147 template<typename Derived>
10148 ExprResult
10149 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10150   // Transform the type that we're allocating
10151   TypeSourceInfo *AllocTypeInfo =
10152       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10153   if (!AllocTypeInfo)
10154     return ExprError();
10155 
10156   // Transform the size of the array we're allocating (if any).
10157   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
10158   if (ArraySize.isInvalid())
10159     return ExprError();
10160 
10161   // Transform the placement arguments (if any).
10162   bool ArgumentChanged = false;
10163   SmallVector<Expr*, 8> PlacementArgs;
10164   if (getDerived().TransformExprs(E->getPlacementArgs(),
10165                                   E->getNumPlacementArgs(), true,
10166                                   PlacementArgs, &ArgumentChanged))
10167     return ExprError();
10168 
10169   // Transform the initializer (if any).
10170   Expr *OldInit = E->getInitializer();
10171   ExprResult NewInit;
10172   if (OldInit)
10173     NewInit = getDerived().TransformInitializer(OldInit, true);
10174   if (NewInit.isInvalid())
10175     return ExprError();
10176 
10177   // Transform new operator and delete operator.
10178   FunctionDecl *OperatorNew = nullptr;
10179   if (E->getOperatorNew()) {
10180     OperatorNew = cast_or_null<FunctionDecl>(
10181         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10182     if (!OperatorNew)
10183       return ExprError();
10184   }
10185 
10186   FunctionDecl *OperatorDelete = nullptr;
10187   if (E->getOperatorDelete()) {
10188     OperatorDelete = cast_or_null<FunctionDecl>(
10189         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10190     if (!OperatorDelete)
10191       return ExprError();
10192   }
10193 
10194   if (!getDerived().AlwaysRebuild() &&
10195       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10196       ArraySize.get() == E->getArraySize() &&
10197       NewInit.get() == OldInit &&
10198       OperatorNew == E->getOperatorNew() &&
10199       OperatorDelete == E->getOperatorDelete() &&
10200       !ArgumentChanged) {
10201     // Mark any declarations we need as referenced.
10202     // FIXME: instantiation-specific.
10203     if (OperatorNew)
10204       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10205     if (OperatorDelete)
10206       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10207 
10208     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10209       QualType ElementType
10210         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10211       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10212         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10213         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10214           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10215         }
10216       }
10217     }
10218 
10219     return E;
10220   }
10221 
10222   QualType AllocType = AllocTypeInfo->getType();
10223   if (!ArraySize.get()) {
10224     // If no array size was specified, but the new expression was
10225     // instantiated with an array type (e.g., "new T" where T is
10226     // instantiated with "int[4]"), extract the outer bound from the
10227     // array type as our array size. We do this with constant and
10228     // dependently-sized array types.
10229     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10230     if (!ArrayT) {
10231       // Do nothing
10232     } else if (const ConstantArrayType *ConsArrayT
10233                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10234       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10235                                          SemaRef.Context.getSizeType(),
10236                                          /*FIXME:*/ E->getBeginLoc());
10237       AllocType = ConsArrayT->getElementType();
10238     } else if (const DependentSizedArrayType *DepArrayT
10239                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10240       if (DepArrayT->getSizeExpr()) {
10241         ArraySize = DepArrayT->getSizeExpr();
10242         AllocType = DepArrayT->getElementType();
10243       }
10244     }
10245   }
10246 
10247   return getDerived().RebuildCXXNewExpr(
10248       E->getBeginLoc(), E->isGlobalNew(),
10249       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10250       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10251       AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get());
10252 }
10253 
10254 template<typename Derived>
10255 ExprResult
10256 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10257   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10258   if (Operand.isInvalid())
10259     return ExprError();
10260 
10261   // Transform the delete operator, if known.
10262   FunctionDecl *OperatorDelete = nullptr;
10263   if (E->getOperatorDelete()) {
10264     OperatorDelete = cast_or_null<FunctionDecl>(
10265         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10266     if (!OperatorDelete)
10267       return ExprError();
10268   }
10269 
10270   if (!getDerived().AlwaysRebuild() &&
10271       Operand.get() == E->getArgument() &&
10272       OperatorDelete == E->getOperatorDelete()) {
10273     // Mark any declarations we need as referenced.
10274     // FIXME: instantiation-specific.
10275     if (OperatorDelete)
10276       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10277 
10278     if (!E->getArgument()->isTypeDependent()) {
10279       QualType Destroyed = SemaRef.Context.getBaseElementType(
10280                                                          E->getDestroyedType());
10281       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10282         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10283         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
10284                                        SemaRef.LookupDestructor(Record));
10285       }
10286     }
10287 
10288     return E;
10289   }
10290 
10291   return getDerived().RebuildCXXDeleteExpr(
10292       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
10293 }
10294 
10295 template<typename Derived>
10296 ExprResult
10297 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10298                                                      CXXPseudoDestructorExpr *E) {
10299   ExprResult Base = getDerived().TransformExpr(E->getBase());
10300   if (Base.isInvalid())
10301     return ExprError();
10302 
10303   ParsedType ObjectTypePtr;
10304   bool MayBePseudoDestructor = false;
10305   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10306                                               E->getOperatorLoc(),
10307                                         E->isArrow()? tok::arrow : tok::period,
10308                                               ObjectTypePtr,
10309                                               MayBePseudoDestructor);
10310   if (Base.isInvalid())
10311     return ExprError();
10312 
10313   QualType ObjectType = ObjectTypePtr.get();
10314   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10315   if (QualifierLoc) {
10316     QualifierLoc
10317       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10318     if (!QualifierLoc)
10319       return ExprError();
10320   }
10321   CXXScopeSpec SS;
10322   SS.Adopt(QualifierLoc);
10323 
10324   PseudoDestructorTypeStorage Destroyed;
10325   if (E->getDestroyedTypeInfo()) {
10326     TypeSourceInfo *DestroyedTypeInfo
10327       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10328                                                 ObjectType, nullptr, SS);
10329     if (!DestroyedTypeInfo)
10330       return ExprError();
10331     Destroyed = DestroyedTypeInfo;
10332   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10333     // We aren't likely to be able to resolve the identifier down to a type
10334     // now anyway, so just retain the identifier.
10335     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10336                                             E->getDestroyedTypeLoc());
10337   } else {
10338     // Look for a destructor known with the given name.
10339     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10340                                               *E->getDestroyedTypeIdentifier(),
10341                                                 E->getDestroyedTypeLoc(),
10342                                                 /*Scope=*/nullptr,
10343                                                 SS, ObjectTypePtr,
10344                                                 false);
10345     if (!T)
10346       return ExprError();
10347 
10348     Destroyed
10349       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10350                                                  E->getDestroyedTypeLoc());
10351   }
10352 
10353   TypeSourceInfo *ScopeTypeInfo = nullptr;
10354   if (E->getScopeTypeInfo()) {
10355     CXXScopeSpec EmptySS;
10356     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10357                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10358     if (!ScopeTypeInfo)
10359       return ExprError();
10360   }
10361 
10362   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10363                                                      E->getOperatorLoc(),
10364                                                      E->isArrow(),
10365                                                      SS,
10366                                                      ScopeTypeInfo,
10367                                                      E->getColonColonLoc(),
10368                                                      E->getTildeLoc(),
10369                                                      Destroyed);
10370 }
10371 
10372 template <typename Derived>
10373 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10374                                                         bool RequiresADL,
10375                                                         LookupResult &R) {
10376   // Transform all the decls.
10377   bool AllEmptyPacks = true;
10378   for (auto *OldD : Old->decls()) {
10379     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10380     if (!InstD) {
10381       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10382       // This can happen because of dependent hiding.
10383       if (isa<UsingShadowDecl>(OldD))
10384         continue;
10385       else {
10386         R.clear();
10387         return true;
10388       }
10389     }
10390 
10391     // Expand using pack declarations.
10392     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10393     ArrayRef<NamedDecl*> Decls = SingleDecl;
10394     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10395       Decls = UPD->expansions();
10396 
10397     // Expand using declarations.
10398     for (auto *D : Decls) {
10399       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10400         for (auto *SD : UD->shadows())
10401           R.addDecl(SD);
10402       } else {
10403         R.addDecl(D);
10404       }
10405     }
10406 
10407     AllEmptyPacks &= Decls.empty();
10408   };
10409 
10410   // C++ [temp.res]/8.4.2:
10411   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10412   //   a name in the template definition found a using-declaration, but the
10413   //   lookup in the corresponding scope in the instantiation odoes not find
10414   //   any declarations because the using-declaration was a pack expansion and
10415   //   the corresponding pack is empty
10416   if (AllEmptyPacks && !RequiresADL) {
10417     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10418         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
10419     return true;
10420   }
10421 
10422   // Resolve a kind, but don't do any further analysis.  If it's
10423   // ambiguous, the callee needs to deal with it.
10424   R.resolveKind();
10425   return false;
10426 }
10427 
10428 template<typename Derived>
10429 ExprResult
10430 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10431                                                   UnresolvedLookupExpr *Old) {
10432   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10433                  Sema::LookupOrdinaryName);
10434 
10435   // Transform the declaration set.
10436   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10437     return ExprError();
10438 
10439   // Rebuild the nested-name qualifier, if present.
10440   CXXScopeSpec SS;
10441   if (Old->getQualifierLoc()) {
10442     NestedNameSpecifierLoc QualifierLoc
10443       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10444     if (!QualifierLoc)
10445       return ExprError();
10446 
10447     SS.Adopt(QualifierLoc);
10448   }
10449 
10450   if (Old->getNamingClass()) {
10451     CXXRecordDecl *NamingClass
10452       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10453                                                             Old->getNameLoc(),
10454                                                         Old->getNamingClass()));
10455     if (!NamingClass) {
10456       R.clear();
10457       return ExprError();
10458     }
10459 
10460     R.setNamingClass(NamingClass);
10461   }
10462 
10463   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10464 
10465   // If we have neither explicit template arguments, nor the template keyword,
10466   // it's a normal declaration name or member reference.
10467   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10468     NamedDecl *D = R.getAsSingle<NamedDecl>();
10469     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10470     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10471     // give a good diagnostic.
10472     if (D && D->isCXXInstanceMember()) {
10473       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10474                                                      /*TemplateArgs=*/nullptr,
10475                                                      /*Scope=*/nullptr);
10476     }
10477 
10478     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10479   }
10480 
10481   // If we have template arguments, rebuild them, then rebuild the
10482   // templateid expression.
10483   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10484   if (Old->hasExplicitTemplateArgs() &&
10485       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10486                                               Old->getNumTemplateArgs(),
10487                                               TransArgs)) {
10488     R.clear();
10489     return ExprError();
10490   }
10491 
10492   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10493                                             Old->requiresADL(), &TransArgs);
10494 }
10495 
10496 template<typename Derived>
10497 ExprResult
10498 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10499   bool ArgChanged = false;
10500   SmallVector<TypeSourceInfo *, 4> Args;
10501   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10502     TypeSourceInfo *From = E->getArg(I);
10503     TypeLoc FromTL = From->getTypeLoc();
10504     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10505       TypeLocBuilder TLB;
10506       TLB.reserve(FromTL.getFullDataSize());
10507       QualType To = getDerived().TransformType(TLB, FromTL);
10508       if (To.isNull())
10509         return ExprError();
10510 
10511       if (To == From->getType())
10512         Args.push_back(From);
10513       else {
10514         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10515         ArgChanged = true;
10516       }
10517       continue;
10518     }
10519 
10520     ArgChanged = true;
10521 
10522     // We have a pack expansion. Instantiate it.
10523     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10524     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10525     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10526     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10527 
10528     // Determine whether the set of unexpanded parameter packs can and should
10529     // be expanded.
10530     bool Expand = true;
10531     bool RetainExpansion = false;
10532     Optional<unsigned> OrigNumExpansions =
10533         ExpansionTL.getTypePtr()->getNumExpansions();
10534     Optional<unsigned> NumExpansions = OrigNumExpansions;
10535     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10536                                              PatternTL.getSourceRange(),
10537                                              Unexpanded,
10538                                              Expand, RetainExpansion,
10539                                              NumExpansions))
10540       return ExprError();
10541 
10542     if (!Expand) {
10543       // The transform has determined that we should perform a simple
10544       // transformation on the pack expansion, producing another pack
10545       // expansion.
10546       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10547 
10548       TypeLocBuilder TLB;
10549       TLB.reserve(From->getTypeLoc().getFullDataSize());
10550 
10551       QualType To = getDerived().TransformType(TLB, PatternTL);
10552       if (To.isNull())
10553         return ExprError();
10554 
10555       To = getDerived().RebuildPackExpansionType(To,
10556                                                  PatternTL.getSourceRange(),
10557                                                  ExpansionTL.getEllipsisLoc(),
10558                                                  NumExpansions);
10559       if (To.isNull())
10560         return ExprError();
10561 
10562       PackExpansionTypeLoc ToExpansionTL
10563         = TLB.push<PackExpansionTypeLoc>(To);
10564       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10565       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10566       continue;
10567     }
10568 
10569     // Expand the pack expansion by substituting for each argument in the
10570     // pack(s).
10571     for (unsigned I = 0; I != *NumExpansions; ++I) {
10572       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10573       TypeLocBuilder TLB;
10574       TLB.reserve(PatternTL.getFullDataSize());
10575       QualType To = getDerived().TransformType(TLB, PatternTL);
10576       if (To.isNull())
10577         return ExprError();
10578 
10579       if (To->containsUnexpandedParameterPack()) {
10580         To = getDerived().RebuildPackExpansionType(To,
10581                                                    PatternTL.getSourceRange(),
10582                                                    ExpansionTL.getEllipsisLoc(),
10583                                                    NumExpansions);
10584         if (To.isNull())
10585           return ExprError();
10586 
10587         PackExpansionTypeLoc ToExpansionTL
10588           = TLB.push<PackExpansionTypeLoc>(To);
10589         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10590       }
10591 
10592       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10593     }
10594 
10595     if (!RetainExpansion)
10596       continue;
10597 
10598     // If we're supposed to retain a pack expansion, do so by temporarily
10599     // forgetting the partially-substituted parameter pack.
10600     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10601 
10602     TypeLocBuilder TLB;
10603     TLB.reserve(From->getTypeLoc().getFullDataSize());
10604 
10605     QualType To = getDerived().TransformType(TLB, PatternTL);
10606     if (To.isNull())
10607       return ExprError();
10608 
10609     To = getDerived().RebuildPackExpansionType(To,
10610                                                PatternTL.getSourceRange(),
10611                                                ExpansionTL.getEllipsisLoc(),
10612                                                NumExpansions);
10613     if (To.isNull())
10614       return ExprError();
10615 
10616     PackExpansionTypeLoc ToExpansionTL
10617       = TLB.push<PackExpansionTypeLoc>(To);
10618     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10619     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10620   }
10621 
10622   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10623     return E;
10624 
10625   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
10626                                        E->getEndLoc());
10627 }
10628 
10629 template<typename Derived>
10630 ExprResult
10631 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10632   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10633   if (!T)
10634     return ExprError();
10635 
10636   if (!getDerived().AlwaysRebuild() &&
10637       T == E->getQueriedTypeSourceInfo())
10638     return E;
10639 
10640   ExprResult SubExpr;
10641   {
10642     EnterExpressionEvaluationContext Unevaluated(
10643         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10644     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10645     if (SubExpr.isInvalid())
10646       return ExprError();
10647 
10648     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10649       return E;
10650   }
10651 
10652   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
10653                                             SubExpr.get(), E->getEndLoc());
10654 }
10655 
10656 template<typename Derived>
10657 ExprResult
10658 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10659   ExprResult SubExpr;
10660   {
10661     EnterExpressionEvaluationContext Unevaluated(
10662         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10663     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10664     if (SubExpr.isInvalid())
10665       return ExprError();
10666 
10667     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10668       return E;
10669   }
10670 
10671   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
10672                                              SubExpr.get(), E->getEndLoc());
10673 }
10674 
10675 template <typename Derived>
10676 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10677     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10678     TypeSourceInfo **RecoveryTSI) {
10679   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10680       DRE, AddrTaken, RecoveryTSI);
10681 
10682   // Propagate both errors and recovered types, which return ExprEmpty.
10683   if (!NewDRE.isUsable())
10684     return NewDRE;
10685 
10686   // We got an expr, wrap it up in parens.
10687   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10688     return PE;
10689   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10690                                        PE->getRParen());
10691 }
10692 
10693 template <typename Derived>
10694 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10695     DependentScopeDeclRefExpr *E) {
10696   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10697                                             nullptr);
10698 }
10699 
10700 template<typename Derived>
10701 ExprResult
10702 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10703                                                DependentScopeDeclRefExpr *E,
10704                                                bool IsAddressOfOperand,
10705                                                TypeSourceInfo **RecoveryTSI) {
10706   assert(E->getQualifierLoc());
10707   NestedNameSpecifierLoc QualifierLoc
10708   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10709   if (!QualifierLoc)
10710     return ExprError();
10711   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10712 
10713   // TODO: If this is a conversion-function-id, verify that the
10714   // destination type name (if present) resolves the same way after
10715   // instantiation as it did in the local scope.
10716 
10717   DeclarationNameInfo NameInfo
10718     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10719   if (!NameInfo.getName())
10720     return ExprError();
10721 
10722   if (!E->hasExplicitTemplateArgs()) {
10723     if (!getDerived().AlwaysRebuild() &&
10724         QualifierLoc == E->getQualifierLoc() &&
10725         // Note: it is sufficient to compare the Name component of NameInfo:
10726         // if name has not changed, DNLoc has not changed either.
10727         NameInfo.getName() == E->getDeclName())
10728       return E;
10729 
10730     return getDerived().RebuildDependentScopeDeclRefExpr(
10731         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10732         IsAddressOfOperand, RecoveryTSI);
10733   }
10734 
10735   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10736   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10737                                               E->getNumTemplateArgs(),
10738                                               TransArgs))
10739     return ExprError();
10740 
10741   return getDerived().RebuildDependentScopeDeclRefExpr(
10742       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10743       RecoveryTSI);
10744 }
10745 
10746 template<typename Derived>
10747 ExprResult
10748 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10749   // CXXConstructExprs other than for list-initialization and
10750   // CXXTemporaryObjectExpr are always implicit, so when we have
10751   // a 1-argument construction we just transform that argument.
10752   if ((E->getNumArgs() == 1 ||
10753        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10754       (!getDerived().DropCallArgument(E->getArg(0))) &&
10755       !E->isListInitialization())
10756     return getDerived().TransformExpr(E->getArg(0));
10757 
10758   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
10759 
10760   QualType T = getDerived().TransformType(E->getType());
10761   if (T.isNull())
10762     return ExprError();
10763 
10764   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10765       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
10766   if (!Constructor)
10767     return ExprError();
10768 
10769   bool ArgumentChanged = false;
10770   SmallVector<Expr*, 8> Args;
10771   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10772                                   &ArgumentChanged))
10773     return ExprError();
10774 
10775   if (!getDerived().AlwaysRebuild() &&
10776       T == E->getType() &&
10777       Constructor == E->getConstructor() &&
10778       !ArgumentChanged) {
10779     // Mark the constructor as referenced.
10780     // FIXME: Instantiation-specific
10781     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
10782     return E;
10783   }
10784 
10785   return getDerived().RebuildCXXConstructExpr(
10786       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
10787       E->hadMultipleCandidates(), E->isListInitialization(),
10788       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
10789       E->getConstructionKind(), E->getParenOrBraceRange());
10790 }
10791 
10792 template<typename Derived>
10793 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10794     CXXInheritedCtorInitExpr *E) {
10795   QualType T = getDerived().TransformType(E->getType());
10796   if (T.isNull())
10797     return ExprError();
10798 
10799   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10800       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
10801   if (!Constructor)
10802     return ExprError();
10803 
10804   if (!getDerived().AlwaysRebuild() &&
10805       T == E->getType() &&
10806       Constructor == E->getConstructor()) {
10807     // Mark the constructor as referenced.
10808     // FIXME: Instantiation-specific
10809     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
10810     return E;
10811   }
10812 
10813   return getDerived().RebuildCXXInheritedCtorInitExpr(
10814       T, E->getLocation(), Constructor,
10815       E->constructsVBase(), E->inheritedFromVBase());
10816 }
10817 
10818 /// Transform a C++ temporary-binding expression.
10819 ///
10820 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10821 /// transform the subexpression and return that.
10822 template<typename Derived>
10823 ExprResult
10824 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10825   return getDerived().TransformExpr(E->getSubExpr());
10826 }
10827 
10828 /// Transform a C++ expression that contains cleanups that should
10829 /// be run after the expression is evaluated.
10830 ///
10831 /// Since ExprWithCleanups nodes are implicitly generated, we
10832 /// just transform the subexpression and return that.
10833 template<typename Derived>
10834 ExprResult
10835 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10836   return getDerived().TransformExpr(E->getSubExpr());
10837 }
10838 
10839 template<typename Derived>
10840 ExprResult
10841 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10842                                                     CXXTemporaryObjectExpr *E) {
10843   TypeSourceInfo *T =
10844       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
10845   if (!T)
10846     return ExprError();
10847 
10848   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10849       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
10850   if (!Constructor)
10851     return ExprError();
10852 
10853   bool ArgumentChanged = false;
10854   SmallVector<Expr*, 8> Args;
10855   Args.reserve(E->getNumArgs());
10856   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10857                      &ArgumentChanged))
10858     return ExprError();
10859 
10860   if (!getDerived().AlwaysRebuild() &&
10861       T == E->getTypeSourceInfo() &&
10862       Constructor == E->getConstructor() &&
10863       !ArgumentChanged) {
10864     // FIXME: Instantiation-specific
10865     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
10866     return SemaRef.MaybeBindToTemporary(E);
10867   }
10868 
10869   // FIXME: We should just pass E->isListInitialization(), but we're not
10870   // prepared to handle list-initialization without a child InitListExpr.
10871   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
10872   return getDerived().RebuildCXXTemporaryObjectExpr(
10873       T, LParenLoc, Args, E->getEndLoc(),
10874       /*ListInitialization=*/LParenLoc.isInvalid());
10875 }
10876 
10877 template<typename Derived>
10878 ExprResult
10879 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10880   // Transform any init-capture expressions before entering the scope of the
10881   // lambda body, because they are not semantically within that scope.
10882   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10883   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10884   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10885                                   E->explicit_capture_begin());
10886   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10887                                     CEnd = E->capture_end();
10888        C != CEnd; ++C) {
10889     if (!E->isInitCapture(C))
10890       continue;
10891     EnterExpressionEvaluationContext EEEC(
10892         getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
10893     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10894         C->getCapturedVar()->getInit(),
10895         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10896 
10897     if (NewExprInitResult.isInvalid())
10898       return ExprError();
10899     Expr *NewExprInit = NewExprInitResult.get();
10900 
10901     VarDecl *OldVD = C->getCapturedVar();
10902     QualType NewInitCaptureType =
10903         getSema().buildLambdaInitCaptureInitialization(
10904             C->getLocation(), OldVD->getType()->isReferenceType(),
10905             OldVD->getIdentifier(),
10906             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10907     NewExprInitResult = NewExprInit;
10908     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10909         std::make_pair(NewExprInitResult, NewInitCaptureType);
10910   }
10911 
10912   // Transform the template parameters, and add them to the current
10913   // instantiation scope. The null case is handled correctly.
10914   auto TPL = getDerived().TransformTemplateParameterList(
10915       E->getTemplateParameterList());
10916 
10917   // Transform the type of the original lambda's call operator.
10918   // The transformation MUST be done in the CurrentInstantiationScope since
10919   // it introduces a mapping of the original to the newly created
10920   // transformed parameters.
10921   TypeSourceInfo *NewCallOpTSI = nullptr;
10922   {
10923     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10924     FunctionProtoTypeLoc OldCallOpFPTL =
10925         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10926 
10927     TypeLocBuilder NewCallOpTLBuilder;
10928     SmallVector<QualType, 4> ExceptionStorage;
10929     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10930     QualType NewCallOpType = TransformFunctionProtoType(
10931         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10932         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10933           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10934                                               ExceptionStorage, Changed);
10935         });
10936     if (NewCallOpType.isNull())
10937       return ExprError();
10938     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10939                                                         NewCallOpType);
10940   }
10941 
10942   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10943   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10944   LSI->GLTemplateParameterList = TPL;
10945 
10946   // Create the local class that will describe the lambda.
10947   CXXRecordDecl *Class
10948     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10949                                         NewCallOpTSI,
10950                                         /*KnownDependent=*/false,
10951                                         E->getCaptureDefault());
10952   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10953 
10954   // Build the call operator.
10955   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10956       Class, E->getIntroducerRange(), NewCallOpTSI,
10957       E->getCallOperator()->getEndLoc(),
10958       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10959       E->getCallOperator()->isConstexpr());
10960 
10961   LSI->CallOperator = NewCallOperator;
10962 
10963   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10964        I != NumParams; ++I) {
10965     auto *P = NewCallOperator->getParamDecl(I);
10966     if (P->hasUninstantiatedDefaultArg()) {
10967       EnterExpressionEvaluationContext Eval(
10968           getSema(),
10969           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
10970       ExprResult R = getDerived().TransformExpr(
10971           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10972       P->setDefaultArg(R.get());
10973     }
10974   }
10975 
10976   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10977   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10978 
10979   // Introduce the context of the call operator.
10980   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10981                                  /*NewThisContext*/false);
10982 
10983   // Enter the scope of the lambda.
10984   getSema().buildLambdaScope(LSI, NewCallOperator,
10985                              E->getIntroducerRange(),
10986                              E->getCaptureDefault(),
10987                              E->getCaptureDefaultLoc(),
10988                              E->hasExplicitParameters(),
10989                              E->hasExplicitResultType(),
10990                              E->isMutable());
10991 
10992   bool Invalid = false;
10993 
10994   // Transform captures.
10995   bool FinishedExplicitCaptures = false;
10996   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10997                                  CEnd = E->capture_end();
10998        C != CEnd; ++C) {
10999     // When we hit the first implicit capture, tell Sema that we've finished
11000     // the list of explicit captures.
11001     if (!FinishedExplicitCaptures && C->isImplicit()) {
11002       getSema().finishLambdaExplicitCaptures(LSI);
11003       FinishedExplicitCaptures = true;
11004     }
11005 
11006     // Capturing 'this' is trivial.
11007     if (C->capturesThis()) {
11008       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11009                                     /*BuildAndDiagnose*/ true, nullptr,
11010                                     C->getCaptureKind() == LCK_StarThis);
11011       continue;
11012     }
11013     // Captured expression will be recaptured during captured variables
11014     // rebuilding.
11015     if (C->capturesVLAType())
11016       continue;
11017 
11018     // Rebuild init-captures, including the implied field declaration.
11019     if (E->isInitCapture(C)) {
11020       InitCaptureInfoTy InitExprTypePair =
11021           InitCaptureExprsAndTypes[C - E->capture_begin()];
11022       ExprResult Init = InitExprTypePair.first;
11023       QualType InitQualType = InitExprTypePair.second;
11024       if (Init.isInvalid() || InitQualType.isNull()) {
11025         Invalid = true;
11026         continue;
11027       }
11028       VarDecl *OldVD = C->getCapturedVar();
11029       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11030           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
11031           OldVD->getInitStyle(), Init.get());
11032       if (!NewVD)
11033         Invalid = true;
11034       else {
11035         getDerived().transformedLocalDecl(OldVD, NewVD);
11036       }
11037       getSema().buildInitCaptureField(LSI, NewVD);
11038       continue;
11039     }
11040 
11041     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11042 
11043     // Determine the capture kind for Sema.
11044     Sema::TryCaptureKind Kind
11045       = C->isImplicit()? Sema::TryCapture_Implicit
11046                        : C->getCaptureKind() == LCK_ByCopy
11047                            ? Sema::TryCapture_ExplicitByVal
11048                            : Sema::TryCapture_ExplicitByRef;
11049     SourceLocation EllipsisLoc;
11050     if (C->isPackExpansion()) {
11051       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11052       bool ShouldExpand = false;
11053       bool RetainExpansion = false;
11054       Optional<unsigned> NumExpansions;
11055       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11056                                                C->getLocation(),
11057                                                Unexpanded,
11058                                                ShouldExpand, RetainExpansion,
11059                                                NumExpansions)) {
11060         Invalid = true;
11061         continue;
11062       }
11063 
11064       if (ShouldExpand) {
11065         // The transform has determined that we should perform an expansion;
11066         // transform and capture each of the arguments.
11067         // expansion of the pattern. Do so.
11068         VarDecl *Pack = C->getCapturedVar();
11069         for (unsigned I = 0; I != *NumExpansions; ++I) {
11070           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11071           VarDecl *CapturedVar
11072             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11073                                                                Pack));
11074           if (!CapturedVar) {
11075             Invalid = true;
11076             continue;
11077           }
11078 
11079           // Capture the transformed variable.
11080           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11081         }
11082 
11083         // FIXME: Retain a pack expansion if RetainExpansion is true.
11084 
11085         continue;
11086       }
11087 
11088       EllipsisLoc = C->getEllipsisLoc();
11089     }
11090 
11091     // Transform the captured variable.
11092     VarDecl *CapturedVar
11093       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11094                                                          C->getCapturedVar()));
11095     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11096       Invalid = true;
11097       continue;
11098     }
11099 
11100     // Capture the transformed variable.
11101     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11102                                  EllipsisLoc);
11103   }
11104   if (!FinishedExplicitCaptures)
11105     getSema().finishLambdaExplicitCaptures(LSI);
11106 
11107   // Enter a new evaluation context to insulate the lambda from any
11108   // cleanups from the enclosing full-expression.
11109   getSema().PushExpressionEvaluationContext(
11110       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11111 
11112   // Instantiate the body of the lambda expression.
11113   StmtResult Body =
11114       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
11115 
11116   // ActOnLambda* will pop the function scope for us.
11117   FuncScopeCleanup.disable();
11118 
11119   if (Body.isInvalid()) {
11120     SavedContext.pop();
11121     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
11122                                /*IsInstantiation=*/true);
11123     return ExprError();
11124   }
11125 
11126   // Copy the LSI before ActOnFinishFunctionBody removes it.
11127   // FIXME: This is dumb. Store the lambda information somewhere that outlives
11128   // the call operator.
11129   auto LSICopy = *LSI;
11130   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
11131                                     /*IsInstantiation*/ true);
11132   SavedContext.pop();
11133 
11134   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
11135                                    &LSICopy);
11136 }
11137 
11138 template<typename Derived>
11139 ExprResult
11140 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
11141                                                   CXXUnresolvedConstructExpr *E) {
11142   TypeSourceInfo *T =
11143       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11144   if (!T)
11145     return ExprError();
11146 
11147   bool ArgumentChanged = false;
11148   SmallVector<Expr*, 8> Args;
11149   Args.reserve(E->arg_size());
11150   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
11151                                   &ArgumentChanged))
11152     return ExprError();
11153 
11154   if (!getDerived().AlwaysRebuild() &&
11155       T == E->getTypeSourceInfo() &&
11156       !ArgumentChanged)
11157     return E;
11158 
11159   // FIXME: we're faking the locations of the commas
11160   return getDerived().RebuildCXXUnresolvedConstructExpr(
11161       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
11162 }
11163 
11164 template<typename Derived>
11165 ExprResult
11166 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
11167                                              CXXDependentScopeMemberExpr *E) {
11168   // Transform the base of the expression.
11169   ExprResult Base((Expr*) nullptr);
11170   Expr *OldBase;
11171   QualType BaseType;
11172   QualType ObjectType;
11173   if (!E->isImplicitAccess()) {
11174     OldBase = E->getBase();
11175     Base = getDerived().TransformExpr(OldBase);
11176     if (Base.isInvalid())
11177       return ExprError();
11178 
11179     // Start the member reference and compute the object's type.
11180     ParsedType ObjectTy;
11181     bool MayBePseudoDestructor = false;
11182     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11183                                                 E->getOperatorLoc(),
11184                                       E->isArrow()? tok::arrow : tok::period,
11185                                                 ObjectTy,
11186                                                 MayBePseudoDestructor);
11187     if (Base.isInvalid())
11188       return ExprError();
11189 
11190     ObjectType = ObjectTy.get();
11191     BaseType = ((Expr*) Base.get())->getType();
11192   } else {
11193     OldBase = nullptr;
11194     BaseType = getDerived().TransformType(E->getBaseType());
11195     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11196   }
11197 
11198   // Transform the first part of the nested-name-specifier that qualifies
11199   // the member name.
11200   NamedDecl *FirstQualifierInScope
11201     = getDerived().TransformFirstQualifierInScope(
11202                                             E->getFirstQualifierFoundInScope(),
11203                                             E->getQualifierLoc().getBeginLoc());
11204 
11205   NestedNameSpecifierLoc QualifierLoc;
11206   if (E->getQualifier()) {
11207     QualifierLoc
11208       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11209                                                      ObjectType,
11210                                                      FirstQualifierInScope);
11211     if (!QualifierLoc)
11212       return ExprError();
11213   }
11214 
11215   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11216 
11217   // TODO: If this is a conversion-function-id, verify that the
11218   // destination type name (if present) resolves the same way after
11219   // instantiation as it did in the local scope.
11220 
11221   DeclarationNameInfo NameInfo
11222     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11223   if (!NameInfo.getName())
11224     return ExprError();
11225 
11226   if (!E->hasExplicitTemplateArgs()) {
11227     // This is a reference to a member without an explicitly-specified
11228     // template argument list. Optimize for this common case.
11229     if (!getDerived().AlwaysRebuild() &&
11230         Base.get() == OldBase &&
11231         BaseType == E->getBaseType() &&
11232         QualifierLoc == E->getQualifierLoc() &&
11233         NameInfo.getName() == E->getMember() &&
11234         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11235       return E;
11236 
11237     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11238                                                        BaseType,
11239                                                        E->isArrow(),
11240                                                        E->getOperatorLoc(),
11241                                                        QualifierLoc,
11242                                                        TemplateKWLoc,
11243                                                        FirstQualifierInScope,
11244                                                        NameInfo,
11245                                                        /*TemplateArgs*/nullptr);
11246   }
11247 
11248   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11249   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11250                                               E->getNumTemplateArgs(),
11251                                               TransArgs))
11252     return ExprError();
11253 
11254   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11255                                                      BaseType,
11256                                                      E->isArrow(),
11257                                                      E->getOperatorLoc(),
11258                                                      QualifierLoc,
11259                                                      TemplateKWLoc,
11260                                                      FirstQualifierInScope,
11261                                                      NameInfo,
11262                                                      &TransArgs);
11263 }
11264 
11265 template<typename Derived>
11266 ExprResult
11267 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11268   // Transform the base of the expression.
11269   ExprResult Base((Expr*) nullptr);
11270   QualType BaseType;
11271   if (!Old->isImplicitAccess()) {
11272     Base = getDerived().TransformExpr(Old->getBase());
11273     if (Base.isInvalid())
11274       return ExprError();
11275     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11276                                                      Old->isArrow());
11277     if (Base.isInvalid())
11278       return ExprError();
11279     BaseType = Base.get()->getType();
11280   } else {
11281     BaseType = getDerived().TransformType(Old->getBaseType());
11282   }
11283 
11284   NestedNameSpecifierLoc QualifierLoc;
11285   if (Old->getQualifierLoc()) {
11286     QualifierLoc
11287     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11288     if (!QualifierLoc)
11289       return ExprError();
11290   }
11291 
11292   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11293 
11294   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11295                  Sema::LookupOrdinaryName);
11296 
11297   // Transform the declaration set.
11298   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11299     return ExprError();
11300 
11301   // Determine the naming class.
11302   if (Old->getNamingClass()) {
11303     CXXRecordDecl *NamingClass
11304       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11305                                                           Old->getMemberLoc(),
11306                                                         Old->getNamingClass()));
11307     if (!NamingClass)
11308       return ExprError();
11309 
11310     R.setNamingClass(NamingClass);
11311   }
11312 
11313   TemplateArgumentListInfo TransArgs;
11314   if (Old->hasExplicitTemplateArgs()) {
11315     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11316     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11317     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11318                                                 Old->getNumTemplateArgs(),
11319                                                 TransArgs))
11320       return ExprError();
11321   }
11322 
11323   // FIXME: to do this check properly, we will need to preserve the
11324   // first-qualifier-in-scope here, just in case we had a dependent
11325   // base (and therefore couldn't do the check) and a
11326   // nested-name-qualifier (and therefore could do the lookup).
11327   NamedDecl *FirstQualifierInScope = nullptr;
11328 
11329   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11330                                                   BaseType,
11331                                                   Old->getOperatorLoc(),
11332                                                   Old->isArrow(),
11333                                                   QualifierLoc,
11334                                                   TemplateKWLoc,
11335                                                   FirstQualifierInScope,
11336                                                   R,
11337                                               (Old->hasExplicitTemplateArgs()
11338                                                   ? &TransArgs : nullptr));
11339 }
11340 
11341 template<typename Derived>
11342 ExprResult
11343 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11344   EnterExpressionEvaluationContext Unevaluated(
11345       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11346   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11347   if (SubExpr.isInvalid())
11348     return ExprError();
11349 
11350   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11351     return E;
11352 
11353   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11354 }
11355 
11356 template<typename Derived>
11357 ExprResult
11358 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11359   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11360   if (Pattern.isInvalid())
11361     return ExprError();
11362 
11363   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11364     return E;
11365 
11366   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11367                                            E->getNumExpansions());
11368 }
11369 
11370 template<typename Derived>
11371 ExprResult
11372 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11373   // If E is not value-dependent, then nothing will change when we transform it.
11374   // Note: This is an instantiation-centric view.
11375   if (!E->isValueDependent())
11376     return E;
11377 
11378   EnterExpressionEvaluationContext Unevaluated(
11379       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11380 
11381   ArrayRef<TemplateArgument> PackArgs;
11382   TemplateArgument ArgStorage;
11383 
11384   // Find the argument list to transform.
11385   if (E->isPartiallySubstituted()) {
11386     PackArgs = E->getPartialArguments();
11387   } else if (E->isValueDependent()) {
11388     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11389     bool ShouldExpand = false;
11390     bool RetainExpansion = false;
11391     Optional<unsigned> NumExpansions;
11392     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11393                                              Unexpanded,
11394                                              ShouldExpand, RetainExpansion,
11395                                              NumExpansions))
11396       return ExprError();
11397 
11398     // If we need to expand the pack, build a template argument from it and
11399     // expand that.
11400     if (ShouldExpand) {
11401       auto *Pack = E->getPack();
11402       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11403         ArgStorage = getSema().Context.getPackExpansionType(
11404             getSema().Context.getTypeDeclType(TTPD), None);
11405       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11406         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11407       } else {
11408         auto *VD = cast<ValueDecl>(Pack);
11409         ExprResult DRE = getSema().BuildDeclRefExpr(
11410             VD, VD->getType().getNonLValueExprType(getSema().Context),
11411             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
11412             E->getPackLoc());
11413         if (DRE.isInvalid())
11414           return ExprError();
11415         ArgStorage = new (getSema().Context) PackExpansionExpr(
11416             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11417       }
11418       PackArgs = ArgStorage;
11419     }
11420   }
11421 
11422   // If we're not expanding the pack, just transform the decl.
11423   if (!PackArgs.size()) {
11424     auto *Pack = cast_or_null<NamedDecl>(
11425         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11426     if (!Pack)
11427       return ExprError();
11428     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11429                                               E->getPackLoc(),
11430                                               E->getRParenLoc(), None, None);
11431   }
11432 
11433   // Try to compute the result without performing a partial substitution.
11434   Optional<unsigned> Result = 0;
11435   for (const TemplateArgument &Arg : PackArgs) {
11436     if (!Arg.isPackExpansion()) {
11437       Result = *Result + 1;
11438       continue;
11439     }
11440 
11441     TemplateArgumentLoc ArgLoc;
11442     InventTemplateArgumentLoc(Arg, ArgLoc);
11443 
11444     // Find the pattern of the pack expansion.
11445     SourceLocation Ellipsis;
11446     Optional<unsigned> OrigNumExpansions;
11447     TemplateArgumentLoc Pattern =
11448         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11449                                                           OrigNumExpansions);
11450 
11451     // Substitute under the pack expansion. Do not expand the pack (yet).
11452     TemplateArgumentLoc OutPattern;
11453     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11454     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11455                                                /*Uneval*/ true))
11456       return true;
11457 
11458     // See if we can determine the number of arguments from the result.
11459     Optional<unsigned> NumExpansions =
11460         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11461     if (!NumExpansions) {
11462       // No: we must be in an alias template expansion, and we're going to need
11463       // to actually expand the packs.
11464       Result = None;
11465       break;
11466     }
11467 
11468     Result = *Result + *NumExpansions;
11469   }
11470 
11471   // Common case: we could determine the number of expansions without
11472   // substituting.
11473   if (Result)
11474     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11475                                               E->getPackLoc(),
11476                                               E->getRParenLoc(), *Result, None);
11477 
11478   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11479                                                E->getPackLoc());
11480   {
11481     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11482     typedef TemplateArgumentLocInventIterator<
11483         Derived, const TemplateArgument*> PackLocIterator;
11484     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11485                                    PackLocIterator(*this, PackArgs.end()),
11486                                    TransformedPackArgs, /*Uneval*/true))
11487       return ExprError();
11488   }
11489 
11490   // Check whether we managed to fully-expand the pack.
11491   // FIXME: Is it possible for us to do so and not hit the early exit path?
11492   SmallVector<TemplateArgument, 8> Args;
11493   bool PartialSubstitution = false;
11494   for (auto &Loc : TransformedPackArgs.arguments()) {
11495     Args.push_back(Loc.getArgument());
11496     if (Loc.getArgument().isPackExpansion())
11497       PartialSubstitution = true;
11498   }
11499 
11500   if (PartialSubstitution)
11501     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11502                                               E->getPackLoc(),
11503                                               E->getRParenLoc(), None, Args);
11504 
11505   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11506                                             E->getPackLoc(), E->getRParenLoc(),
11507                                             Args.size(), None);
11508 }
11509 
11510 template<typename Derived>
11511 ExprResult
11512 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11513                                           SubstNonTypeTemplateParmPackExpr *E) {
11514   // Default behavior is to do nothing with this transformation.
11515   return E;
11516 }
11517 
11518 template<typename Derived>
11519 ExprResult
11520 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11521                                           SubstNonTypeTemplateParmExpr *E) {
11522   // Default behavior is to do nothing with this transformation.
11523   return E;
11524 }
11525 
11526 template<typename Derived>
11527 ExprResult
11528 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11529   // Default behavior is to do nothing with this transformation.
11530   return E;
11531 }
11532 
11533 template<typename Derived>
11534 ExprResult
11535 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11536                                                   MaterializeTemporaryExpr *E) {
11537   return getDerived().TransformExpr(E->GetTemporaryExpr());
11538 }
11539 
11540 template<typename Derived>
11541 ExprResult
11542 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11543   Expr *Pattern = E->getPattern();
11544 
11545   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11546   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11547   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11548 
11549   // Determine whether the set of unexpanded parameter packs can and should
11550   // be expanded.
11551   bool Expand = true;
11552   bool RetainExpansion = false;
11553   Optional<unsigned> NumExpansions;
11554   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11555                                            Pattern->getSourceRange(),
11556                                            Unexpanded,
11557                                            Expand, RetainExpansion,
11558                                            NumExpansions))
11559     return true;
11560 
11561   if (!Expand) {
11562     // Do not expand any packs here, just transform and rebuild a fold
11563     // expression.
11564     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11565 
11566     ExprResult LHS =
11567         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11568     if (LHS.isInvalid())
11569       return true;
11570 
11571     ExprResult RHS =
11572         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11573     if (RHS.isInvalid())
11574       return true;
11575 
11576     if (!getDerived().AlwaysRebuild() &&
11577         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11578       return E;
11579 
11580     return getDerived().RebuildCXXFoldExpr(
11581         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11582         RHS.get(), E->getEndLoc());
11583   }
11584 
11585   // The transform has determined that we should perform an elementwise
11586   // expansion of the pattern. Do so.
11587   ExprResult Result = getDerived().TransformExpr(E->getInit());
11588   if (Result.isInvalid())
11589     return true;
11590   bool LeftFold = E->isLeftFold();
11591 
11592   // If we're retaining an expansion for a right fold, it is the innermost
11593   // component and takes the init (if any).
11594   if (!LeftFold && RetainExpansion) {
11595     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11596 
11597     ExprResult Out = getDerived().TransformExpr(Pattern);
11598     if (Out.isInvalid())
11599       return true;
11600 
11601     Result = getDerived().RebuildCXXFoldExpr(
11602         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11603         Result.get(), E->getEndLoc());
11604     if (Result.isInvalid())
11605       return true;
11606   }
11607 
11608   for (unsigned I = 0; I != *NumExpansions; ++I) {
11609     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11610         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11611     ExprResult Out = getDerived().TransformExpr(Pattern);
11612     if (Out.isInvalid())
11613       return true;
11614 
11615     if (Out.get()->containsUnexpandedParameterPack()) {
11616       // We still have a pack; retain a pack expansion for this slice.
11617       Result = getDerived().RebuildCXXFoldExpr(
11618           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
11619           E->getOperator(), E->getEllipsisLoc(),
11620           LeftFold ? Out.get() : Result.get(), E->getEndLoc());
11621     } else if (Result.isUsable()) {
11622       // We've got down to a single element; build a binary operator.
11623       Result = getDerived().RebuildBinaryOperator(
11624           E->getEllipsisLoc(), E->getOperator(),
11625           LeftFold ? Result.get() : Out.get(),
11626           LeftFold ? Out.get() : Result.get());
11627     } else
11628       Result = Out;
11629 
11630     if (Result.isInvalid())
11631       return true;
11632   }
11633 
11634   // If we're retaining an expansion for a left fold, it is the outermost
11635   // component and takes the complete expansion so far as its init (if any).
11636   if (LeftFold && RetainExpansion) {
11637     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11638 
11639     ExprResult Out = getDerived().TransformExpr(Pattern);
11640     if (Out.isInvalid())
11641       return true;
11642 
11643     Result = getDerived().RebuildCXXFoldExpr(
11644         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
11645         Out.get(), E->getEndLoc());
11646     if (Result.isInvalid())
11647       return true;
11648   }
11649 
11650   // If we had no init and an empty pack, and we're not retaining an expansion,
11651   // then produce a fallback value or error.
11652   if (Result.isUnset())
11653     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11654                                                 E->getOperator());
11655 
11656   return Result;
11657 }
11658 
11659 template<typename Derived>
11660 ExprResult
11661 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11662     CXXStdInitializerListExpr *E) {
11663   return getDerived().TransformExpr(E->getSubExpr());
11664 }
11665 
11666 template<typename Derived>
11667 ExprResult
11668 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11669   return SemaRef.MaybeBindToTemporary(E);
11670 }
11671 
11672 template<typename Derived>
11673 ExprResult
11674 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11675   return E;
11676 }
11677 
11678 template<typename Derived>
11679 ExprResult
11680 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11681   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11682   if (SubExpr.isInvalid())
11683     return ExprError();
11684 
11685   if (!getDerived().AlwaysRebuild() &&
11686       SubExpr.get() == E->getSubExpr())
11687     return E;
11688 
11689   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11690 }
11691 
11692 template<typename Derived>
11693 ExprResult
11694 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11695   // Transform each of the elements.
11696   SmallVector<Expr *, 8> Elements;
11697   bool ArgChanged = false;
11698   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11699                                   /*IsCall=*/false, Elements, &ArgChanged))
11700     return ExprError();
11701 
11702   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11703     return SemaRef.MaybeBindToTemporary(E);
11704 
11705   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11706                                               Elements.data(),
11707                                               Elements.size());
11708 }
11709 
11710 template<typename Derived>
11711 ExprResult
11712 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11713                                                     ObjCDictionaryLiteral *E) {
11714   // Transform each of the elements.
11715   SmallVector<ObjCDictionaryElement, 8> Elements;
11716   bool ArgChanged = false;
11717   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11718     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11719 
11720     if (OrigElement.isPackExpansion()) {
11721       // This key/value element is a pack expansion.
11722       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11723       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11724       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11725       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11726 
11727       // Determine whether the set of unexpanded parameter packs can
11728       // and should be expanded.
11729       bool Expand = true;
11730       bool RetainExpansion = false;
11731       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11732       Optional<unsigned> NumExpansions = OrigNumExpansions;
11733       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
11734                                OrigElement.Value->getEndLoc());
11735       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11736                                                PatternRange, Unexpanded, Expand,
11737                                                RetainExpansion, NumExpansions))
11738         return ExprError();
11739 
11740       if (!Expand) {
11741         // The transform has determined that we should perform a simple
11742         // transformation on the pack expansion, producing another pack
11743         // expansion.
11744         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11745         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11746         if (Key.isInvalid())
11747           return ExprError();
11748 
11749         if (Key.get() != OrigElement.Key)
11750           ArgChanged = true;
11751 
11752         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11753         if (Value.isInvalid())
11754           return ExprError();
11755 
11756         if (Value.get() != OrigElement.Value)
11757           ArgChanged = true;
11758 
11759         ObjCDictionaryElement Expansion = {
11760           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11761         };
11762         Elements.push_back(Expansion);
11763         continue;
11764       }
11765 
11766       // Record right away that the argument was changed.  This needs
11767       // to happen even if the array expands to nothing.
11768       ArgChanged = true;
11769 
11770       // The transform has determined that we should perform an elementwise
11771       // expansion of the pattern. Do so.
11772       for (unsigned I = 0; I != *NumExpansions; ++I) {
11773         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11774         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11775         if (Key.isInvalid())
11776           return ExprError();
11777 
11778         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11779         if (Value.isInvalid())
11780           return ExprError();
11781 
11782         ObjCDictionaryElement Element = {
11783           Key.get(), Value.get(), SourceLocation(), NumExpansions
11784         };
11785 
11786         // If any unexpanded parameter packs remain, we still have a
11787         // pack expansion.
11788         // FIXME: Can this really happen?
11789         if (Key.get()->containsUnexpandedParameterPack() ||
11790             Value.get()->containsUnexpandedParameterPack())
11791           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11792 
11793         Elements.push_back(Element);
11794       }
11795 
11796       // FIXME: Retain a pack expansion if RetainExpansion is true.
11797 
11798       // We've finished with this pack expansion.
11799       continue;
11800     }
11801 
11802     // Transform and check key.
11803     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11804     if (Key.isInvalid())
11805       return ExprError();
11806 
11807     if (Key.get() != OrigElement.Key)
11808       ArgChanged = true;
11809 
11810     // Transform and check value.
11811     ExprResult Value
11812       = getDerived().TransformExpr(OrigElement.Value);
11813     if (Value.isInvalid())
11814       return ExprError();
11815 
11816     if (Value.get() != OrigElement.Value)
11817       ArgChanged = true;
11818 
11819     ObjCDictionaryElement Element = {
11820       Key.get(), Value.get(), SourceLocation(), None
11821     };
11822     Elements.push_back(Element);
11823   }
11824 
11825   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11826     return SemaRef.MaybeBindToTemporary(E);
11827 
11828   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11829                                                    Elements);
11830 }
11831 
11832 template<typename Derived>
11833 ExprResult
11834 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11835   TypeSourceInfo *EncodedTypeInfo
11836     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11837   if (!EncodedTypeInfo)
11838     return ExprError();
11839 
11840   if (!getDerived().AlwaysRebuild() &&
11841       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11842     return E;
11843 
11844   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11845                                             EncodedTypeInfo,
11846                                             E->getRParenLoc());
11847 }
11848 
11849 template<typename Derived>
11850 ExprResult TreeTransform<Derived>::
11851 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11852   // This is a kind of implicit conversion, and it needs to get dropped
11853   // and recomputed for the same general reasons that ImplicitCastExprs
11854   // do, as well a more specific one: this expression is only valid when
11855   // it appears *immediately* as an argument expression.
11856   return getDerived().TransformExpr(E->getSubExpr());
11857 }
11858 
11859 template<typename Derived>
11860 ExprResult TreeTransform<Derived>::
11861 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11862   TypeSourceInfo *TSInfo
11863     = getDerived().TransformType(E->getTypeInfoAsWritten());
11864   if (!TSInfo)
11865     return ExprError();
11866 
11867   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11868   if (Result.isInvalid())
11869     return ExprError();
11870 
11871   if (!getDerived().AlwaysRebuild() &&
11872       TSInfo == E->getTypeInfoAsWritten() &&
11873       Result.get() == E->getSubExpr())
11874     return E;
11875 
11876   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11877                                       E->getBridgeKeywordLoc(), TSInfo,
11878                                       Result.get());
11879 }
11880 
11881 template <typename Derived>
11882 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11883     ObjCAvailabilityCheckExpr *E) {
11884   return E;
11885 }
11886 
11887 template<typename Derived>
11888 ExprResult
11889 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11890   // Transform arguments.
11891   bool ArgChanged = false;
11892   SmallVector<Expr*, 8> Args;
11893   Args.reserve(E->getNumArgs());
11894   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11895                                   &ArgChanged))
11896     return ExprError();
11897 
11898   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11899     // Class message: transform the receiver type.
11900     TypeSourceInfo *ReceiverTypeInfo
11901       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11902     if (!ReceiverTypeInfo)
11903       return ExprError();
11904 
11905     // If nothing changed, just retain the existing message send.
11906     if (!getDerived().AlwaysRebuild() &&
11907         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11908       return SemaRef.MaybeBindToTemporary(E);
11909 
11910     // Build a new class message send.
11911     SmallVector<SourceLocation, 16> SelLocs;
11912     E->getSelectorLocs(SelLocs);
11913     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11914                                                E->getSelector(),
11915                                                SelLocs,
11916                                                E->getMethodDecl(),
11917                                                E->getLeftLoc(),
11918                                                Args,
11919                                                E->getRightLoc());
11920   }
11921   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11922            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11923     if (!E->getMethodDecl())
11924       return ExprError();
11925 
11926     // Build a new class message send to 'super'.
11927     SmallVector<SourceLocation, 16> SelLocs;
11928     E->getSelectorLocs(SelLocs);
11929     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11930                                                E->getSelector(),
11931                                                SelLocs,
11932                                                E->getReceiverType(),
11933                                                E->getMethodDecl(),
11934                                                E->getLeftLoc(),
11935                                                Args,
11936                                                E->getRightLoc());
11937   }
11938 
11939   // Instance message: transform the receiver
11940   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11941          "Only class and instance messages may be instantiated");
11942   ExprResult Receiver
11943     = getDerived().TransformExpr(E->getInstanceReceiver());
11944   if (Receiver.isInvalid())
11945     return ExprError();
11946 
11947   // If nothing changed, just retain the existing message send.
11948   if (!getDerived().AlwaysRebuild() &&
11949       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11950     return SemaRef.MaybeBindToTemporary(E);
11951 
11952   // Build a new instance message send.
11953   SmallVector<SourceLocation, 16> SelLocs;
11954   E->getSelectorLocs(SelLocs);
11955   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11956                                              E->getSelector(),
11957                                              SelLocs,
11958                                              E->getMethodDecl(),
11959                                              E->getLeftLoc(),
11960                                              Args,
11961                                              E->getRightLoc());
11962 }
11963 
11964 template<typename Derived>
11965 ExprResult
11966 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11967   return E;
11968 }
11969 
11970 template<typename Derived>
11971 ExprResult
11972 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11973   return E;
11974 }
11975 
11976 template<typename Derived>
11977 ExprResult
11978 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11979   // Transform the base expression.
11980   ExprResult Base = getDerived().TransformExpr(E->getBase());
11981   if (Base.isInvalid())
11982     return ExprError();
11983 
11984   // We don't need to transform the ivar; it will never change.
11985 
11986   // If nothing changed, just retain the existing expression.
11987   if (!getDerived().AlwaysRebuild() &&
11988       Base.get() == E->getBase())
11989     return E;
11990 
11991   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11992                                              E->getLocation(),
11993                                              E->isArrow(), E->isFreeIvar());
11994 }
11995 
11996 template<typename Derived>
11997 ExprResult
11998 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11999   // 'super' and types never change. Property never changes. Just
12000   // retain the existing expression.
12001   if (!E->isObjectReceiver())
12002     return E;
12003 
12004   // Transform the base expression.
12005   ExprResult Base = getDerived().TransformExpr(E->getBase());
12006   if (Base.isInvalid())
12007     return ExprError();
12008 
12009   // We don't need to transform the property; it will never change.
12010 
12011   // If nothing changed, just retain the existing expression.
12012   if (!getDerived().AlwaysRebuild() &&
12013       Base.get() == E->getBase())
12014     return E;
12015 
12016   if (E->isExplicitProperty())
12017     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12018                                                    E->getExplicitProperty(),
12019                                                    E->getLocation());
12020 
12021   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12022                                                  SemaRef.Context.PseudoObjectTy,
12023                                                  E->getImplicitPropertyGetter(),
12024                                                  E->getImplicitPropertySetter(),
12025                                                  E->getLocation());
12026 }
12027 
12028 template<typename Derived>
12029 ExprResult
12030 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12031   // Transform the base expression.
12032   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12033   if (Base.isInvalid())
12034     return ExprError();
12035 
12036   // Transform the key expression.
12037   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12038   if (Key.isInvalid())
12039     return ExprError();
12040 
12041   // If nothing changed, just retain the existing expression.
12042   if (!getDerived().AlwaysRebuild() &&
12043       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12044     return E;
12045 
12046   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
12047                                                   Base.get(), Key.get(),
12048                                                   E->getAtIndexMethodDecl(),
12049                                                   E->setAtIndexMethodDecl());
12050 }
12051 
12052 template<typename Derived>
12053 ExprResult
12054 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12055   // Transform the base expression.
12056   ExprResult Base = getDerived().TransformExpr(E->getBase());
12057   if (Base.isInvalid())
12058     return ExprError();
12059 
12060   // If nothing changed, just retain the existing expression.
12061   if (!getDerived().AlwaysRebuild() &&
12062       Base.get() == E->getBase())
12063     return E;
12064 
12065   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12066                                          E->getOpLoc(),
12067                                          E->isArrow());
12068 }
12069 
12070 template<typename Derived>
12071 ExprResult
12072 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
12073   bool ArgumentChanged = false;
12074   SmallVector<Expr*, 8> SubExprs;
12075   SubExprs.reserve(E->getNumSubExprs());
12076   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12077                                   SubExprs, &ArgumentChanged))
12078     return ExprError();
12079 
12080   if (!getDerived().AlwaysRebuild() &&
12081       !ArgumentChanged)
12082     return E;
12083 
12084   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
12085                                                SubExprs,
12086                                                E->getRParenLoc());
12087 }
12088 
12089 template<typename Derived>
12090 ExprResult
12091 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
12092   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
12093   if (SrcExpr.isInvalid())
12094     return ExprError();
12095 
12096   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12097   if (!Type)
12098     return ExprError();
12099 
12100   if (!getDerived().AlwaysRebuild() &&
12101       Type == E->getTypeSourceInfo() &&
12102       SrcExpr.get() == E->getSrcExpr())
12103     return E;
12104 
12105   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
12106                                                SrcExpr.get(), Type,
12107                                                E->getRParenLoc());
12108 }
12109 
12110 template<typename Derived>
12111 ExprResult
12112 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
12113   BlockDecl *oldBlock = E->getBlockDecl();
12114 
12115   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
12116   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
12117 
12118   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
12119   blockScope->TheDecl->setBlockMissingReturnType(
12120                          oldBlock->blockMissingReturnType());
12121 
12122   SmallVector<ParmVarDecl*, 4> params;
12123   SmallVector<QualType, 4> paramTypes;
12124 
12125   const FunctionProtoType *exprFunctionType = E->getFunctionType();
12126 
12127   // Parameter substitution.
12128   Sema::ExtParameterInfoBuilder extParamInfos;
12129   if (getDerived().TransformFunctionTypeParams(
12130           E->getCaretLocation(), oldBlock->parameters(), nullptr,
12131           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
12132           extParamInfos)) {
12133     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12134     return ExprError();
12135   }
12136 
12137   QualType exprResultType =
12138       getDerived().TransformType(exprFunctionType->getReturnType());
12139 
12140   auto epi = exprFunctionType->getExtProtoInfo();
12141   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
12142 
12143   QualType functionType =
12144     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
12145   blockScope->FunctionType = functionType;
12146 
12147   // Set the parameters on the block decl.
12148   if (!params.empty())
12149     blockScope->TheDecl->setParams(params);
12150 
12151   if (!oldBlock->blockMissingReturnType()) {
12152     blockScope->HasImplicitReturnType = false;
12153     blockScope->ReturnType = exprResultType;
12154   }
12155 
12156   // Transform the body
12157   StmtResult body = getDerived().TransformStmt(E->getBody());
12158   if (body.isInvalid()) {
12159     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12160     return ExprError();
12161   }
12162 
12163 #ifndef NDEBUG
12164   // In builds with assertions, make sure that we captured everything we
12165   // captured before.
12166   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
12167     for (const auto &I : oldBlock->captures()) {
12168       VarDecl *oldCapture = I.getVariable();
12169 
12170       // Ignore parameter packs.
12171       if (isa<ParmVarDecl>(oldCapture) &&
12172           cast<ParmVarDecl>(oldCapture)->isParameterPack())
12173         continue;
12174 
12175       VarDecl *newCapture =
12176         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
12177                                                  oldCapture));
12178       assert(blockScope->CaptureMap.count(newCapture));
12179     }
12180     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
12181   }
12182 #endif
12183 
12184   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
12185                                     /*Scope=*/nullptr);
12186 }
12187 
12188 template<typename Derived>
12189 ExprResult
12190 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12191   llvm_unreachable("Cannot transform asType expressions yet");
12192 }
12193 
12194 template<typename Derived>
12195 ExprResult
12196 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12197   QualType RetTy = getDerived().TransformType(E->getType());
12198   bool ArgumentChanged = false;
12199   SmallVector<Expr*, 8> SubExprs;
12200   SubExprs.reserve(E->getNumSubExprs());
12201   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12202                                   SubExprs, &ArgumentChanged))
12203     return ExprError();
12204 
12205   if (!getDerived().AlwaysRebuild() &&
12206       !ArgumentChanged)
12207     return E;
12208 
12209   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12210                                         RetTy, E->getOp(), E->getRParenLoc());
12211 }
12212 
12213 //===----------------------------------------------------------------------===//
12214 // Type reconstruction
12215 //===----------------------------------------------------------------------===//
12216 
12217 template<typename Derived>
12218 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12219                                                     SourceLocation Star) {
12220   return SemaRef.BuildPointerType(PointeeType, Star,
12221                                   getDerived().getBaseEntity());
12222 }
12223 
12224 template<typename Derived>
12225 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12226                                                          SourceLocation Star) {
12227   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12228                                        getDerived().getBaseEntity());
12229 }
12230 
12231 template<typename Derived>
12232 QualType
12233 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12234                                              bool WrittenAsLValue,
12235                                              SourceLocation Sigil) {
12236   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12237                                     Sigil, getDerived().getBaseEntity());
12238 }
12239 
12240 template<typename Derived>
12241 QualType
12242 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12243                                                  QualType ClassType,
12244                                                  SourceLocation Sigil) {
12245   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12246                                         getDerived().getBaseEntity());
12247 }
12248 
12249 template<typename Derived>
12250 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12251            const ObjCTypeParamDecl *Decl,
12252            SourceLocation ProtocolLAngleLoc,
12253            ArrayRef<ObjCProtocolDecl *> Protocols,
12254            ArrayRef<SourceLocation> ProtocolLocs,
12255            SourceLocation ProtocolRAngleLoc) {
12256   return SemaRef.BuildObjCTypeParamType(Decl,
12257                                         ProtocolLAngleLoc, Protocols,
12258                                         ProtocolLocs, ProtocolRAngleLoc,
12259                                         /*FailOnError=*/true);
12260 }
12261 
12262 template<typename Derived>
12263 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12264            QualType BaseType,
12265            SourceLocation Loc,
12266            SourceLocation TypeArgsLAngleLoc,
12267            ArrayRef<TypeSourceInfo *> TypeArgs,
12268            SourceLocation TypeArgsRAngleLoc,
12269            SourceLocation ProtocolLAngleLoc,
12270            ArrayRef<ObjCProtocolDecl *> Protocols,
12271            ArrayRef<SourceLocation> ProtocolLocs,
12272            SourceLocation ProtocolRAngleLoc) {
12273   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12274                                      TypeArgs, TypeArgsRAngleLoc,
12275                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12276                                      ProtocolRAngleLoc,
12277                                      /*FailOnError=*/true);
12278 }
12279 
12280 template<typename Derived>
12281 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12282            QualType PointeeType,
12283            SourceLocation Star) {
12284   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12285 }
12286 
12287 template<typename Derived>
12288 QualType
12289 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12290                                          ArrayType::ArraySizeModifier SizeMod,
12291                                          const llvm::APInt *Size,
12292                                          Expr *SizeExpr,
12293                                          unsigned IndexTypeQuals,
12294                                          SourceRange BracketsRange) {
12295   if (SizeExpr || !Size)
12296     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12297                                   IndexTypeQuals, BracketsRange,
12298                                   getDerived().getBaseEntity());
12299 
12300   QualType Types[] = {
12301     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12302     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12303     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12304   };
12305   const unsigned NumTypes = llvm::array_lengthof(Types);
12306   QualType SizeType;
12307   for (unsigned I = 0; I != NumTypes; ++I)
12308     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12309       SizeType = Types[I];
12310       break;
12311     }
12312 
12313   // Note that we can return a VariableArrayType here in the case where
12314   // the element type was a dependent VariableArrayType.
12315   IntegerLiteral *ArraySize
12316       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12317                                /*FIXME*/BracketsRange.getBegin());
12318   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12319                                 IndexTypeQuals, BracketsRange,
12320                                 getDerived().getBaseEntity());
12321 }
12322 
12323 template<typename Derived>
12324 QualType
12325 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12326                                                  ArrayType::ArraySizeModifier SizeMod,
12327                                                  const llvm::APInt &Size,
12328                                                  unsigned IndexTypeQuals,
12329                                                  SourceRange BracketsRange) {
12330   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12331                                         IndexTypeQuals, BracketsRange);
12332 }
12333 
12334 template<typename Derived>
12335 QualType
12336 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12337                                           ArrayType::ArraySizeModifier SizeMod,
12338                                                  unsigned IndexTypeQuals,
12339                                                    SourceRange BracketsRange) {
12340   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12341                                        IndexTypeQuals, BracketsRange);
12342 }
12343 
12344 template<typename Derived>
12345 QualType
12346 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12347                                           ArrayType::ArraySizeModifier SizeMod,
12348                                                  Expr *SizeExpr,
12349                                                  unsigned IndexTypeQuals,
12350                                                  SourceRange BracketsRange) {
12351   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12352                                        SizeExpr,
12353                                        IndexTypeQuals, BracketsRange);
12354 }
12355 
12356 template<typename Derived>
12357 QualType
12358 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12359                                           ArrayType::ArraySizeModifier SizeMod,
12360                                                        Expr *SizeExpr,
12361                                                        unsigned IndexTypeQuals,
12362                                                    SourceRange BracketsRange) {
12363   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12364                                        SizeExpr,
12365                                        IndexTypeQuals, BracketsRange);
12366 }
12367 
12368 template <typename Derived>
12369 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
12370     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
12371   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
12372                                           AttributeLoc);
12373 }
12374 
12375 template <typename Derived>
12376 QualType
12377 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12378                                           unsigned NumElements,
12379                                           VectorType::VectorKind VecKind) {
12380   // FIXME: semantic checking!
12381   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12382 }
12383 
12384 template <typename Derived>
12385 QualType TreeTransform<Derived>::RebuildDependentVectorType(
12386     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
12387     VectorType::VectorKind VecKind) {
12388   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
12389 }
12390 
12391 template<typename Derived>
12392 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12393                                                       unsigned NumElements,
12394                                                  SourceLocation AttributeLoc) {
12395   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12396                           NumElements, true);
12397   IntegerLiteral *VectorSize
12398     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12399                              AttributeLoc);
12400   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12401 }
12402 
12403 template<typename Derived>
12404 QualType
12405 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12406                                                            Expr *SizeExpr,
12407                                                   SourceLocation AttributeLoc) {
12408   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12409 }
12410 
12411 template<typename Derived>
12412 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12413     QualType T,
12414     MutableArrayRef<QualType> ParamTypes,
12415     const FunctionProtoType::ExtProtoInfo &EPI) {
12416   return SemaRef.BuildFunctionType(T, ParamTypes,
12417                                    getDerived().getBaseLocation(),
12418                                    getDerived().getBaseEntity(),
12419                                    EPI);
12420 }
12421 
12422 template<typename Derived>
12423 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12424   return SemaRef.Context.getFunctionNoProtoType(T);
12425 }
12426 
12427 template<typename Derived>
12428 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12429                                                             Decl *D) {
12430   assert(D && "no decl found");
12431   if (D->isInvalidDecl()) return QualType();
12432 
12433   // FIXME: Doesn't account for ObjCInterfaceDecl!
12434   TypeDecl *Ty;
12435   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12436     // A valid resolved using typename pack expansion decl can have multiple
12437     // UsingDecls, but they must each have exactly one type, and it must be
12438     // the same type in every case. But we must have at least one expansion!
12439     if (UPD->expansions().empty()) {
12440       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12441           << UPD->isCXXClassMember() << UPD;
12442       return QualType();
12443     }
12444 
12445     // We might still have some unresolved types. Try to pick a resolved type
12446     // if we can. The final instantiation will check that the remaining
12447     // unresolved types instantiate to the type we pick.
12448     QualType FallbackT;
12449     QualType T;
12450     for (auto *E : UPD->expansions()) {
12451       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12452       if (ThisT.isNull())
12453         continue;
12454       else if (ThisT->getAs<UnresolvedUsingType>())
12455         FallbackT = ThisT;
12456       else if (T.isNull())
12457         T = ThisT;
12458       else
12459         assert(getSema().Context.hasSameType(ThisT, T) &&
12460                "mismatched resolved types in using pack expansion");
12461     }
12462     return T.isNull() ? FallbackT : T;
12463   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12464     assert(Using->hasTypename() &&
12465            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12466 
12467     // A valid resolved using typename decl points to exactly one type decl.
12468     assert(++Using->shadow_begin() == Using->shadow_end());
12469     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12470   } else {
12471     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12472            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12473     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12474   }
12475 
12476   return SemaRef.Context.getTypeDeclType(Ty);
12477 }
12478 
12479 template<typename Derived>
12480 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12481                                                        SourceLocation Loc) {
12482   return SemaRef.BuildTypeofExprType(E, Loc);
12483 }
12484 
12485 template<typename Derived>
12486 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12487   return SemaRef.Context.getTypeOfType(Underlying);
12488 }
12489 
12490 template<typename Derived>
12491 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12492                                                      SourceLocation Loc) {
12493   return SemaRef.BuildDecltypeType(E, Loc);
12494 }
12495 
12496 template<typename Derived>
12497 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12498                                             UnaryTransformType::UTTKind UKind,
12499                                             SourceLocation Loc) {
12500   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12501 }
12502 
12503 template<typename Derived>
12504 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12505                                                       TemplateName Template,
12506                                              SourceLocation TemplateNameLoc,
12507                                      TemplateArgumentListInfo &TemplateArgs) {
12508   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12509 }
12510 
12511 template<typename Derived>
12512 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12513                                                    SourceLocation KWLoc) {
12514   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12515 }
12516 
12517 template<typename Derived>
12518 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12519                                                  SourceLocation KWLoc,
12520                                                  bool isReadPipe) {
12521   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12522                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12523 }
12524 
12525 template<typename Derived>
12526 TemplateName
12527 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12528                                             bool TemplateKW,
12529                                             TemplateDecl *Template) {
12530   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12531                                                   Template);
12532 }
12533 
12534 template<typename Derived>
12535 TemplateName
12536 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12537                                             SourceLocation TemplateKWLoc,
12538                                             const IdentifierInfo &Name,
12539                                             SourceLocation NameLoc,
12540                                             QualType ObjectType,
12541                                             NamedDecl *FirstQualifierInScope,
12542                                             bool AllowInjectedClassName) {
12543   UnqualifiedId TemplateName;
12544   TemplateName.setIdentifier(&Name, NameLoc);
12545   Sema::TemplateTy Template;
12546   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12547                                        SS, TemplateKWLoc, TemplateName,
12548                                        ParsedType::make(ObjectType),
12549                                        /*EnteringContext=*/false,
12550                                        Template, AllowInjectedClassName);
12551   return Template.get();
12552 }
12553 
12554 template<typename Derived>
12555 TemplateName
12556 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12557                                             SourceLocation TemplateKWLoc,
12558                                             OverloadedOperatorKind Operator,
12559                                             SourceLocation NameLoc,
12560                                             QualType ObjectType,
12561                                             bool AllowInjectedClassName) {
12562   UnqualifiedId Name;
12563   // FIXME: Bogus location information.
12564   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12565   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12566   Sema::TemplateTy Template;
12567   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12568                                        SS, TemplateKWLoc, Name,
12569                                        ParsedType::make(ObjectType),
12570                                        /*EnteringContext=*/false,
12571                                        Template, AllowInjectedClassName);
12572   return Template.get();
12573 }
12574 
12575 template<typename Derived>
12576 ExprResult
12577 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12578                                                    SourceLocation OpLoc,
12579                                                    Expr *OrigCallee,
12580                                                    Expr *First,
12581                                                    Expr *Second) {
12582   Expr *Callee = OrigCallee->IgnoreParenCasts();
12583   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12584 
12585   if (First->getObjectKind() == OK_ObjCProperty) {
12586     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12587     if (BinaryOperator::isAssignmentOp(Opc))
12588       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12589                                                  First, Second);
12590     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12591     if (Result.isInvalid())
12592       return ExprError();
12593     First = Result.get();
12594   }
12595 
12596   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12597     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12598     if (Result.isInvalid())
12599       return ExprError();
12600     Second = Result.get();
12601   }
12602 
12603   // Determine whether this should be a builtin operation.
12604   if (Op == OO_Subscript) {
12605     if (!First->getType()->isOverloadableType() &&
12606         !Second->getType()->isOverloadableType())
12607       return getSema().CreateBuiltinArraySubscriptExpr(
12608           First, Callee->getBeginLoc(), Second, OpLoc);
12609   } else if (Op == OO_Arrow) {
12610     // -> is never a builtin operation.
12611     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12612   } else if (Second == nullptr || isPostIncDec) {
12613     if (!First->getType()->isOverloadableType() ||
12614         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
12615       // The argument is not of overloadable type, or this is an expression
12616       // of the form &Class::member, so try to create a built-in unary
12617       // operation.
12618       UnaryOperatorKind Opc
12619         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12620 
12621       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12622     }
12623   } else {
12624     if (!First->getType()->isOverloadableType() &&
12625         !Second->getType()->isOverloadableType()) {
12626       // Neither of the arguments is an overloadable type, so try to
12627       // create a built-in binary operation.
12628       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12629       ExprResult Result
12630         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12631       if (Result.isInvalid())
12632         return ExprError();
12633 
12634       return Result;
12635     }
12636   }
12637 
12638   // Compute the transformed set of functions (and function templates) to be
12639   // used during overload resolution.
12640   UnresolvedSet<16> Functions;
12641   bool RequiresADL;
12642 
12643   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12644     Functions.append(ULE->decls_begin(), ULE->decls_end());
12645     // If the overload could not be resolved in the template definition
12646     // (because we had a dependent argument), ADL is performed as part of
12647     // template instantiation.
12648     RequiresADL = ULE->requiresADL();
12649   } else {
12650     // If we've resolved this to a particular non-member function, just call
12651     // that function. If we resolved it to a member function,
12652     // CreateOverloaded* will find that function for us.
12653     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12654     if (!isa<CXXMethodDecl>(ND))
12655       Functions.addDecl(ND);
12656     RequiresADL = false;
12657   }
12658 
12659   // Add any functions found via argument-dependent lookup.
12660   Expr *Args[2] = { First, Second };
12661   unsigned NumArgs = 1 + (Second != nullptr);
12662 
12663   // Create the overloaded operator invocation for unary operators.
12664   if (NumArgs == 1 || isPostIncDec) {
12665     UnaryOperatorKind Opc
12666       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12667     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
12668                                            RequiresADL);
12669   }
12670 
12671   if (Op == OO_Subscript) {
12672     SourceLocation LBrace;
12673     SourceLocation RBrace;
12674 
12675     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12676         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12677         LBrace = SourceLocation::getFromRawEncoding(
12678                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12679         RBrace = SourceLocation::getFromRawEncoding(
12680                     NameLoc.CXXOperatorName.EndOpNameLoc);
12681     } else {
12682       LBrace = Callee->getBeginLoc();
12683       RBrace = OpLoc;
12684     }
12685 
12686     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12687                                                       First, Second);
12688   }
12689 
12690   // Create the overloaded operator invocation for binary operators.
12691   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12692   ExprResult Result = SemaRef.CreateOverloadedBinOp(
12693       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
12694   if (Result.isInvalid())
12695     return ExprError();
12696 
12697   return Result;
12698 }
12699 
12700 template<typename Derived>
12701 ExprResult
12702 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12703                                                      SourceLocation OperatorLoc,
12704                                                        bool isArrow,
12705                                                        CXXScopeSpec &SS,
12706                                                      TypeSourceInfo *ScopeType,
12707                                                        SourceLocation CCLoc,
12708                                                        SourceLocation TildeLoc,
12709                                         PseudoDestructorTypeStorage Destroyed) {
12710   QualType BaseType = Base->getType();
12711   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12712       (!isArrow && !BaseType->getAs<RecordType>()) ||
12713       (isArrow && BaseType->getAs<PointerType>() &&
12714        !BaseType->getAs<PointerType>()->getPointeeType()
12715                                               ->template getAs<RecordType>())){
12716     // This pseudo-destructor expression is still a pseudo-destructor.
12717     return SemaRef.BuildPseudoDestructorExpr(
12718         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12719         CCLoc, TildeLoc, Destroyed);
12720   }
12721 
12722   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12723   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12724                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12725   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12726   NameInfo.setNamedTypeInfo(DestroyedType);
12727 
12728   // The scope type is now known to be a valid nested name specifier
12729   // component. Tack it on to the end of the nested name specifier.
12730   if (ScopeType) {
12731     if (!ScopeType->getType()->getAs<TagType>()) {
12732       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12733                      diag::err_expected_class_or_namespace)
12734           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12735       return ExprError();
12736     }
12737     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12738               CCLoc);
12739   }
12740 
12741   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12742   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12743                                             OperatorLoc, isArrow,
12744                                             SS, TemplateKWLoc,
12745                                             /*FIXME: FirstQualifier*/ nullptr,
12746                                             NameInfo,
12747                                             /*TemplateArgs*/ nullptr,
12748                                             /*S*/nullptr);
12749 }
12750 
12751 template<typename Derived>
12752 StmtResult
12753 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12754   SourceLocation Loc = S->getBeginLoc();
12755   CapturedDecl *CD = S->getCapturedDecl();
12756   unsigned NumParams = CD->getNumParams();
12757   unsigned ContextParamPos = CD->getContextParamPosition();
12758   SmallVector<Sema::CapturedParamNameType, 4> Params;
12759   for (unsigned I = 0; I < NumParams; ++I) {
12760     if (I != ContextParamPos) {
12761       Params.push_back(
12762              std::make_pair(
12763                   CD->getParam(I)->getName(),
12764                   getDerived().TransformType(CD->getParam(I)->getType())));
12765     } else {
12766       Params.push_back(std::make_pair(StringRef(), QualType()));
12767     }
12768   }
12769   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12770                                      S->getCapturedRegionKind(), Params);
12771   StmtResult Body;
12772   {
12773     Sema::CompoundScopeRAII CompoundScope(getSema());
12774     Body = getDerived().TransformStmt(S->getCapturedStmt());
12775   }
12776 
12777   if (Body.isInvalid()) {
12778     getSema().ActOnCapturedRegionError();
12779     return StmtError();
12780   }
12781 
12782   return getSema().ActOnCapturedRegionEnd(Body.get());
12783 }
12784 
12785 } // end namespace clang
12786 
12787 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12788